python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)
最近心血來潮想利用 python構建一個智能語音聊天機器人,這樣就能在我們無聊的時候和我們聊天以此打發時間啦:)。
要想最終實現聊天機器人的構建需要經過一系列過程功能的實現,大致思路為程序接受用戶的語音保存為音頻文件→識別音頻文件轉換為文本→調用第三方機器人接口獲得文本反饋→將文本反饋轉換為語音讀出來→后期美化補充。
說干就干,首先要實現將我們的聲音錄制下來保存為音頻文件。說到錄音,我們都知道是由計算機內部聲卡實現的,所以我們需要利用pyaudio庫調用聲卡進行聲音錄制,而保存音頻文件我們可以使用python自帶的wave庫來將音頻保存為wav音頻文件。
說到音頻,我們有必要了解一下計算機存儲與播放音頻的原理。自然界我們聽到的聲音被稱為模擬信號,而計算機能夠處理的我們稱之為數字信號,將模擬信號轉換為數字信號需要經歷采樣,量化與編碼的步驟。采樣涉及到①采樣率:即1s采集多少次聲音,也就是所得數字信號每秒的樣本數。采樣率越高,聲音還原越真實自然,同時占資源也就越多,常見的有16000,44100。②采樣位數(深度):聲卡在播放時所使用的數字信號的二進制位數,簡單來說就是聲卡處理聲音的解析度,就是采樣點的大小,一般有8,16兩個參數可以選擇,數值越大,解析度越高,聲音越真實。③采樣寬度:采樣寬度即為采樣的一個點在存儲器中需要占用的字節寬度byte,當采樣深度為paInt16時寬度為2。④幀長度:一幀記錄了一個聲音單元,幀的長度是樣本長度與聲道數的乘積,ACC規定幀的大小為1024,sample和mp3為1152。比如一段5s的音頻,采樣率為16000,則共有樣本數80000個,同時用ACC編碼一幀數有1024個樣本,則可以計算出共有78.125幀。同時一段音頻幀的長度也可以通過一個幀對應的采樣樣本個數/采樣頻率得出,即為1024/16000=64ms。⑤聲道:聲道數也就是聲音錄制時的音源數量或播放時相應的揚聲器數量。我們平時常說的立體聲很明顯就是多聲道的。而量化與編碼就是進一步將采集的樣本處理為二進制保存在硬盤之中。
了解了音頻相關知識我們使用起來pyaudio就顯得十分輕松。在導入pyaudio和wave庫之后我們需要實例化一個pyaudio對象,接著設置參數,主要包括幀長度,采樣深度,采樣率,聲道數,采樣時間,存儲列表,接著調用open函數來設置參數,之后再以幀數(幀數可以通過幀長度,采樣時間和采樣率計算)為單位將二進制文件保存到存儲列表之中,然后停止錄制,最后將二進制對象轉換為wav音頻文件即可,在轉化為wav文件時需要設置聲道,采樣率和采樣寬度(可以根據pyaudio對象get_sample_size函數輸入采樣深度獲取)。
后續的開發也在進行哦,歡迎小伙伴們關注!
源代碼如下(親測可用哦~):
import pyaudio,wave#導入相關的庫#實例化一個pyaudio對象 pa=pyaudio.PyAudio()#設置聲卡參數 chunk=1024#幀長度 Format=pyaudio.paInt16#采樣深度 CHANNELS=2#聲道 RATE=16000#采樣率 record_seconds=5#設置錄制時間 #RATE/chunk*record_seconds為一秒采樣數除以一幀長度和錄制秒數可以得到幀數#新建一個列表,用來存儲數據 record_list=[]#打開聲卡,設置參數,設置音頻流 stream=pa.open(format=Format,rate=RATE,channels=CHANNELS,frames_per_buffer=chunk,input=True)#開始錄制 print('開始錄制...')#進行錄制與采樣 for i in range(0,int(RATE/chunk*record_seconds)):data=stream.read(chunk)#為每一幀的樣本二進制數據record_list.append(data)#得到的是保存的二進制數據#錄制完成 stream.stop_stream()#停止調用聲卡 stream.close()#關閉聲卡 pa.terminate()#結束pyaudio對象 print('錄制結束...')#保存音頻文件(wav文件類型) file=wave.open('voice.wav','wb')#創建voice文件 file.setnchannels(CHANNELS)#設置聲道數 file.setsampwidth(pa.get_sample_size(Format))#設置采樣寬度,通過pa.get_sample_size(format)可以得到 file.setframerate(RATE)#設置采樣率 file.writeframes(b''.join(record_list))#將二進制文件加入到wav文件之中 file.close()?
總結
以上是生活随笔為你收集整理的python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员的数学思维修炼(趣味解读)还有哪些
- 下一篇: js 获取输入的首字母拼音