思路:
实现:
1、使用小程序录音API服务,建立录音文件。
小程序文档:全局唯一的录音管理器
2、小程序代码
"黑灰化肥会挥发发灰黑讳为花飞;灰黑化肥会挥发发黑灰为讳飞花"
const rm = wx.getRecorderManager();
Page({
/**
* 页面的初始数据
*/
data: {
bg:"linear-gradient(180deg,rgba(255,246,174,1) 0%,rgba(251,230,132,1) 100%)",
photo: true,
photoGif:false,
touchStartText:"按住说出以上口令领红包"
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
let that = this
rm.onStop(res => {
//请求后台比对
that.verifyVoice(res)
})
},
handleTouchStart(){
console.log("录音开始")
const options = {
duration: 60000,
sampleRate: 44100,
numberOfChannels: 1,
encodeBitRate: 192000,
format: 'mp3',
frameSize: 50
}
rm.start(options)
this.setData({
bg: "#ECD76C",
photoGif: true,
photo: false,
touchStartText: "松开结束录音"
})
},
handleTouchEnd(){
console.log("录音结束");
rm.stop()
this.setData({
bg: "linear-gradient(180deg,rgba(255,246,174,1) 0%,rgba(251,230,132,1) 100%)",
photoGif: false,
photo: true,
touchStartText: "按住说出以上口令领红包"
})
},
verifyVoice(res){
wx.uploadFile({
url: "后台地址",
filePath: res.tempFilePath,
name: 'file',
formData: {
'user': 'test'
},
success: function (res) {
console.log(res); console.log(res.data);
},
fail: function () {
console.log("语音识别失败");
}
})
}
})
3、配置Centos7环境,安装音视频转码软件ffmpeg,具体安装步骤参考推荐文章。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
【linux】ffmpeg 安装教程
ffmpeg发行版本列表
当前使用版本ffmpeg-4.1.tar.gz
4、后台代码
Controller层方法
@PostMapping("/verifyVoice")
public xxx verifyVoice(MultipartRequest request){
//调用Service层方法
xxx.verifyVoice(request);
}
Service层方法
百度在线语音识别API接口,转换语音为文字。
百度开放平台文档:在线语音识别
@Override
public xxx verifyVoice(MultipartHttpServletRequest request) {
logger.debug(">>>>开始语音识别");
MultipartFile fileDetail = request.getFile("file");
String fileName = System.currentTimeMillis() + ".mp3";
String path = "/opt/service/";
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
RandomAccessFile randomFile = null;
try {
randomFile = new RandomAccessFile(path + fileName, "rw");
randomFile.seek(randomFile.length());
randomFile.write(fileDetail.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
randomFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String res = null;
try {
String filePath = zm(path, fileName);
File f = new File(filePath);
for(int i=0;i<100000;i++){
if(f.exists()){
res = sb(filePath);
//识别完毕删除文件
final String fName = fileName.split("\\.")[0];
final String p = path;
break;
}
}
String fName = fileName.split("\\.")[0];
String p = path;
File f1 = new File(p+fName+".mp3");
File f2 = new File(p+fName+".pcm");
f1.delete();
f2.delete();
System.out.println("语音识别结果="+res);
} catch (Exception e) {
System.out.println("语音识别失败");
e.printStackTrace();
}
if(StringUtils.isBlank(res)){
return null;
}
res = res.trim();
return null;
}
public String zm(String path, String fileName) throws IOException, InterruptedException {
String zmName = fileName.split("\\.")[0] + ".pcm";
String ffmpegPath = "/monchickey/ffmpeg/bin/";
String cmd = ffmpegPath+"ffmpeg -y -i "+path+fileName+" -acodec pcm_s16le -f s16le -ac 1 -ar 16000 "+path+zmName;
try {
String[] cmdA = { "/bin/sh", "-c", cmd };
Process process = Runtime.getRuntime().exec(cmdA);
LineNumberReader br = new LineNumberReader(new InputStreamReader(process.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
sb.append(line).append("\n");
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
logger.debug("zm返回值"+path+zmName);
return path+zmName;
}
public static String sb(String filePath) throws JSONException, InterruptedException{
String string = "";
try {
// 初始化一个AipSpeech
AipSpeech client = new AipSpeech("xxxx", "yyyy", "zzzz");
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 调用接口
JSONObject res = client.asr(filePath, "pcm", 16000, null);
string = res.toString(2);
}catch (Exception e) {
}
return string;
}
注意:
//项目部署路径
String path = "/opt/service/";
//步骤3中安装的音视频转码软件ffmpeg的位置
String ffmpegPath = "/monchickey/ffmpeg/bin/";
// 初始化一个AipSpeech
AipSpeech client = new AipSpeech("xxxx", "yyyy", "zzzz");替换为自己的百度开放平台授权信息。
百度短文本相似度API接口
百度开放平台文档:短文本相似度接口
具体语音转文字后的相似度逻辑改造上面代码:
System.out.println("语音识别结果="+res);