AI之语音转写项目实践

最近项目需要,做了一个语音转写的小demo,结合了微信小程序

  • 前端:微信小程序,录音后上传到服务器

  • 服务器:express作为服务器,multer作为上传中间件,ffmpeg作为格式转换工具,使用百度nodejs的sdk进行语音的转换

语音输入

考虑到需要做语音输入,如果使用HTML5的getUserMedia,兼容性问题有点问题,最近在学微信小程序,索性就直接拿这个项目开撸了。

微信小程序的步骤

  • 注册,获取appid 步骤
  • 下载微信小程序开发工具
  • 新建模板项目

pages/index/index.wxml增加录音按钮

<button class="start-record" bindtap="startRecord">开始录音</button>
<button class="stop-record" bindtap="stopRecord">停止录音</button>
<button class="play-record" bindtap="playRecord">播放录音</button>
<button class="upload-record" bindtap="uploadRecord">上传录音</button>
<text class="voice-text">语音转换后的文字:{{text}}</text>

pages/index/index.js中增加业务逻辑

onLoad中增加init方法,初始化recorderManager和innerAudioContext,分别是录音的管理器和播放语音的管理器

onLoad: function () {this.init()// ....
}
init: function() {const recorderManager = wx.getRecorderManager()recorderManager.onStart(() => {console.log('recorder start')})recorderManager.onPause(() => {console.log('recorder pause')})recorderManager.onStop((res) => {console.log('recorder stop', res)const { tempFilePath } = resthis.setData({recordSrc: res.tempFilePath,})})recorderManager.onFrameRecorded((res) => {const { frameBuffer } = resconsole.log('frameBuffer.byteLength', frameBuffer.byteLength)})const innerAudioContext = wx.createInnerAudioContext()innerAudioContext.autoplay = falseinnerAudioContext.onPlay(() => {console.log('开始播放')})innerAudioContext.onError((res) => {console.log(res.errMsg)console.log(res.errCode)})this.setData({recorderManager: recorderManager,innerAudioContext: innerAudioContext});
},

录音和结束录音

startRecord: function() {const options = {duration: 600000,sampleRate: 44100,numberOfChannels: 1,encodeBitRate: 192000,format: 'aac',frameSize: 50}this.data.recorderManager.start(options);
},
stopRecord: function() {this.data.recorderManager.stop();
},

为了更好的验证,播放录音:

playRecord: function() {this.data.innerAudioContext.src = this.data.recordSrcthis.data.innerAudioContext.play()
},

语音上传

语音上传客户端使用的是wx.uploadFile接口

uploadRecord: function() {let that = this;wx.showLoading({title: '上传中...'});const uploadTask = wx.uploadFile({url: 'http://localhost:8080/upload', //仅为示例,非真实的接口地址filePath: this.data.recordSrc,name: 'voice',formData: {'token': '12fdfsdadf',},success: function(res){wx.hideLoading();console.log(res);var data = JSON.parse(res.data);that.setData({text: data.text});},error: function(res) {wx.hideLoading();wx.showToast(res.msg)console.log(res);}});uploadTask.onProgressUpdate((res) => {console.log('上传进度', res.progress)console.log('已经上传的数据长度', res.totalBytesSent)console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)})
}

这里有个地方需要注意,我们的url写的是http开头的,所以需要设置一下
勾选工具-项目详情-不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书,否则会报错

上传服务器:

const convert = require('./convert');
const voice = require('./voice');
const express = require('express');
const co = require('co');
const app = express();
const multer  = require('multer');const upload = multer({ dest: 'uploads/' });app.post('/upload', upload.array('voice'), function (req, res, next) {const rpath = req.files[0].path;const rname = req.files[0].filename;convert(rpath, rname).then(function(fpath){return voice(fpath)}).then(function(result){// 文件转换console.log(result.result[0]);res.status(200).json({text: result.result[0]});}).catch(function(err) {console.log(err);res.status(200).json({msg: err});});
}) app.listen(8080);

语音格式转换

因为微信上传的语音只有mp3和aac格式的,而百度的restful的api只支持pcm和wav格式的语音,所以我们需要进行语音格式的转换,转换工具使用的是ffmpeg

首先安装ffmpeg brew install ffmpeg

然后在convert.js利用shell命令进行格式转换

const process = require('child_process');function convert (fpath, fname) {console.log('in convert');const command = 'ffmpeg -y  -i ./' + fpath + '  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ' + fname + '.pcm';return new Promise(function(resolve, reject) {console.log(command);process.exec(command, function (error, stdout, stderr) {console.log(error);if (error !== null) {console.log('exec error: ' + error);reject(error);return;}resolve(fname + '.pcm');});});}module.exports = convert;

语音转文字

最后一步就是利用百度的sdk进行语音转文字啦,不过各位需要自己去百度的开放平台注册,然后新建应用,获取到APPID/AK/SK

const AipSpeechClient = require("baidu-aip-sdk").speech;// 设置APPID/AK/SK
const APP_ID = "...";
const API_KEY = "...";
const SECRET_KEY = "...";// 新建一个对象,建议只保存一个对象调用服务接口
const client = new AipSpeechClient(APP_ID, API_KEY, SECRET_KEY);const fs = require('fs');function voiceToText(fpath) {console.log('in voiceToText');return new Promise(function(resolve, reject) {const voice = fs.readFileSync(fpath);const voiceBuffer = new Buffer(voice);// 识别本地文件client.recognize(voiceBuffer, 'pcm', 16000).then(function (result) {console.log('<recognize>: ' + JSON.stringify(result));if (result.err_no == 0) {resolve(result);} else {reject(result);}}, function(err) {console.log(err);reject(err);});});}module.exports = voiceToText

有一些注册的步骤,省略了,如果有疑问可以交流

AI之语音转写项目实践相关推荐

  1. 【第5篇】人工智能(AI)语音测试原理和实践

    第1章第4节 AI语音测试简介 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人工智能语 ...

  2. 【第3篇】人工智能(AI)语音测试原理和实践

    第1章第2节 人工智能简介 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人工智能语音测 ...

  3. 【第6篇】人工智能(AI)语音测试原理和实践

    第 2 章 第2章第1节 AI语音交互原理介绍 本章主要介绍AI语音交互的原理,包括语音交互的流程以及各流程节点所涉及的相关知识,如语音采集.语音识别.自然语言处理.语音合成等. 目录 第2章 AI语 ...

  4. 【第1篇】人工智能(AI)语音测试原理和实践

    第1章第1节   人工智能语音测试介绍 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人 ...

  5. AI开发者大会之语音语义技术实践与应用:2020年7月3日《NLP在教育行业的应用》、《AI防疫-语音语义技术在政务联络场景中的应用》、《智能客服机器人在售前导购场景中的应用实践》

    AI开发者大会之语音语义技术实践与应用:2020年7月3日<NLP在教育行业的应用>.<AI防疫-语音语义技术在政务联络场景中的应用>.<智能客服机器人在售前导购场景中的 ...

  6. AI赋能日常生活:讯飞语音转写在会议、采编、上课等场景中的应用

    人工智能在日常生活中的应用已经非常广泛了.除了ChatGPT这种对话生成式AI,语音转文字技术也可以在很多场景中派上用场.比如,奔波于各种会议之间的打工人.经常采访的媒体从业者以及要上网课的学生们,每 ...

  7. AI中文语音克隆、语音合成——GitHub上babysor/MockingBird 项目源码部分功能实现

    AI中文语音克隆.语音合成--GitHub上babysor/MockingBird 项目源码部分功能实现 第一次独立地从认识一项技术,然后到github上搜索相关代码,跟着ReadMe.md教学文档将 ...

  8. 携程AI和推荐系统的云化实践

    嘉宾简介 于磊,携程公共BI,高级总监.毕于上海交通大学计算机科学与技术系,获博士学位.2012年在苏黎世联邦理工大学访学,师从 ACM fellow, Dr. Donald Kossman,从事高并 ...

  9. 【阿里云课程】1小时快速掌握Tensorflow核心功能,完成完整的项目实践

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第7课中一节,介绍如下: Tensorflow快速入门与实践 本节课内容为:深度学习系列课程第7期,Tensorflow快速 ...

  10. 【阿里云课程】1小时快速掌握Caffe核心功能,完成完整的项目实践

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第7课中一节,介绍如下: Caffe快速入门与实践 本节课内容为:深度学习系列课程第7期,Caffe快速入门与实践,讲述Ca ...

最新文章

  1. spark1.x和2.xIterable和iterator兼容问题
  2. 5.7.21mysql数据库_【数据库】mysql5.7.21 winx64安装配置图文分享
  3. LINUX SHELL的神器,sed
  4. Description Resource Path Location Type Java compiler level does not match the version of the insta
  5. k-center 聚类
  6. 一张图看懂VnTrader的数据流
  7. Druid monitor中SQL监控显示不出数据(已解决)
  8. 【转】IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段
  9. eclipse java 报错信息_解决Eclipse启动时报Initializing Java Tooling异常信息
  10. aws fargate_使用AWS Fargate部署PyCaret和Streamlit应用程序-无服务器基础架构
  11. java爬虫爬取豆瓣电影_小爬虫之爬取豆瓣电影排行榜
  12. php服务映射到端口,映射php错误
  13. 树莓派3 Android Pie 编译适配
  14. vue 重写element input限制字数
  15. 1009 数字黑洞(C++)
  16. 小红书X千瓜联合发布|小红书2021年4月创作者红人榜
  17. 特征面提取相关文献阅读笔记(1)上篇
  18. js中回调函数的理解 举例说明js回调函数
  19. web前端期末大作业 html+css+javascript火影忍者网页设计实例 动漫网站制作
  20. H.264 中 SAD SATD及常见知识点

热门文章

  1. Axure RP使用基础教程
  2. 数据库实验五-数据库设计实验
  3. 基于Java前后端分离的在线蛋糕销售系统(含优秀毕业论文)
  4. Ms08067 de 阿青姐姐告诉你为什么要学Python内网开发,不看是你的损失!
  5. 典型相关分析(cca)原理_全网最细的图文详解——手把手教你不会代码一样做RDA/CCA分析!...
  6. 差分脉冲编码调制(DPCM)编码过程详解
  7. 利用kali自带的msfvenom工具生成远程控制软件(木马)
  8. DNN硬件加速器设计4 -- Co-Design and Benchmarking Metrics(MIT)
  9. toolchain安装教程支持_orocos toolchain安装
  10. 富士施乐Fuji Xerox ApeosPort-IV 2060 驱动