语音识别现在已经发展的很成熟了,经过比对发现百度对开发者比较友好,提供很多种语言的SDK,对python来说直接安装 pip install baidu-aip 文档写的也不错 具体参考:http://ai.baidu.com/docs#/ASR-Online-Python-SDK/top
也看了讯飞的语音,发现讯飞对开发者的支持不是太好,调用起来不方便
其实最关键的是微信小程序的语音格式是silk,两家都不能识别silk,需要将silk格式转为wav或者pcm格式,音频格式的转换遇到了麻烦,搞了两天才算转换成功,测试发现将语音文件转为wav识别起来成功率高
看到其他人的博客说是silk其实是base64加密后的webm格式,说是需要先将base64解密,还需要自己写解密的代码,参考:http://blog.csdn.net/rjliulei/article/details/77800760
自己比较懒,总是想找成熟的解决方案,终于找到一个很棒的方案:
需要安装FFmpeg和 silk-v3-decoder
FFmpeg找下安装教程即可
silk-v3-decoder的安装参考:https://www.imooc.com/article/21550?block_id=tuijian_wz
再就是转码的命令了,参考:http://blog.csdn.net/m0_37730244/article/details/78615427
命令转码的时候有个地方看了半天才看懂 silk/decoder /data/test.silk /data/1.pcm
编译 silk-v3-decoder后会在里面生成一个silk的目录,里面有个decoder程序,这是转换的关键 用它执行音频格式转换
测试了好几个wav和pcm识别的效果,发现还是wav识别率高,我用的是 ffmpeg -y -f s16le -ar 24000 -ac 1 -i /data/1.pcm -f wav -ar 16000 -b:a 16 -ac 1 /data/1.wav
将pcm转为wav的命令,最后调用百度的识别sdk
下面是识别的接口
# coding=utf-8
from aip import AipSpeech
import os
class ConvertVoice(object):
"""百度语音识别"""
def __init__(self):
super(ConvertVoice, self).__init__()
self.APP_ID = '用的时候需要换成自己申请的内容'
self.API_KEY = '用的时候需要换成自己申请的内容'
self.SECRET_KEY = '用的时候需要换成自己申请的内容'
self.client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
def get_file_content(self, filePath):
'''
读取文件
:param filePath: 文件的绝对路径
:return:
'''
try:
with open(filePath, 'rb') as fp:
return fp.read()
except Exception as error_msg:
print(error_msg)
return error_msg
def get_str_from_voice(self, filePath):
'''
识别本地文件
:param filePath: 文件的绝对路径
:return:
'''
try:
if os.path.exists(filePath):
rt = self.client.asr(self.get_file_content(filePath), 'wav', 16000, {
'lan': 'zh'})
return rt
else:
return {"err_no": 2000, "err_msg": "文件不存在"}
except Exception as error_msg:
print(error_msg)
return error_msg
if __name__ == '__main__':
cv = ConvertVoice()
rt = cv.get_str_from_voice("F:/19.wav")
print(rt)