您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)Python中PyAudio如何實現(xiàn)錄音自動化交互實現(xiàn)問答,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先要先 pip 一個 PyAudio
pip install pyaudio
一.PyAudio 實現(xiàn)麥克風錄音
然后建立一個py文件,復制如下代碼
import pyaudio import wave CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 16000 RECORD_SECONDS = 2 WAVE_OUTPUT_FILENAME = "Oldboy.wav" p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("開始錄音,請說話......") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("錄音結(jié)束,請閉嘴!") stream.stop_stream() stream.close() p.terminate() wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
嘗試一下,在目錄中出現(xiàn)了一個 Oldboy.wav
文件 , 聽一聽,還是很清晰的嘛
接下來,我們將這段錄音代碼,寫在一個函數(shù)里面,如果要錄音的話就調(diào)用
建立一個文件 pyrec.py 并將錄音代碼和函數(shù)寫在內(nèi)
# pyrec.py 文件內(nèi)容 import pyaudio import wave CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 16000 RECORD_SECONDS = 2 def rec(file_name): p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("開始錄音,請說話......") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("錄音結(jié)束,請閉嘴!") stream.stop_stream() stream.close() p.terminate() wf = wave.open(file_name, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
rec 函數(shù)就是我們調(diào)用的錄音函數(shù),并且給他一個文件名,他就會自動將聲音寫入到文件中了
二.實現(xiàn)音頻格式自動轉(zhuǎn)換 并 調(diào)用語音識別
錄音的問題解決了,趕快和百度語音識別接在一起使用一下:
不管你的錄音有多么多么清晰,你發(fā)現(xiàn)百度給你返回的永遠是:
{'err_msg': 'speech quality error.', 'err_no': 3301, 'sn': '6397933501529645284'} # 音質(zhì)不清晰
其實不是沒聽清,而是百度支持的音頻格式PCM搞的鬼
所以,我們要將錄制的wav音頻文件轉(zhuǎn)換為pcm文件
寫一個文件 wav2pcm.py
這個文件里面的函數(shù)是專門為我們轉(zhuǎn)換wav文件的
使用 os 模塊中的 os.system()
方法 這個方法是執(zhí)行系統(tǒng)命令用的, 在windows系統(tǒng)中的命令就是 cmd 里面寫的東西,dir , cd 這類的命令
# wav2pcm.py 文件內(nèi)容 import os def wav_to_pcm(wav_file): # 假設(shè) wav_file = "音頻文件.wav" # wav_file.split(".") 得到["音頻文件","wav"] 拿出第一個結(jié)果"音頻文件" 與 ".pcm" 拼接 等到結(jié)果 "音頻文件.pcm" pcm_file = "%s.pcm" %(wav_file.split(".")[0]) # 就是此前我們在cmd窗口中輸入命令,這里面就是在讓Python幫我們在cmd中執(zhí)行命令 os.system("ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file)) return pcm_file
這樣我們就有了把wav轉(zhuǎn)為pcm的函數(shù)了 , 再重新構(gòu)建一次咱們的代碼
這次的返回結(jié)果還挺讓人滿意的嘛
{'corpus_no': '6569869134617218414', 'err_msg': 'success.', 'err_no': 0, 'result': ['老男孩教育'], 'sn': '8116162981529666859'}
拿到語音識別的字符串了,接下來用這段字符串 語音合成, 學習咱們說出來的話
三.語音合成 與 FFmpeg 播放mp3 文件
拿到字符串了,直接調(diào)用synthesis方法去合成吧
這段代碼銜接上一段代碼,成功獲得了 synth.mp3 音頻文件,并且確定了實在學習我們說的話
接下來就是讓我們的程序自動將 synth.mp3 音頻文件播放了 其實PyAudio 有播放的功能,但是操作有點復雜
所以我們還是選擇用簡單的方式解決復雜的問題,就是這么簡單粗暴,是否還記得FFmpeg 呢?
FFmpeg 這個系統(tǒng)工具中,有一個 ffplay 的工具用來打開并播放音頻文件的,使用方法大概是: ffplay 音頻文件.mp3
建立一個playmp3.py文件, 寫一個 play_mp3 的函數(shù)用來播放已經(jīng)合成的語音
# playmp3.py 文件內(nèi)容 import os def play_mp3(file_name): os.system("ffplay %s"%(file_name))
回到主文件,調(diào)用playmp3.py文件中的 play_mp3
函數(shù)
執(zhí)行代碼,當你看到 : 開始錄音,請說話......
請大聲的說出: 學IT 找老男孩教育
然后你就會聽到,一個嬌滴滴聲音重復你說的話
四.簡單問答
首先我們要把代碼重新梳理一下:
把語音合成 語音識別部分的代碼獨立成函數(shù)放到baidu_ai.py文件中
# baidu_ai.py 文件內(nèi)容 from aip import AipSpeech # 這里的三個參數(shù),對應在百度語音創(chuàng)建的應用中的三個參數(shù) APP_ID = "xxxxx" API_KEY = "xxxxxxx" SECRET_KEY = "xxxxxxxx" client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) def audio_to_text(pcm_file): # 讀取文件 , 終于得到了PCM文件 with open(pcm_file, 'rb') as fp: file_context = fp.read() # 識別本地文件 res = client.asr(file_context, 'pcm', 16000, { 'dev_pid': 1536, }) # 從字典里面獲取"result"的value 列表中第1個元素,就是識別出來的字符串"老男孩教育" res_str = res.get("result")[0] return res_str def text_to_audio(res_str): synth_file = "synth.mp3" synth_context = client.synthesis(res_str, "zh", 1, { "vol": 5, "spd": 4, "pit": 9, "per": 4 }) with open(synth_file, "wb") as f: f.write(synth_context) return synth_file
然后把我們的主文件進行一下修改
import pyrec # 錄音函數(shù)文件 import wav2pcm # wav轉(zhuǎn)換pcm 函數(shù)文件 import baidu_ai # 語音合成函數(shù),語音識別函數(shù) 文件 import playmp3 # 播放mp3 函數(shù) 文件 pyrec.rec("1.wav") # 錄音并生成wav文件,使用方式傳入文件名 pcm_file = wav2pcm.wav_to_pcm("1.wav") # 將wav文件 轉(zhuǎn)換成pcm文件 返回 pcm的文件名 res_str = baidu_ai.audio_to_text(pcm_file) # 將轉(zhuǎn)換后的pcm音頻文件識別成 文字 res_str synth_file = baidu_ai.text_to_audio(res_str) # 將res_str 字符串 合成語音 返回文件名 synth_file playmp3.play_mp3(synth_file) # 播放 synth_file
然后就是大展宏圖的時候了,展開你們的想象力:
res_str
是字符串,如果字符串等于"你叫什么名字"的時候,我們就要給他一個回答:我的名字叫老男孩教育
新建一個FAQ.py的文件然后建立一個函數(shù)faq:
# FAQ.py 文件內(nèi)容 def faq(Q): if Q == "你叫什么名字": # 問題 return "我的名字是老男孩教育" # 答案 return "我不知道你在說什么" #問題沒有答案時返
在主文件中導入這個函數(shù),并將語音識別后的字符串傳入函數(shù)中
現(xiàn)在來嘗試一下:"你叫什么名字","你今年幾歲了"
成功了,現(xiàn)在你可以對 FAQ.py 這個文件進行更多的問題匹配了
還是那句話,別玩兒壞了
思考題:
1.如何實現(xiàn)一直問答不用問一次停一次?
2.問題那么多,是不是要寫這么多問題呢?
3.如果我問你是誰,是不是要重復也一次 我的名字叫老男孩教育 的答案呢?
Python主要應用于:1、Web開發(fā);2、數(shù)據(jù)科學研究;3、網(wǎng)絡(luò)爬蟲;4、嵌入式應用開發(fā);5、游戲開發(fā);6、桌面應用開發(fā)。
關(guān)于“Python中PyAudio如何實現(xiàn)錄音自動化交互實現(xiàn)問答”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。