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

百度语音识别

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

1、规格参数要求

  • 语音时长上线为60s,超出讲返回错误
  • 原始录音文件为pcm(不压缩)、wav(不压缩)、pcm编码或者amr(压缩)格式,不区分大小写,推荐使用pcm
  • 录音采样率为1600016bit位深、单通道
  • 支持普通话、英文、粤语、四川话

项目结构

调用百度AI平台语音识别的Nodejs SDK,查看文档快速入门,可以查看如何调用。

首先将nodejs-sdk下载下来,下载后将目录里的speech文件夹拷贝到你的项目文件夹中,其中assets是存放录音音频的地方,然后进入node文件夹下的位置进行安装依赖包:

npm install

我的项目文件夹目录如下:

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├─ RecordRTC.js├─ index.html├─ main.js├─ node_modules├─ package-lock.json├─ package.json└─ style.css

然后在node文件夹里的index.html是我的客户端文件,main.js是我的服务端文件。

搭建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

语音识别

客户端录音传给服务端,然后写入本地.wav文件的操作有个了雏形,但是还需要再修改一下,所以这里只是大概将百度AI提供的录音文件语音识别之后传给前端显示演示出来。

index.html:

<div><p>You said: </p><p id="txt"></p></div>

我使用的是RecordRTC录音:

<script src="./RecordRTC.js"></script><script>let audio = document.querySelector('audio');let audioTxt = document.getElementById('txt');let ws = new WebSocket('ws://localhost:9001');ws.onopen = e => {console.log('Connection to server opened');}/*** @name: captureMicrophone* @description: 获取麦克风权限* @param {type} callback* @return: none*/function captureMicrophone(callback) {navigator.mediaDevices.getUserMedia({audio: true}).then(callback).catch(function(error) {alert('Unable to access your microphone.');console.error(error);});}/*** @name: stopRecordingCallback* @description: 停止说话 发送blob给服务端* @param {type} none* @return: none*/function stopRecordingCallback() {audio.srcObject = null;let blob = recorder.getBlob();console.log(blob);// 录音回放audio.src = URL.createObjectURL(blob);// 麦克风停止使用recorder.microphone.stop();// 传输blobws.send(blob)}// 将识别结果传送给前端显示ws.onmessage = e => {console.log(e.data);let data = JSON.parse(e.data);audioTxt.innerHTML = data.result;}ws.onclose = e => {console.log('Connection to server closed');}let recorder; // globally accessible/*** @name: * @description: 开始说话* @param {type} none* @return: */document.getElementById('btn-start-recording').onclick = function() {// this.disabled = true;captureMicrophone(function(microphone) {audio.srcObject = microphone;recorder = RecordRTC(microphone, {type: 'audio',recorderType: StereoAudioRecorder,desiredSampRate: 16000});recorder.startRecording();// 点击停止说话,释放麦克风recorder.microphone = microphone;document.getElementById('btn-stop-recording').disabled = false;});};/*** @name: * @description: 停止说话* @param {type} none* @return: */document.getElementById('btn-stop-recording').onclick = function() {// this.disabled = true;recorder.stopRecording(stopRecordingCallback);};</script>

服务端将音频对象blob写入本地.wav文件,然后进行语音识别:

let AipSpeech = require("baidu-aip-sdk").speech;
let fs = require('fs');
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 voice = fs.readFileSync('../assets/16k_test.pcm');let voiceBase64 = new Buffer(voice);// 识别本地语音文件client.recognize(voiceBase64, 'pcm', 16000).then(function(result) {console.log('语音识别本地音频文件结果: ' + JSON.stringify(result));resTxt = 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);})
})

然后启动服务器:

node main.js

再打开index.html在浏览器上,就可以看到连接服务器了,然后语音识别的结果是这样:

语音识别本地音频文件结果: {"corpus_no":"6728179649062189023","err_msg":"success.","err_no":0,"result":["北京科技馆。"],"sn":"727133992011566526398"}

这是前端显示的结果:

语音识别—实现百度语音识别相关推荐

  1. micropython 离线语音识别_百度语音识别.pdf

    语音识别1(百度语音识别) 简介 推荐国内用户使用!识别普通话效果可以,识别英文效果不好.尽量识别长点,有现实意义的长短语. 这样识别率比较高 语音识别,是CC喵最喜欢的一个人工智能功能.近年来智能音 ...

  2. Android语音识别——谷歌语音识别与百度语音识别

    Android语音识别,简单的理解就是把语音转化为文字. 在日常中,语音识别,车载导航.语音输入等,虽然不一定准确,但用途广泛. 这里就介绍下谷歌原生的语音识别与百度的语音识别 谷歌语音识别 谷歌语音 ...

  3. 百度语音识别下载|百度语音识别demo_绿盟市场_绿色软件联盟

    + 展开全部- 收起部分百度语音识别demo介绍 百度语音识别demo是支持 node 版本 4.0+.直接使用Node.js开发包步骤如下:1.下载Node.js SDK压缩包.2.将下载的`aip ...

  4. google 语音识别 VS 百度语音识别

    google [优点] ).很牛逼,实时解析这么精准,了不起 ).有歧义的语句,复杂的语句,自动纠正能力很强,哪怕发音差(普通话差)也能识别 ).语音识别能力:丧心病狂 ).完全免费的: speech ...

  5. uniapp使用百度语音识别语音转文字

    HBuilderX已支持讯飞语音识别和百度语音识别,这里讲下百度语音接入 一:首先是百度语音识别申请 这个步骤暂且省略,可以直接移步百度语音api页面自行申请,主要是为了获取语音权限以及AppID.A ...

  6. uniapp配置百度语音识别转文字(含demo)

    前言 在dcloud社区已经给出了语音识别插件配置的步骤,点击前往:语音识别插件配置, 但是还是不够详细,有可能会遇到问题,所以我结合实例配置实现一下. 概述 HBuilderX已支持讯飞语音识别和百 ...

  7. 实例:Qt | 百度语音识别

    模块一:准备工作:进入语音识别官网,创建账号,使用语音识别应用,记下APIKey和SecretKey,并且别忘了领取免费额度(*****很关键)并且了解百度语音翻译的通信过程 模块二:搭建ui界面 录 ...

  8. javaMP3转pcm 百度语音识别

    不多说直接贴代码 import com.baidu.aip.speech.AipSpeech; import javazoom.spi.mpeg.sampled.file.MpegAudioFileR ...

  9. python调用离线百度语音识别_python调用百度语音识别api

    最近在处理语音检索相关的事. 其中用到语音识别,调用的是讯飞与百度的api,前者使用js是实现,后者用python3实现(因为自己使用python) 环境: python3.5 centos 7 流程 ...

最新文章

  1. 最新网众 2490(XP) 客户端 去百度 去劫持 去快车
  2. [攻防世界 pwn]——pwn1(内涵peak小知识)
  3. Java EE API整合:为什么Spring要与“笨重”的Java EE共舞?
  4. 现身说法“好奇心害死人啊”
  5. FastJson漏洞
  6. mysql中美元符号_Mybatis中#号和美元符号$符号的区别
  7. 针对三层别墅的两种无线组网方案
  8. Shapely的安装
  9. java解析json天气api,使用Postman获取天气接口API(Json格式)
  10. 股票基本知识入门提纲
  11. rz安装 xshell_Linux与windows之间文件传输工具RZSZ安装(Xshell或CRT)
  12. 【电商】电商后台设计—库存模块
  13. 阅读Designing Network Design Spaces(CVPR2020)
  14. 使用Kafka订阅数据库的实时Binlog
  15. 除尘机器人毕业_【干货】焊接机器人除尘方式
  16. 求n+nn+nnn+nnnn+nnnnn+nnnnnn
  17. asyne和await
  18. 【Java并发编程】Java多线程(四):FutureTask 源码分析
  19. 知识库的分类梳理原则与实践经验
  20. C语言例题100道(21~40)

热门文章

  1. 存储调研:BeeGFS并行文件系统体系结构
  2. 让自己的QQ个人头像Tip也有彩色背景(转)
  3. 2021-2027全球与中国镍钛合金医疗器械市场现状及未来发展趋势
  4. NET Framework合集(官方)
  5. 电子商务竞争加速:顺丰速运及天极均推B2C平台
  6. 解决花生壳 Aira2 路由器 树莓派中的aira2状态未连接的思路
  7. Ubuntu 18.04/20.04 多线程下载工具AXEL和AIRA2
  8. python手机话费_Python软件测试中“电话费”问题的解决方案,python,版本,账单,题解...
  9. taobao.trade.fullinfo.get( 获取单笔交易的详细信息API接口),淘宝店铺订单明文接口代码分享
  10. itext 导出word