如何給自己的微信機器人新增語音識別和文字識別的功能
前言:這是我幾個月前一邊工作,一邊搗鼓的個人專案,一直沒有時間去寫點總結,也許是我這個人比較懶吧,不然也不會做出這種東西,哈哈哈。記得那時閒來無事,自己又有許多奇思異想,由於自己之前使用itchat做了個可以接管微信的聊天機器人,我就想能不能給自己的機器人加一些個人技能,如能自己說話,能聽懂我說話,簡單來說需求就是需要加個語音識別和文字識別的功能。
1.根據方向找思路
說幹就幹,我就想如何能夠實現這些功能呢?本來自己是想自己利用MongoDB自己建造一個比較大的語料庫,把客戶的輸入作為問題,然後自己設定不同的回答,然後客戶進入對話後就可以通過語料庫來搜尋響應的回答。後來我就把它推翻了,因為需要的語料庫很大,自己又沒有特別優秀的機器學習演算法(其實就是自己寫不來機器學習的演算法),因此體驗並不理想。要想實現語音識別,首先需要一個媒介,能夠懂我們的漢語,那圖靈的機器人就特別合適,不論你說什麼,它都有似乎不太一樣的回答(實際上有些方面還有些不足),我就預設它很優秀吧,畢竟人工智慧的發展是需要一定時間的積累的,現在的圖靈在行業中也算是比較優秀。
2.根據思路找捷徑
在實現語音識別的路上,基礎的問題已經解決,那後來的問題的解決才是關鍵,我首先想到的是搜尋python的庫,python擁有的就不要重複造輪子了,一是需要大量的時間,二是開發成本太大。所以就想能不用別人的AI平臺來做這件事情,於是我就搜了下BAT還有科大訊飛的AI平臺,好像只有Baidu的平臺才提供免費的語音識別服務,然後就開始幹活了。另外附上百度AI開發文件的地址,想了解自己去看,裡面清清楚楚寫著語音識別需要的條件,如果有什麼看不懂的再問我。這是百度AI技術文件的開發資料地址
3.根據要求寫功能
我使用的是python語言開發的,所以我直接看的python的api文件資料。 根據百度RESET API文件可知,要想實現語音識別需要把語音檔案以pcm的格式傳送到百度的平臺上,當然還要在本地安裝百度的直接pip install baidu-aip到python的環境中。使用itchat下載了好友發來的語音檔案發現是MP3格式的檔案,這就比較麻煩了,因為百度語音識別的預設格式是pcm。 由於底層識別使用的是pcm,因此推薦直接上傳pcm檔案。如果上傳其它格式,會在伺服器端轉碼成pcm,呼叫介面的耗時會增加。
語音識別僅支援以下格式 :pcm(不壓縮)、wav(不壓縮,pcm編碼)、amr(有失真壓縮格式);8k/16k 取樣率 16bit 位深的單聲道。即:
1.pcm wav amr 格式三選一。 正常情況請使用pcm。其中wav格式需要使用pcm編碼。 2.採用率二選一 8000 或者 16000。正常情況請使用16000 單聲道 百度文件也提供了轉碼的工具,可是太推薦的工具是ffmpeg,好吧下載安裝吧,需要去ffmpeg官網下載安裝包,然後把它安裝到python環境的scripits目錄下。
4.開始音訊轉碼
音訊轉碼的話,之前做的工作還不足夠,還需要安裝python的第三方ffmpeg的api介面庫,我用的是ffmpy3,然後去找python官網上的
def mp3_change_pcm(mp3_path):
ff = FFmpeg(
inputs={mp3_path: None},
outputs={
'./static/Recording/target.pcm':'-acodec pcm_s16le -f s16le -ac 1 -ar 16000'
}
)
ff.run()
這就是檔案轉碼的方式。
5.開始語音識別和文字識別
然後去百度AI平臺,去開通一個賬號,上面文件寫的也很清楚而且還需要安裝一個aip的第三方模組,這裡怕你們迷路再次附上地址吧裡面寫的很清楚,不懂的請留言,直白的說就是把轉碼後的語音檔案上傳到百度的平臺上,然後它會給你返回一個字典,裡面有轉碼後的字串。這裡再附上部分我寫的原始碼
# 文字轉語音
def get_recording(msg):
APP_ID = '14433967'
API_KEY = 'agF3ohtSRGGaZPOlCcpyBQ90'
SECRET_KEY = 'FCCb7l5bGvwGgsU7i8xT8xBT6KUF2L9m'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis(msg, 'zh', 1, {'vol': 5, 'per': 4, 'pit':9})
# 識別正確返回語音二進位制 錯誤則返回dict
if not isinstance(result, dict):
with open('./static/Recording/auido.mp3', 'wb') as f:
f.write(result)
record_path = './static/Recording/auido.mp3'
return record_path
def mp3_change_pcm(mp3_path):
ff = FFmpeg(
inputs={mp3_path: None},
outputs={
'./static/Recording/target.pcm':'-acodec pcm_s16le -f s16le -ac 1 -ar 16000'
}
)
ff.run()
# 讀取檔案
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def voice_recongnition(pcm_file):
APP_ID = '14433967'
API_KEY = 'agF3ohtSRGGaZPOlCcpyBQ90'
SECRET_KEY = 'FCCb7l5bGvwGgsU7i8xT8xBT6KUF2L9m'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 識別本地檔案
results = client.asr(get_file_content(pcm_file), 'pcm', 16000, {
'dev_pid': 1536,
})
print(results)
return results['result']
# 語音識別啟動函式
def voice_recon_run():
path = os.listdir('./')
for x in path:
if re.findall(r'mp3$', x):
mp3_path = '.\\'+ x
mp3_change_pcm(mp3_path)
voice_recon_text = voice_recongnition(r'.\static\Recording\target.pcm')
os.remove(mp3_path)
os.remove(r'.\static\Recording\target.pcm')
return voice_recon_text
你的好友或者是你自己給你發語音,然後程式會MP3檔案利用ffmpeg轉碼為pcm格式並且符合百度標準的檔案,百度把它翻譯成文字,然後你的程式接收到返回的文字,再把文字發給圖靈機器人,它在給你返回要說的文字,然後在把這段文字發給百度AI,它在幫你轉為一個MP3格式的語音檔案,你再把它發給你的微信好友。這個語音識別,然後再發出根據語境的語音的迴路就打通了。
6.語音模式和文字模式的切換
當然使用者有選擇的權利,他有權利要求你發語音或文字,所以你要貼合實際場景來定製你的機器人,我使用的方法是定義一個全域性變數,然後使用者會跟我說語音模式或文字模式的命令,然後我的程式會判斷這個全域性變數,進而判斷要不要轉為語音,這會大大的提高使用者的體驗,整個設計的逼格也更符合人性化。
# 文字模式和語音模式的切換
def judge_method(num, tr, fromuser):
if num == 1:
itchat.send_msg(tr, fromuser)
elif num == 2:
record_path = get_recording(tr)
itchat.send_file(record_path, fromuser)
7.總結
這個專案的話,我想的挺多,也是我一個人寫的專案,不算什麼大專案吧,但自我覺得很有新意,也很貼合生活實際。這個專案目前我已上傳到githup上,整體的思想就是如上,如果需要原始碼請移步到我的githup賬號下載aiphare原始檔裡面有好幾個版本功能最全面的是最老的那個版本,可以分析好友分佈,還可以幫你下載圖片,還可以查天氣預報,等等等等,功能太多了,這裡就不一一列舉。前面的幾個版本也都能執行,不過功能會少一點,功能少一點安裝的依賴包也少一點,所有根據個人需要自由選擇吧。如果在使用時遇到什麼困難,可以在本帖下留言,或者在我githup下留言,我會一一回復,另外我也只是學習python剛一年多的人,做的不好的地方請多指教,再此提前謝過,好吧,就說那麼多廢話吧。