python 實(shí)現(xiàn)語(yǔ)音聊天機(jī)器人的示例代碼
前言
在不遠(yuǎn)的將來(lái),實(shí)現(xiàn)一定程度上的語(yǔ)音支持將成為日??萍嫉幕疽?,整合了語(yǔ)音識(shí)別的python程序提供了其他技術(shù)無(wú)法比擬的交互性和可訪問(wèn)性。最重要的是,在python程序中實(shí)現(xiàn)語(yǔ)音識(shí)別非常簡(jiǎn)單。整個(gè)代碼實(shí)現(xiàn)下來(lái)還不到150行。
原理簡(jiǎn)介
許多現(xiàn)代語(yǔ)音識(shí)別系統(tǒng)會(huì)在HMM識(shí)別之前使用神經(jīng)網(wǎng)絡(luò),通過(guò)特征變換和降維技術(shù)來(lái)簡(jiǎn)化語(yǔ)音信號(hào),也可以使用語(yǔ)音活動(dòng)檢測(cè)器將音頻信號(hào)減少到可能包含語(yǔ)音的部分。
幸運(yùn)的是,對(duì)于python來(lái)講,一些語(yǔ)音識(shí)別的服務(wù)可通過(guò)API在線使用,且其中大部分也提供了Python SDK。
本文做的聊天機(jī)器人是基于百度語(yǔ)音識(shí)別和圖靈機(jī)器人二者之上共同實(shí)現(xiàn)的。大致的流程如下圖:
原理流程圖.PNG
這里需要用的模塊庫(kù)有 requests、time、datetime、pyaudio、wave、aipspeech 等。
話不多說(shuō),上代碼:
##@氫立方 2018.0911 import requests import time import pygame from datetime import datetime from aip import AipSpeech from pyaudio import PyAudio,paInt16 import wave import os framerate=8000 NUM_SAMPLES=2000 channels=1 sampwidth=2 TIME=2 def save_wave_file(filename,data): '''save the date to the wavfile''' wf=wave.open(filename,'wb') wf.setnchannels(channels) wf.setsampwidth(sampwidth) wf.setframerate(framerate) wf.writeframes(b"".join(data)) wf.close() def my_record(): pa=PyAudio() stream=pa.open(format = paInt16,channels=1, rate=framerate,input=True, frames_per_buffer=NUM_SAMPLES) my_buf=[] count=0 while count<TIME*6:#控制錄音時(shí)間 string_audio_data = stream.read(NUM_SAMPLES) my_buf.append(string_audio_data) count+=1 print('.') save_wave_file('0001.wav',my_buf) stream.close() ##def play(): ## wf=wave.open(r"D:/41125.mp3",'rb') ## p=PyAudio() ## stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels= ## wf.getnchannels(),rate=wf.getframerate(),output=True) ## while True: ## data=wf.readframes(chunk) ## if data=="":break ## stream.write(data) ## stream.close() ## p.terminate() ## 這里大家需要改成自己的ID和KEY APP_ID = '11****843' API_KEY = '3Mnv***8**88******GbXa' SECRET_KEY = '147***8*88****1227684' aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY) def getText(url): text = requests.post(url).json() return text['text'] ## ##key = '6ddc57c5761a4c62a30ea840e5ae163f' #api = 'http://www.tuling123.com/openapi/api?key=' + key +'&info =' key = '8b005db5f57556fb96dfd98fbccfab84' api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info=' ## while True: ## info = input("我說(shuō)\n") ## chunk=2014 my_record() print("錄音完成") def get_file_content(filePath): with open(filePath,'rb') as fp: return fp.read() a = aipSpeech.asr(get_file_content('0001.wav '),'wav',8000,{}) print(a) b = str(a['result']) info = b url = api + info #print(url) text_01 = getText(url) print("機(jī)器人回\n",text_01) now = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") filename_01 = now + ".mp3" result = aipSpeech.synthesis( text_01,'zh',1,{'vol': 5,'per' : 2} ) if not isinstance(result, dict): with open(filename_01, 'wb') as f: f.write(result) print("--------------------------------------") time.sleep(1) pygame.mixer.init() print("語(yǔ)音1") file= filename_01 track = pygame.mixer.music.load(file) pygame.mixer.music.play() time.sleep(15) pygame.mixer.music.stop() pygame.quit()
運(yùn)行結(jié)果如下:
小編說(shuō)的是:今天看了電視劇。機(jī)器人回復(fù)的是:看了有沒(méi)有開(kāi)心點(diǎn)
在某種意義上來(lái)說(shuō),語(yǔ)境還是符合常理的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 教你用Python創(chuàng)建微信聊天機(jī)器人
- python操作微信自動(dòng)發(fā)消息的實(shí)現(xiàn)(微信聊天機(jī)器人)
- 快速實(shí)現(xiàn)基于Python的微信聊天機(jī)器人示例代碼
- Python實(shí)現(xiàn)聊天機(jī)器人的示例代碼
- python使用itchat庫(kù)實(shí)現(xiàn)微信機(jī)器人(好友聊天、群聊天)
- 基于python的itchat庫(kù)實(shí)現(xiàn)微信聊天機(jī)器人(推薦)
- Python使用20行代碼實(shí)現(xiàn)微信聊天機(jī)器人
- 使用python接入微信聊天機(jī)器人
- Python調(diào)用兩個(gè)機(jī)器人聊天的實(shí)戰(zhàn)
相關(guān)文章
使用python-pptx創(chuàng)建PPT演示文檔功能實(shí)踐
這篇文章主要介紹了使用python-pptx創(chuàng)建PPT演示文檔功能實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python裝飾器的執(zhí)行過(guò)程實(shí)例分析
這篇文章主要介紹了Python裝飾器的執(zhí)行過(guò)程,結(jié)合實(shí)例形式分析了Python裝飾器的原理、執(zhí)行過(guò)程及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-06-06python判斷字符串以什么結(jié)尾的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于python判斷字符串以什么結(jié)尾的實(shí)例方法 ,需要的朋友們可以學(xué)習(xí)參考下。2020-09-09pandas pivot_table() 按日期分多列數(shù)據(jù)的方法
今天小編就為大家分享一篇pandas pivot_table() 按日期分多列數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python實(shí)現(xiàn)模擬錕斤拷等各類(lèi)亂碼詳解
說(shuō)到亂碼問(wèn)題就不得不提到錕斤拷,這算是非常常見(jiàn)的一種亂碼形式,那么它到底是經(jīng)過(guò)何種錯(cuò)誤操作產(chǎn)生的呢?本文我們就來(lái)一步步探究2023-02-02在Linux中通過(guò)Python腳本訪問(wèn)mdb數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了在Linux中通過(guò)Python腳本訪問(wèn)mdb數(shù)據(jù)庫(kù)的方法,本文示例基于debian系的Linux系統(tǒng),需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)隱馬爾可夫模型的前向后向算法的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)隱馬爾可夫模型的前向后向算法,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python 關(guān)于反射和類(lèi)的特殊成員方法
本文給大家分享python關(guān)于反射和類(lèi)的特殊成員方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09