python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)
前言
今天開始進入近期系列文章的第一篇,如何用 Python 來實現錄音功能。
在開始"造輪子"之前,個人一直強調一個觀點,如果有些東西已經有了,不妨直接去 github 上搜,用現成的就好。關于這個想法,其實 github 上已經有人實現了。
但是有些細節點,和我想的不太一樣。所以呢,我還是決定自己體驗一波流程,順便踩踩坑,畢竟是從興趣出發。
而在上篇文章留言區中,有個小伙伴也提出,其實在去年,就已經用樹莓派實現了這系列的功能,我覺得還是蠻有意思的一件事。
下面進入正題。
環境準備
開始之前,先要介紹的是今天的主角,PyAudio。
這款第三方庫,是一個跨平臺音頻庫。
跨平臺的性質,不用多說了吧!就是多面兼容你的系統,不論你是用的 windows 、mac、linux,它都是支持的。
安裝命令如下: pip install PyAudio
mac的同志們,需要注意下,安裝的時候可能會報錯,安裝如下即可。
brew install portaudio完備的第三方庫都會有對應的文檔,地址如下:
https://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio錄音功能實現
先來介紹一下,如何使用它來進行錄制音頻功能!
PS: 音頻方面的東西,我之前也沒過多了解,近期寫了 PyAudio 庫的代碼實現后才發現,要想明白代碼的含義,還要有一些音頻方面的知識作為前置儲蓄,所以下面我會結合代碼去通俗講解,若有哪里不對的地方,歡迎評論區留言指出!
先來看代碼。
設定參數:
CHUNK = 1024 # 每個緩沖區的幀數FORMAT = pyaudio.paInt16 # 采樣位數CHANNELS = 1 # 單聲道RATE = 44100 # 采樣頻率設定具體實現的參數,分別有 緩沖區幀數、采樣位數、聲道模式、采樣頻率。
具體實現錄音代碼:
def record_audio(wave_out_path, record_second): """ 錄音功能 """ p = pyaudio.PyAudio() # 實例化對象 stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) # 打開流,傳入響應參數 wf = wave.open(wave_out_path, 'wb') # 打開 wav 文件。 wf.setnchannels(CHANNELS) # 聲道設置 wf.setsampwidth(p.get_sample_size(FORMAT)) # 采樣位數設置 wf.setframerate(RATE) # 采樣頻率設置 for _ in range(0, int(RATE * record_second / CHUNK)): data = stream.read(CHUNK) wf.writeframes(data) # 寫入數據 stream.stop_stream() # 關閉流 stream.close() p.terminate() wf.close()先用正常代碼邏輯思維解釋下,其中涉及到的專業名詞,繼續往下看,后面會有相應的解釋。
首先對 pyaudio 庫進行實例化。用其生成的實例化對象對數據流進行相應的打開,也就是 open 函數。在這塊,分別傳入了參數,采樣位數、聲道、采樣頻率,以及最后的緩沖區幀數。
調用 Python 自帶的 wave 庫,再次進行寫入 wav 的相關設置。此處的操作類似 Python 寫 txt ,只不過多了點音頻設置而已。
用 采樣頻率 * 音頻秒數/ 每個緩沖區幀數 ,得到的就是你要寫入多少個塊緩沖區的數量。最終,只需要每次循環寫入固定的 1024,一共循環得出的多少個塊緩沖區。即可得到最終的數據。
這里的公式計算,如果在不了解下述基礎概念之前,是很難理解的。
音頻基礎知識普及
看了上面的代碼解釋,是不是一臉懵逼。來普及下所涉及到的專業名詞。
首先, wav 和 mp3 的后綴結尾,有什么不同?
其次,關鍵的名詞解釋。
采樣位數:可以理解數字音頻設備處理聲音的解析度,即對聲音的辨析度。就像表示顏色的位數一樣(8位表示256種顏色,16位表示65536種顏色),有8位,16位等。這個數越大,解析度就越高,錄制和回放的聲音也就越真實。
采樣頻率:就是對聲音信息1秒鐘采樣多少次,以記錄成數字信息。如CD音頻是44.1KHz采樣率,它對聲音以每秒44100次的頻率來記錄信息。原則上采樣率越高,聲音的質量越好。
截取了一段百度百科的例子,關于采樣頻率的設定,代碼中選擇的即 44100 Hz 。
每個緩沖區幀數:通俗的舉個例子,你手里有 102400 塊錢,現在要上交給女朋友。但是,你心想一口氣全給她,怕撐爆了她的錢包。于是你定了一個值,每次只給她 1024 元。
這里的 1024 元即每個緩存區的幀數。你想全部上交,需要幾次才能完成呢?是不是得重復上交這個動作 100 次!此時,這里的 100 次,便對應了上述代碼的循環次數,即公式算出來的有多少個塊緩存區。
弄懂音頻基礎知識后,再去回看代碼,你會發現那些參數的意義就一目了然了。
播放功能實現
有了以上知識點,對于讀文件來說,就相當 easy 了!直接放上核心代碼:
def play_audio(wave_input_path): p = pyaudio.PyAudio() # 實例化 wf = wave.open(wave_input_path, 'rb') # 讀 wav 文件 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) # 讀數據 while len(data) > 0: stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() # 關閉資源 stream.close() p.terminate()讀文件的話,沒有什么可講的,我是直接從官方文檔的例子中 copy 的,修改了一下相應的參數,即可實現。
總結
總的來說,音頻的操作,Python中的 PyAudio 庫是非常友好的,當然,經過各種查閱資料,發現在寫入音頻文件時,不同人有不同的寫法,而文中的這套公式算法,應該是較為簡潔的一種。
老規矩,有想要本章全部源碼的同學,后臺回復 音頻 ,即可獲得地址。
文中關于音頻的解釋,哪里有錯誤,歡迎評論區留言指出!
總結
以上是生活随笔為你收集整理的python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《日长》是哪个时期的作品?
- 下一篇: 吗 使用的是_论文是可以反复使用吗?