在快节奏的商务环境中,每分每秒都至关重要。传统的会议记录方式往往耗时耗力,不仅需要记录者全神贯注地聆听,还需要他们迅速地将语言转化为文字。现在,有了我们的实时语音转文字技术,这一切将成为历史。

我们提供的不仅仅是一个工具,而是一种全新的会议体验。想象一下,当您坐在会议室里,每一位发言者的每一句话都能即时转换成准确的文字记录。无需担心错过任何细节,无需担心记录速度跟不上讲话速度。一切都那么流畅,那么自然。

我们的技术采用先进的语音识别算法,能够适应各种口音和专业术语,确保转写的准确性。无论是正式的商务会议,还是轻松的团队讨论,它都能完美适应,让您的会议记录工作变得轻松而高效。

而且,我们的服务不仅仅局限于会议。讲座、研讨会、采访……任何需要将语音内容转换为文字的场景,我们都能提供帮助。我们的平台易于操作,界面友好,即使是第一次使用的用户也能迅速上手。

在这个信息爆炸的时代,让我们的技术帮助您把握每一次沟通的机会,让信息的传递更加准确无误。选择我们的实时语音转文字服务,让每一次会议都成为效率和成果的双重胜利。

立即体验,开启您的智能会议新时代!

具体实现代码如下:

<template>
  <div class="Meeting-container" style="padding: 10px;margin-bottom:50px; ">
    <!--聊天窗口开始 -->
    <div style="height: 150px;">
                        <textarea v-model="text"
                                  placeholder="请点击长时会议记录,会把会议说的话记录成文字,方便会后整理纪要"
                                  style="height: 560px;width: 100%;padding: 20px; border: none;border-top: 1px solid #ccc;border-bottom: 1px solid #ccc;outline: none">
                        </textarea>
    </div>
    <div style="text-align: left;padding-right: 10px;margin-top:440px;">
      <el-button type="primary" size="medium" @click="voiceSend"><i class="el-icon-microphone"></i>长时会议记录
      </el-button>
      <el-button type="danger" size="medium" @click="stopVoice">停止记录
      </el-button>
    </div>
  </div>
</template>

<script>

// 初始化录音工具,注意目录
let recorder = new Recorder("../../recorder")
recorder.onStart = () => {
  console.log("开始录音了")
}
recorder.onStop = () => {
  console.log("结束录音了")
}
// 发送中间帧和最后一帧
recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {
  if (!isLastFrame && wsFlag) { // 发送中间帧
    wsTask.send(new Int8Array(frameBuffer)) // 执行发送
    // console.log("发送中间帧...")
  } else {
    if (wsFlag) {
      wsTask.send('{"end": true}') // 执行发送最后一帧
    }
  }
}

function toBase64(buffer) {
  let binary = "";
  let bytes = new Uint8Array(buffer);
  let len = bytes.byteLength;
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return window.btoa(binary);
};

let wsFlag = false;
let wsTask = {};
export default {
  name: "Meeting",
  data() {
    return {
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {}, // 获取本地存储用户
      text: "", // 转写结果
      URL: 'wss://rtasr.xfyun.cn/v1/ws', // 实时转写,很多JS文件放到public/raasr下面了
    }
  },
  methods: {
    async stopVoice() {
      if (await this.consumeBalance(this.user, "停止记录")) {
        // 执行具体能力
        recorder.stop();
        this.$message.success("停止记录!")
      }
    },
    async voiceSend() { // 开始语音识别要做的动作
      if (await this.consumeBalance(this.user, "长时会议记录")) {
        // 执行具体能力
        this.text = "";
        await this.wsInit();
      }
    }
    ,
// 建立ws连接
    async wsInit() {
      //  this.iat = "";
      this.$message.success("已开始记录会议...")
      var _this = this;
      console.log("我打印的" + _this.text)
      if (typeof (WebSocket) == 'undefined') {
        console.log('您的浏览器不支持ws...')
      } else {
        console.log('您的浏览器支持ws!!!')
        let reqeustUrl = await _this.getWebSocketUrl()
        wsTask = new WebSocket(reqeustUrl);
        // ws的几个事件,在vue中定义
        wsTask.onopen = function () {
          console.log('ws已经打开...')
          //  _this.res = "开始录音"
          wsFlag = true
          // 下面就可以循环发送中间帧了
          // 开始录音
          console.log("开始录音")
          recorder.start({
            sampleRate: 16000,
            frameSize: 1280,
          });
        }
        wsTask.onmessage = function (message) { // 调用第二个API 自动把语音转成文本
          console.log(JSON.stringify(message.data))
          _this.renderResult(message.data)
        }
        // 关闭事件
        wsTask.onclose = function () {
          console.log('ws已关闭...')
        }
        wsTask.onerror = function () {
          console.log('发生错误...')
        }
      }
    }
    ,
    renderResult(resultData) {
      let jsonData = JSON.parse(resultData);
      if (jsonData.action == "started") {
        // 握手成功
        console.log("握手成功");
      } else if (jsonData.action == "result") {
        const data = JSON.parse(jsonData.data)
        console.log(data)
        // 转写结果
        let resultTextTemp = ""
        data.cn.st.rt.forEach((j) => {
          j.ws.forEach((k) => {
            k.cw.forEach((l) => {
              resultTextTemp += l.w;
            });
          });
        });
        if (data.cn.st.type == 0) {
          // 【最终】识别结果:
          this.text += resultTextTemp;
          resultTextTemp = ""
        }
      } else if (jsonData.action == "error") {
        // 连接发生错误
        console.log("出错了:", jsonData);
      }
    },
// 获取鉴权地址与参数
    getWebSocketUrl() {
      // 请求地址根据语种不同变化
      var appId = atob(this.user.appid);
      var secretKey = "xxx";
      var ts = Math.floor(new Date().getTime() / 1000);
      var signa = hex_md5(appId + ts);
      var signatureSha = CryptoJSNew.HmacSHA1(signa, secretKey);
      var signature = CryptoJS.enc.Base64.stringify(signatureSha);
      signature = encodeURIComponent(signature);
      return `${this.URL}?appid=${appId}&ts=${ts}&signa=${signature}`;
    }
  }
}
</script>

<!--scoped 不能加-->
<style>
</style>

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐