当前位置: 首页 > 后端技术 > Node.js

语音识别——将前端录音传给后台语音识别

时间:2023-04-03 12:18:08 Node.js

实现前端录音,并将音频blob传输到服务器,然后服务器使用百度AI语音识别将结果返回给前端。更多内容请关注GitHub。上一篇是演示百度AI语音识别NodejsSDK版,并将识别结果返回给前端显示。这里是一段完整的前端录音,然后将压缩后的音频对象Blob传给服务器,在服务器端使用百度AI语音识别,最后将识别结果返回给前端显示。本文调用第三方库Recorder.js,如何调用这个库在HTML5中抓取WAV音频上传到服务器或者下载到本地,可以查看这篇博客,但是里面说明了上传到PHP服务器,这里我换成了一个基于Node.js的Websocket服务器。这是本博客的语音识别结果:百度语音识别查文档就知道我要的信息了。如果要实现实时语音识别、长时语音、唤醒词功能、语义分析功能,需要使用Android和IOSSDK或者LinuxC++SDK版本,我使用的NodejsSDK不支持它。1、规格参数要求语音时长为60s上线,超过则录音原文件为pcm、wav或amr格式,不区分大小写。推荐使用pcm录音,采样率16000,单声道支持普通话、英语、粤语、四川话项目结构在百度AI平台调用NodejsSDK进行语音识别,具体调用方式可以查看通过查看快速入门文档。首先下载nodejs-sdk,下载完成后将目录下的speech文件夹复制到你的项目文件夹下,其中assets是存放录音音频的地方,然后进入node文件夹下的位置安装依赖包:npminstallMy项目文件夹目录如下:audio_asr_baidu├─package-lock.json└─speech├─.gitignore├─assets│├─16k_test.pcm│└─recorder.wav├─cpp│├─.gitignore│├─README。md│├─build.sh│└─main.cpp└─node├─.gitignore├─README.md├─index.html├─main.js├─node_modules├─package-lock.json├─包。node文件夹中的json└─style.css和index.html是我的客户端文件,main.js是我的服务端文件。搭建Websocket服务器在main.js文件中搭建websocket服务器,先安装相关依赖模块:npmiws-S然后build:letServer=require('ws').Server;constwss=newServer({port:9001})//连接到服务器wss.on('connection',ws=>{console.log('serverconnected');})ws.on('error',error=>{console.log('Error:'+error);})ws.on('close',()=>{console.log('Websocketisclosed');})})//断开wss.on('disconnection',ws=>{ws.on('message',msg=>{console.log('serverrecivedmsg:'+msg);})})然后在index.html中:让ws=newWebSocket('ws://localhost:9001');ws.onopen=e=>{console.log('Connectiontoserveropened');}启动服务:nodemain.js可以看到这样的打印信息在控制台上://客户端打印信息:Connectiontoserveropened//在服务器上打印信息:serverconnected前端录音客户端实现录音后,将压缩后的音频对象blob发送到服务器:带有记录、停止和暂停功能的简单Recorder.js演示RecordStop

你说:

录音

//连接服务器letws=newWebSocket('ws://localhost:9001');ws.onopen=e=>{console.log('Connectiontoserveropened');}URL=window.URL||window.webkitURL;vargumStream;//来自getUserMedia()varrec的流;//Recorder.jsobjectvarinput;//MediaStreamAudioSourceNodevarAudioContext=window.AudioContext||window.webkitAudioContext;varaudioContextvarrecordButton=document.getElementById("recordButton");varstopButton=document.getElementById("stopButton");recordButton.addEventListener("click",startRecording);stopButton.addEventListener("click",stopRecording);//录音函数startRecording(){console.log("recordButtonclicked");varconstraints={audio:true,video:false}recordButton.disabled=true;stopButton.disabled=false;//获取录音权限并开始录音navigator.mediaDevices.getUserMedia(constraints).then(function(stream){console.log("getUserMedia()成功,创建流,初始化Recorder.js...");audioContext=newAudioContext();gumStream=stream;input=audioContext.createMediaStreamSource(stream);rec=newRecorder(input,{numChannels:1//Mono})//开始录音rec.record()console.log("Recordingstarted");}).catch(function(err){recordButton.disabled=false;stopButton.disabled=true;});}//停止记录fufunctionstopRecording(){console.log("stopButtonclicked");stopButton.disabled=true;recordButton.disabled=false;rec.stop();gumStream.getAudioTracks()[0].stop();//创建一个blob对象让它以wav格式下载rec.exportWAV(createDownloadLink);}//从服务器接收消息ws.onmessage=e=>{console.log(e.data);setTimeout(()=>{document.getElementById("out-txt").innerHTML+=e.data},3000);}//创建下载链接functioncreateDownloadLink(blob){console.log(blob);ws.send(blob);varurl=URL.createObjectURL(blob);varau=document.createElement('音频');varli=document.createElement('li');varlink=document.createElement('a');var文件名=新日期()。toISOString();au.controls=true;au.src=网址;link.href=网址;link.download=文件名+".wav";link.innerHTML="保存到磁盘";li.appendChild(au);li.appendChild(document.createTextNode(filename+".wav"))li.appendChild(link);}这样会在这个页面创建一个下载连接,并以录制日期作为文件名。您可以选择下载,同时将音频对象传输到服务器进行语音识别。因为前端将音频流文件上传到后台,没有将音频保存为wav格式,而是将处理流转为二进制数组,直接调用百度语音识别SDK方法返回识别结果,没有编码发送它到后端,然后解码它。letAipSpeech=require("baidu-aip-sdk").speech;letServer=require('ws').Server;constwss=newServer({port:9001})letresTxt;wss.on('connection',ws=>{console.log('serverconnected');ws.on('message',data=>{console.log('serverrecivedaudioblob');//一定要替换新创建的百度语音在百度云控制台应用ApiKey和SecretKeyletclient=newAipSpeech(0,'ApiKey','SecretKey');letvoiceBase64=newBuffer(data);client.recognize(voiceBase64,'wav',16000).then(function(result){console.log('语音识别本地音频文件result:'+JSON.stringify(result));resTxt=JSON.parse(JSON.stringify(result));},function(err){console.log(err);});})//将结果发送给前端ws.send(resTxt);ws.on('error',error=>{console.log('Error:'+error);})ws.on('close',()=>{console.log('Websocketisclosed');})})wss.on('disconnection',ws=>{ws.on('消息',消息=>{console.log('serverrecivedmsg:'+msg);})})这是前端语音录音传输到后台语音识别的结果,使用websocket将结果发送到前端,可以在标签中显示: