实现前端录音,将音频blob传给服务器,然后在服务器端使用百度AI语音识别将结果返回给前端

上一篇文章是将百度AI语音识别Nodejs SDK版的进行了一遍演示加识别结果返回给前端显示,这里是完整的进行前端录音,然后将压缩后的音频对象Blob传给服务器,在服务端使用百度AI语音识别,最后将识别结果返回给前端进行显示。

本篇调用的是第三方库Recorder.js,如何调用该库捕获HTML5中的WAV音频并将其上传到服务器或者本地下载,可以查看这篇博客,不过它讲解的是上传到PHP服务端,这里我改成了基于Node搭建的Websocket服务器。
这是本篇博客的语音识别结果:

百度语音识别

查看文档知道了我想要的信息,如果想要实现实时语音识别、长时间段的语音、唤醒词功能、语义解析功能,需要使用AndroidIOS SDK或者Linux C++ SDK版本,而我使用的Nodejs SDK是不支持的。

1、规格参数要求

搭建Websocket服务器

main.js文件里搭建websocket服务器,首先安装相关依赖模块:

npm i ws -S

然后搭建:

let Server = require('ws').Server;
const wss = new Server({port: 9001
})
// 连接服务器
wss.on('connection', ws => {console.log('server connected');})ws.on('error', error => {console.log('Error:' + error);})ws.on('close', () => {console.log('Websocket is closed');})
})
// 断开连接
wss.on('disconnection', ws => {ws.on('message', msg => {console.log('server recived msg:' + msg);})
})

然后在index.html中:

let ws = new WebSocket('ws://localhost:9001');
ws.onopen = e => {console.log('Connection to server opened');
}

启动服务:

node main.js

就可以在控制台看见这样的打印信息:

// 客户端的打印信息:
Connection to server opened// 服务端的打印信息:
server connected

前端录音

客户端实现录音之后,将压缩后的音频对象Blob传给服务器:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>Simple Recorder.js demo with record, stop and pause</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="style.css">
</head><body><div id="controls"><button id="recordButton">Record</button><button id="stopButton" disabled>Stop</button></div><p id="out-txt">You said:</p><h3>Recordings</h3><ol id="recordingsList"></ol><script src="https://cdn.rawgit.com/mattdiamond/Recorderjs/08e7abd9/dist/recorder.js"></script>
//连接服务器
let ws = new WebSocket('ws://localhost:9001');
ws.onopen = e => {console.log('Connection to server opened');}
URL = window.URL || window.webkitURL;var gumStream; //stream from getUserMedia()
var rec; //Recorder.js object
var input; //MediaStreamAudioSourceNode var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContextvar recordButton = document.getElementById("recordButton");
var stopButton = document.getElementById("stopButton");recordButton.addEventListener("click", startRecording);
stopButton.addEventListener("click", stopRecording);
// 录音
function startRecording() {console.log("recordButton clicked");var constraints = {audio: true,video: false}recordButton.disabled = true;stopButton.disabled = false;// 获取录音权限 然后开始录音navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {console.log("getUserMedia() success, stream created, initializing Recorder.js ...");audioContext = new AudioContext();gumStream = stream;input = audioContext.createMediaStreamSource(stream);rec = new Recorder(input, {numChannels: 1 // 单声道})//开始录音rec.record()console.log("Recording started");}).catch(function(err) {recordButton.disabled = false;stopButton.disabled = true;});
}// 停止录音
function stopRecording() {console.log("stopButton clicked");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);}// 创建下载链接
function createDownloadLink(blob) {console.log(blob);ws.send(blob);var url = URL.createObjectURL(blob);var au = document.createElement('audio');var li = document.createElement('li');var link = document.createElement('a');var filename = new Date().toISOString();au.controls = true;au.src = url;link.href = url;link.download = filename + ".wav";link.innerHTML = "Save to disk";li.appendChild(au);li.appendChild(document.createTextNode(filename + ".wav "))li.appendChild(link);
}

这样,在该页面会创建下载连接,并以录音日期为文件名,可以选择下载,同时也会将音频对象传到服务器。

语音识别

因为前端通过音频流文件上传到后台后,不再是保存为wav格式的音频,而是处理流的形式转为二进制数组,直接调用百度语音识别SDK方法,即可返回识别结果,不必编码后发给后端,后端然后再解码。


let AipSpeech = require("baidu-aip-sdk").speech;
let Server = require('ws').Server;
const wss = new Server({port: 9001
})let resTxt;
wss.on('connection', ws => {console.log('server connected');ws.on('message', data => {console.log('server recived audio blob');// 务必替换百度云控制台中新建百度语音应用的 Api Key 和 Secret Keylet client = new AipSpeech(0, 'Api Key', 'Secret Key');let voiceBase64 = new Buffer(data);client.recognize(voiceBase64, 'wav', 16000).then(function(result) {console.log('语音识别本地音频文件结果: ' + 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('Websocket is closed');})
})
wss.on('disconnection', ws => {ws.on('message', msg => {console.log('server recived msg:' + msg);})
})

这是前端说话录音传给后台语音识别的结果,将结果使用websocket传给前端,显示在标签内就可以了:

语音识别—前端录音传给后台语音识别相关推荐

  1. html语音上传,语音识别—前端录音上传服务器进行语音识别

    采用前端录音,Websocket搭建Node服务器,音频对象Blob使用Websocket传给后端服务器后写入本地音频文件,然后调用百度AI语音识别本地音频文件,最后将识别结果传给前端显示. 百度语音 ...

  2. 前端调用麦克风获取实时音频流和录音并上传至后台

    前端调用麦克风获取实时音频流和录音并上传至后台 index.html <!DOCTYPE html> < a href=" ">Default.html&l ...

  3. react将前端Blob类型文件传到后台

    react将前端Blob类型文件传到后台 最近在做一个关于语音识别的功能,具体需求是用户在线录制音频提交给后台,后台转写成文字输出txt文本.我使用的是一个第三方类库recordmp3.js,可以录制 ...

  4. (保姆教程及高级玩法及坑)微信同声传译插件-语音识别

    目录 一.背景 二.效果 ​编辑 三.保姆级教程 3.1 小程序后台添加插件:微信同声传译 3.1.1 设置 -> 第三方设置 -> 添加插件 3.1.2 搜索插件 3.1.3 成功添加后 ...

  5. 微信小程序使用同声传译实现语音识别功能

    微信小程序使用同声传译实现语音识别功能 我使用同声传译语音识别功能是为了实现微信小程序首页的语音搜索功能,如果你也是那么恭喜你,你可以ctrl+c.ctrl+v再改一改,如果你不是那么你也不要着急的走 ...

  6. 【语音识别】基于matlab电话按键语音识别(含按键录音)【含Matlab源码 1752期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[语音识别]基于matlab电话按键语音识别(含按键录音)[含Matlab源码 1752期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  7. SpringMVC(SSM)框架搭建JavaWeb项目时,前端页面文件上传,后台Java下载功能实现及相关问题记录说明

    看在前面:前端页面通过input控件实现文件上传,后台Java使用SpringMVC框架的实现网上有较多教程,但是真正配置一遍下来不报错的较少,所以本博客前面先介绍一遍完整的设置步骤,然后介绍遇到的一 ...

  8. 网页传上服务器 是乱码,前端传到后台中文乱码问题

    编码乱码问题: 经常会遇到前端传到后台时,也就是controller层时,会发生乱码,在这里我总结了几个解决乱码的方法,基本都能解决, @符号越多代表越常见 1.@@Tomcat服务器配置的问题-从前 ...

  9. 关于前端上传文件到后台,文件大小超出限制,导致上传失败的解决办法。

    文章出处:Jiangkuobo,微信:jkb_267460 文章目录 前言 一.使用elementPlus上传图片,出现的问题. 二.验证猜想 1.验证方式: 2.测试结果: 3.我的猜想与验证 三. ...

最新文章

  1. 209计算机考试题库,计算机考试题库:计算机考试模拟练习题(209)
  2. hive 分区_代码 | Spark读取mongoDB数据写入Hive普通表和分区表
  3. python中的常量_Python中的变量和常量
  4. jooq和jdbc_将jOOQ与JDBC比较
  5. vector简单应用
  6. list 增 删 改 查 及 公共方法
  7. 【报告分享】2021中国中高端人才趋势报告.pdf(附下载链接)
  8. ARM中的---汇编指令
  9. Android AIDL实例解析
  10. gitlab提交代码
  11. LINUX上安装openjdk
  12. ezd格式文件怎么打开_EPLAN Electric P8 中的 EDZ 文件格式
  13. python-第三方接口获取验证码
  14. java中的NIO是什么?
  15. 插入u盘计算机未响应,u盘启动电脑无反应,教您电脑插上U盘后无法启动解决方法...
  16. Android评论工具类,实现QQ空间文字评论效果
  17. “空气洗”再迎迭代,模仿者又有了新目标
  18. JavaScript学习笔记——函数 Part4:向函数传递函数、从函数返回函数(函数是一等公民)
  19. python --cpca(从文本中提取省市区)
  20. Snakes and Ladders(简单高斯消元)

热门文章

  1. PMP范围和需求的区别是什么?
  2. 2013-04-26《再别康桥》
  3. 面试的时候问:你的期望薪资多少?怎么谈
  4. 可带癞子的通用麻将胡牌算法
  5. JDK(Java)的下载与安装
  6. CAE行业再添神器,CAE产品组件套包CEETRON SDKS全新发布
  7. linux安装南大通用数据库 GBase 8s V8.8
  8. Vue页面功能设计:随机生成一句名言或者励志的话
  9. 关于error:java :程序包org.apache.ibatis.io不存在这件事。
  10. 精通one,学习another,关注next