vue项目,实现语音识别文字,前后端交互

这篇具有很好参考价值的文章主要介绍了vue项目,实现语音识别文字,前后端交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近实现一个录音上传功能,并且识别语音转为汉字。


一、js-audio-recorder是什么?

js-audio-recorder是基于第三方的vue插件,实现录音,播放等功能。

二、使用步骤

1.引入库

代码如下(示例):

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'

Vue.use(ElementUI)
Vue.config.productionTip = false

Vue.prototype.$axios = axios

new Vue({
  el:'#app',
  router,
  store,
  render: h => h(App)
}).$mount('#app')

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


3,完整代码

<template>
  <div class="hea1" style="padding: 20px;">
    <h3>录音上传</h3>

    <div style="font-size: 14px">
      <h3>录音时长:{{ recorder && recorder.duration.toFixed(4) }}</h3>
      <el-button type="primary" @click="handleStart">开始录音</el-button>
      <el-button type="info" @click="handlePause">暂停录音</el-button>
      <el-button type="success" @click="handleResume">继续录音</el-button>
      <el-button type="warning" @click="handleStop">停止录音</el-button>
      <br><br>
      <h3>
        播放时长:{{
          recorder &&
          (playTime > recorder.duration
            ? recorder.duration.toFixed(4)
            : playTime.toFixed(4))
        }}
      </h3>
      <audio ref="audios" :src="this.audio" controls ></audio>
      <br />
      <div class="bo">
      <!-- <el-button type="primary" @click="handlePlay">播放录音</el-button>
      <el-button type="info" @click="handlePausePlay">暂停播放</el-button>
      <el-button type="success" @click="handleResumePlay">继续播放</el-button>
      <el-button type="warning" @click="handleStopPlay">停止播放</el-button> -->

      <el-button type="error" @click="handleDestroy">销毁录音</el-button>
      <el-button type="info" @click="downWAV">下载WAV</el-button>
      <el-button type="info" @click="downPCM">下载pcm</el-button>
      <el-button type="primary" @click="uploadRecord">上传</el-button>
      <el-button type="success" @click="getResults">识别结果</el-button>
      </div>

      <br />
      <br />
      <textarea
        name=""
        id="textarea"
        style="width: 100%; height: 100px"
        cols="30"
        rows="10"
        v-model="result"
      />
    </div>
  </div>
</template>

<script>
import Recorder from "js-audio-recorder";
//import MyRecorder from '../js/MyRecorder'
import { v4 as uuidv4 } from "uuid";
import axios from 'axios';
uuidv4();
//const baseURL = "http://10.34.23.133:8899/asr/non_real";

export default {
  data() {
    return {
      recorder: null,
      playTime: 0,
      timer: null,
      src: null,
      sessionId: "",
      audio: "",
      data: "",
      result: "",
    };
  },
  created() {},
  mounted() {
    this.dataRecorder = this.data;
  },
  methods: {
    // 开始录音
    handleStart() {
      const uuid = require("uuid");
      this.sessionId = uuid.v4();
      console.log(this.sessionId);

      this.recorder = new Recorder({
        sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
        sampleRate: 16000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
        numChannels: 1, // 声道,支持 1 或 2, 默认是1
        // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
      });
      console.log(this.recorder)
      Recorder.getPermission().then(
        () => {
          console.log("开始录音");

          this.recorder.start(); // 开始录音
        },
        (error) => {
          this.$message({
            message: "请先允许该网页使用麦克风",
            type: "info",
          });
          console.log(`${error.name} : ${error.message}`);
        }
      );
    },
    handlePause() {
      console.log("暂停录音");
      this.recorder.pause(); // 暂停录音
    },
    handleResume() {
      console.log("恢复录音");
      this.recorder.resume(); // 恢复录音
    },
    handleStop() {
      console.log("停止录音");
      this.recorder.stop(); // 停止录音
      this.handlePlay();  //
    },


    handlePlay() {
      console.log("播放录音");
      console.log(this.recorder);
      const bl=this.recorder.getWAVBlob()
      const r = new FileReader();
      r.readAsArrayBuffer(bl);
      r.onload = (e) => {
        const bufer = e.srcElement.result;
        const b = this.addWavHeader(bufer, 16000, 16, 1);
        this.audio = window.URL.createObjectURL(b);   
};
 

    console.log(this.$refs.audios);
    //  this.recorder.play(); // 播放录音

      // 播放时长
      this.timer = setInterval(() => {
        try {
          this.playTime = this.recorder.getPlayTime();
        } catch (error) {
          this.timer = null;
        }
      }, 100);
    },
addWavHeader(samples, sampleRateTmp, sampleBits, channelCount) {
      const dataLength = samples.byteLength;
      /* 新的buffer类,预留44bytes的heaer空间 */
      const buffer = new ArrayBuffer(44 + dataLength);
      /* 转为 Dataview, 利用API来填充字节 */
      const view = new DataView(buffer);
      let offset = 0;
      /* ChunkID, 4 bytes,  资源交换文件标识符 */
      this.writeString(view, offset, 'RIFF'); offset += 4;
      /* ChunkSize, 4 bytes, 下个地址开始到文件尾总字节数,即文件大小-8 */
      view.setUint32(offset, /* 32 */ 36 + dataLength, true); offset += 4;
      /* Format, 4 bytes, WAV文件标志 */
      this.writeString(view, offset, 'WAVE'); offset += 4;
      /* Subchunk1 ID, 4 bytes, 波形格式标志 */
      this.writeString(view, offset, 'fmt '); offset += 4;
      /* Subchunk1 Size, 4 bytes, 过滤字节,一般为 0x10 = 16 */
      view.setUint32(offset, 16, true); offset += 4;
      /* Audio Format, 2 bytes, 格式类别 (PCM形式采样数据) */
      view.setUint16(offset, 1, true); offset += 2;
      /* Num Channels, 2 bytes,  通道数 */
      view.setUint16(offset, channelCount, true); offset += 2;
      /* SampleRate, 4 bytes, 采样率,每秒样本数,表示每个通道的播放速度 */
      view.setUint32(offset, sampleRateTmp, true); offset += 4;
      /* ByteRate, 4 bytes, 波形数据传输率 (每秒平均字节数) 通道数×每秒数据位数×每样本数据位/8 */
      view.setUint32(offset, sampleRateTmp * channelCount * (sampleBits / 8), true); offset += 4;
      /* BlockAlign, 2 bytes, 快数据调整数 采样一次占用字节数 通道数×每样本的数据位数/8 */
      view.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;
      /* BitsPerSample, 2 bytes, 每样本数据位数 */
      view.setUint16(offset, sampleBits, true); offset += 2;
      /* Subchunk2 ID, 4 bytes, 数据标识符 */
      this.writeString(view, offset, 'data'); offset += 4;
      /* Subchunk2 Size, 4 bytes, 采样数据总数,即数据总大小-44 */
      view.setUint32(offset, dataLength, true); offset += 4;
      if (sampleBits === 16) {
        this.floatTo16BitPCM(view, samples);
      } else if (sampleBits === 8) {
        this.floatTo8BitPCM(view, samples);
      } else {
        this.floatTo32BitPCM(view, samples);
      }
      return new Blob([view], { type: 'audio/wav' });
    },
writeString(view, offset, string) {
      for (let i = 0; i < string.length; i += 1) {
        view.setUint8(offset + i, string.charCodeAt(i));
      }
    },
floatTo32BitPCM(output, input) {
      const oinput = new Int32Array(input);
      let newoffset = 44;
      for (let i = 0; i < oinput.length; i += 1, newoffset += 4) {
        output.setInt32(newoffset, oinput[i], true);
      }
    },
floatTo16BitPCM(output, input) {
      const oinput = new Int16Array(input);
      let newoffset = 44;
      for (let i = 0; i < oinput.length; i += 1, newoffset += 2) {
        output.setInt16(newoffset, oinput[i], true);
      }
    },
floatTo8BitPCM(output, input) {
      const oinput = new Int8Array(input);
      let newoffset = 44;
      for (let i = 0; i < oinput.length; i += 1, newoffset += 1) {
        output.setInt8(newoffset, oinput[i], true);
      }
    },


    handlePausePlay() {
      console.log("暂停播放");
      this.recorder.pausePlay(); // 暂停播放

      // 播放时长
      this.playTime = this.recorder.getPlayTime();
      this.time = null;
    },
    handleResumePlay() {
      console.log("恢复播放");
      this.recorder.resumePlay(); // 恢复播放

      // 播放时长
      this.timer = setInterval(() => {
        try {
          this.playTime = this.recorder.getPlayTime();
        } catch (error) {
          this.timer = null;
        }
      }, 100);
    },
    handleStopPlay() {
      console.log("停止播放");
      this.recorder.stopPlay(); // 停止播放

      // 播放时长
      this.playTime = this.recorder.getPlayTime();
      this.timer = null;
    },
    handleDestroy() {
      console.log("销毁实例");
      this.recorder.destroy(); // 毁实例
      this.timer = null;
    },
    downWAV() {
      this.recorder.downloadWAV("下载wav");
    },
    downPCM() {
      this.recorder.downloadPCM("下载pcm");
    },
    uploadRecord() {
      if (this.recorder == null || this.recorder.duration === 0) {
        this.$message({
          message: "请先录音",
          type: "error",
        });
        return false;
      }
      this.recorder.pause(); // 暂停录音
      this.timer = null;
      console.log("上传录音"); // 上传录音

      const formData = new FormData();
      const blob = this.recorder.getWAVBlob(); // 获取wav格式音频数据
      console.log(blob);
      // 此处获取到blob对象后需要设置fileName满足当前项目上传需求,可直接传把blob作为file塞入formData
      const newbolb = new Blob([blob], { type: "audio/wav" });
      const fileOfBlob = new File([newbolb], new Date().getTime() + ".wav");
      console.log(fileOfBlob);
      formData.append("file", blob);
      console.log(formData);
      const url = window.URL.createObjectURL(fileOfBlob);
      this.src = url;
      console.log(url);
      this.$axios({
        url:'https://10.45.192.42:8899/asr/non_real/putAudio?asrType=non_real&sessionId=' + this.sessionId ,
        //url: this.baseURL + '/putAudio?asrType=non_real&sessionId=' + this.sessionID,
        method: "post",
        headers: {
          "Content-Type": "multipart/form-data",
        },
        data: formData,
      }).then(function (res) {
        if (res.data == 200) {
          alert("上传完成可以识别");
        } else {
          alert("上传失败请重试");
        }
      });
    },
    //识别结果
    getResults() {
      console.log("识别结果");
      this.$axios({
         url:"https://10.85.134.230:8899/asr/non_real/getResult",
        method: "get",
        params: {
          sessionId: this.sessionId,
        }
      }).then((response) => (this.result = response.data));

    },
  },
};
</script>
<style scoped>
.hea1 {
  line-height: 20px;
}
.bo {
  display: flex;
  justify-content: space-between;
  flex:1
}
</style>

总结

前端调用js-audio-recorder使用封装好的功能比较方便,但是在与后端对接过程,要把语音音频传给后端,再返回识别结果也会遇到很多困难,重要的是要多查资料,积极沟通。文章来源地址https://www.toymoban.com/news/detail-526721.html

到了这里,关于vue项目,实现语音识别文字,前后端交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【项目管理】Java离线版语音识别-语音转文字

    系统:Win10 Java:1.8.0_333 IDEA:2020.3.4 Gitee: https://gitee.com/lijinjiang01/SpeechRecognition 最近在做一个鬼畜视频的时候,需要处理大量语音文件,全部都是 wav 格式的,然后我想把这些语音转成文字,不过这些语音有几千条,这时候我就想能不能用 Java 实现。 不过现在主流的语音识别

    2024年02月04日
    浏览(39)
  • SpringBoot整合hdfs,实现文件上传下载删除与批量删除,以及vue前端发送请求,实现前后端交互功能;

    部分工具类代码参考文章:https://blog.csdn.net/qq_27242695/article/details/119683823 前端实现效果 HDFSController HDFS FileInterface (文件接口) HDFS FileImplService (文件接口实现类) HDFSConfig(从yaml读取文件) HDFSUTils 前端vue代码:

    2024年02月16日
    浏览(62)
  • uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)uniapp小程序使用文字转语音播报类似支付宝收款播报小程序语音识别和朗读)

    uni-app/vue 文字转语音朗读(小程序语音识别和朗读) 一、第一种方式:直接加语音包 固定的文本 先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了 这里用到的工具:知意配音 链接地址:https://peiyin.wozhiyi.com/newproduction.html 接下来,代码部分。 在min.js文件里加

    2024年02月07日
    浏览(35)
  • uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)

        语音播报的实现的方法有很多种,我这里介绍集中不引用百度、阿里或者迅飞的API的实现方式。 一、采用new SpeechSynthesisUtterance的方式 废话不多说直接上代码 方法的结束事件 二、采用speak-tts插件的方式 1、安装speak-tts 2.使用 三、微信小程序可以采用微信提供的插件 1、添

    2024年02月16日
    浏览(35)
  • Java 离线语音识别实现语音转文字

    model下载 我们需要实现离线语音识别,那么就得将模型下载到本地电脑。下载地址为官网的 Models 模块: https://alphacephei.com/vosk/models 我们直接找到 Chinese 分类,这里有 2 个模型 将下载的语言模型包,在下面代码中引入 代码 CommonUtils 注意:以上代码只支持.wav格式的音频文件

    2024年02月05日
    浏览(37)
  • Ubuntu20.04 使用Python实现全过程离线语音识别(包含语音唤醒,语音转文字,指令识别,文字转语音)

      因为手头有一个项目,该项目需要在香橙派上实现语音控制,并且带有语音唤醒功能。简单来说,就是通过唤醒词唤醒香橙派,然后说出相关指令,香橙派去执行指令。   但是,在弄香橙派的时候,自带的麦克风不好使了,单独进行麦克风测试的时候是好使的,但是程

    2024年02月05日
    浏览(32)
  • JS文字转语音技术实现

    最近在做排队叫号系统,涉及到文字转语音播报,因此总结了几种前端文字转语音发声的方法。 h5新提供的一个原生语音识别技术的API,可以将文本转成语音并播放。 作为官方的api,实现的效果是比较符合理想的,支持的语言种类也很丰富, 就是兼容性上不太友好。下面兼

    2024年02月12日
    浏览(20)
  • vue+face-api.js实现前端人脸识别功能

    近期做了一个前端vue实现人脸识别的功能,主要功能逻辑包含:人脸识别,人脸验证,唤起摄像头视频流之后从三个事件(用户点头、摇头、眨眼睛)中随机选中两个事件,待两个事件通过判断后人脸静止不动3秒钟后截取视频流生成图片,上传到阿里或者腾讯oss,通过oss返回

    2024年02月05日
    浏览(26)
  • 树莓派Linux实现ChatGPT语音交互(语音识别,TTS)

    ChatGPT使用想必大家都不陌生,进入官网,注册账号即可开始正式的对话聊天,可是如何使用ChatGPT API,且在Linux环境下进行语音交互呢?碰巧在今年暑期参加物联网设计竞赛有用到这项功能,今天就来教下大家详细步骤。 如何获取一个ChatGPT账号相比对大家来说不是一件难事,

    2024年02月08日
    浏览(28)
  • 【实用技巧】用Vue.js实现智能家居控制系统的前端交互,提高系统的稳定性

    作者:禅与计算机程序设计艺术 【实用技巧】用Vue.js实现智能家居控制系统的前端交互,提高系统的稳定性 1.1. 背景介绍 随着科技的快速发展,智能家居系统越来越受到人们的青睐。智能家居系统不仅能够提高人们的生活质量,还能节约能源、降低家庭开支。然而,智能家

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包