語音識別現在已經發展的很成熟了,經過比對發現百度對開發者比較友好,提供很多種語言的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)