一种基于微信小程序的语音输入技术应用研究
2018-01-20周虎
周虎
摘要:该文通过微信小程序中的录音功能,将生成的MP3格式文件上传到服务器端并转换成PCM格式的音频文件,然后将该音频文件发送到百度语音识别接口进行语音识别,将识别结果返回到微信小程序,实现了在微信小程序中的用户语音输入功能。基于微信小程序的语音输入功能大大提高了微信小程序中用户输入信息的速度和用户体验。
关键词:微信小程序;语音识别;语音输入;MP3;PCM
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)31-0104-02
1 背景
随着人工智能的不断发展,语音识别技术取得了显著进步,已经开始逐步走向市场,尤其在语音输入应用上,文字识别准确率达到90%以上[1],大大提高了用户文字输入的速度。微信小程序是基于微信平台一种新的开放能力,可以在微信平台内被便捷地获取和传播,用户不需要下载安装即可使用的应用,具有出色的使用体验[2]。在一些游记或记事本类的小程序中,需要用户大量输入文字信息,该文将在微信小程序中通过调用微信平台的录音功能,结合远程的语音识别,共同实现了语音输入功能,大大提高了用户信息的输入速度。
2 微信小程序语音输入功能简介
微信小程序是基于微信给用户提供二次开发的应用平台,用户可以通过微信小程序开发工具开发自己的应用。虽然微信平台可以提供语音输入,但是在小程序中目前只是提供录音功能,并没有提供语音输入功能。虽然目前语音输入技术已经很成熟,但是针对小程序的特殊性,要实现基于小程序的语音输入功能,只能通过远程调用语音识别接口的方式来实现,所以借助小程序的录音功能,将录音的音频文件发送到远程调用语音识别接口,并返回识别结果。
基于微信小程序语音输入功能主要包括录音MP3格式文件的生成,服务器端音频文件的格式转换和调用百度语音识别接口并返回识别结果,具体时序图如图1所示。
在音频转换过程中,由于百度开放语音平台接受原始 PCM 的录音参数必须符合 8k/16k 采样率、16bit 位深、单声道,而微信小程序在录音过程中生成的音频格式采样率为8k/16k/44k,生成的音频格式为aac/mp3,存在音频格式不同的障碍,所以必须在服务器端要有一个音频转换功能。
3 微信小程序语音输入功能的实现
微信小程序语音输入功能主要分为音频采集和上传、音频文件格式转换和调用远程语音识别接口并返回结果三个部分。
3.1 音频采集和上传
在微信小程序中,提供了调用系统录音功能的接口,通过录音参数设置,指定相关参数,如程序1所示[3]。
const options = {
duration: 30000,//指定录音的时长,单位 ms
sampleRate: 16000,//采样率
numberOfChannels: 1,//录音通道数
encodeBitRate: 96000,//编码码率
format: 'mp3',//音频格式,有效值 aac/mp3
frameSize: 50,//指定帧大小,单位 KB
}
程序1 微信小程序录音参数设置
设定完指定参数后,微信小程序需要进行录音授权,如果用户允许录音,此时将开始录音,录音结束后将录音文件保存在临时文件夹中,并将该音频文件上传到服务器端,实现代码如程序2所示。
wx.authorize({
scope: 'scope.record',
success() {
const recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => {
console.log('recorder start')
})
recorderManager.onStop((res) => {
this.tempFilePath = res.tempFilePath;
const uploadTask = wx.uploadFile({
url: 'https://服务器地址',
filePath: tempFilePath,
name: 'file',
success: function (res) {
////等待返回结果
}
}) })}
})
程序2 錄音文件采集及上传
当录音文件采集后,直接上传到远程服务器,等待服务器将语音识别的结果返回,如果成功返回后,再将识别的结果显示在视图文本框中。
3.2 音频格式转换
在服务器端,接收到微信小程序发送的音频文件后,使用Java技术结合mp3spi第三方开发包,针对mp3格式文件进行格式转换[4],首先获取pcm格式音频流,然后再写入新的pcm格式文件,关键代码如程序3所示。
File mp3 = new File(mp3filepath);
AudioInputStream audioInputStream = null;
AudioFormat targetFormat = null;
try {
AudioInputStream in = null;
MpegAudioFileReader mp = new MpegAudioFileReader();//读取音频文件的类
in = mp.getAudioInputStream(mp3);
AudioFormat baseFormat = in.getFormat();
//设定输出格式为pcm格式的音频文件
targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
//输出到音频
audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath)); //保存到pcm文件
} catch (Exception e) {
e.printStackTrace();
}
程序3 mp3音频文件转换为pcm格式音频文件
在转换音频格式过程中,如果出现异常,直接返回错误信息,就不需要再调用百度语音识别接口了。
3.3 调用远程语音识别接口并返回结果
在服务器端对音频文件格式转换成功后,就可以通过引用百度的语音识别开发包,直接将pcm格式的音频文件发送到远程语音识别接口,等待接口返回识别的结果。当然,用户需要先在百度上注册自己的APPID,得到对应的APIKEY和SECRETKEY才可以调用。语音识别返回的结果是JSON格式,需要在服务器端对返回的结果进行解析,具体如程序4所示。
import org.json.JSONObject;
import com.baidu.aip.*;
import com.baidu.aip.speech.AipSpeech;
public class Voice {
public static final String APP_ID = "APPID";//设置APPID/AK/SK
public static final String API_KEY = "APIKEY";
public static final String SECRET_KEY = "SECRETKEY";
public static String getVoiceTxt(String filepath){
// 初始化一个AipSpeech
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
JSONObject res = client.asr(filepath, "pcm", 16000, null);
return (res.toString(2));
}
}
程序4 调用远程语音识别接口并返回结果
当服务器端获取语音识别结果后,在将该结果通过JSON格式返回到微信小程序端的文本框中。
4 结束语
语音输入已经在很多应用中得到了广泛的使用,该文通过针对微信小程序中的语音输入功能研究,结合微信小程序中的录音功能、文件上传功能、音频格式转换功能和远程语音识别功能共同实现了基于微信小程序的语音输入功能,并在游记小程序中得到了应用。一方面提高了用户文字输入的速度,同时提高了用户体验,当然,这种语音输入技术也有需要進一步改进的地方,如果微信平台能开放语音识别功能,就可以省去调用远程语音识别接口的步骤,在语音识别的速度上将得到大大的提高。
参考文献:
[1] 佚名. 百度语音识别[EB/OL]. http://ai.baidu.com/tech/speech/asr.
[2] 匡文波, 李芮, 任卓如. 微信小程序面面观[J]. 新闻论坛, 2017(2).
[3] 佚名. 微信小程序API[EB/OL]. https://developers.weixin.qq.com/miniprogram/dev/api/getRecorderManager.html.
[4] 桑园. 浅析几种Java播放音频技术及实例[J]. 数字技术与应用, 2016(4).