樹莓派學習之旅(2)— 使用USB聲卡進行錄音
一、USB聲卡的接入
在插入USB聲卡之前,我們使用 lsusb
命令查看一下USB設備:
然後把USB聲卡插上,再使用lsusb
查看一下,可以看到,多出來的那個就是USB聲卡:
然後使用arecord -l
可以列出所有錄音設備,可以看到,我們的USB聲卡設備
而使用aplay -l
可以列出所有播放設備
參考自:https://segmentfault.com/a/1190000013854294
二、USB聲卡的使用
直接執行Linux自帶的錄音命令,錄製一段5秒的聲音進行測試
arecord -D "plughw:1,0" -f S16_LE -r 16000 -d 5 -t wav test.wav
其中 hw:1,0
表示card 1 , device 0
,即我們的USB聲卡,arecord 其他的參數如下:
指令 | 含義 | 本指令含義 |
---|---|---|
-D | 選擇設備名稱 | 使用外接USB聲卡"plughw:1,0" |
-f | 錄音格式 | S16_LE代表有符號16位小端序 |
-r | 採樣率 | 16000是16KHz採樣 |
-d | 錄音時長 | 錄音5秒 |
-t | 錄音格式 | wav格式 |
test.wav | 文件名,可以包含路徑 | 文件名字叫test.wav |
如果聲音過小,輸入命令 alsamixer
,來對音量進行調整,按下F6
,選擇USB聲卡,
然後按下F5
,將錄音和播音設備都展示出來,因爲我的USB聲卡只支持錄音,所以播音的音量無法調整,我們將錄音的音量按上鍵調高
然後使用aplay
命令來播放
aplay -D "plughw:0,0" test.wav
如果錄音有問題,可能是缺少一些錄音軟件
sudo apt-get install alsa-utils ulseaudio
三、PyAudio安裝即配置
如果沒有安裝pip3,使用如下命令安裝
sudo apt-get install python3-pip
需要安裝一些依賴庫:
sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 pulseaudio
sudo apt-get install libatlas-base-dev alsa-utils alsa-tools alsa-tools-gui alsamixergui -y
然後我們指定清華的源進行安裝pyaudio,如果想要長期換源,可以參考:
pip3 install pyaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
在使用時我們需要配置默認使用的聲卡,在$HOME下新建.asoundrc,
然後輸入以下內容,其中,hw:1,0
表示card 1 device 0
,即我們的USB聲卡
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "plughw:0,0"
}
capture.pcm {
type plug
slave.pcm "plughw:1,0"
}
參考自:樹莓派使用USB聲卡設置
四、使用Pyaudio錄音
參考我的Python博客:https://blog.csdn.net/qq_38113006/article/details/105694458#t3 編寫Pyaudio錄音程序:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: William
#使用pyaudio實現錄音
import pyaudio,wave,sys
from tqdm import tqdm
TIME = 5 #錄音時間
# 如果沒有參數,就將輸出文件設置爲'01.wav'
if len(sys.argv) == 1:
file_name = "01.wav"
else:
file_name = sys.argv[1]
def main():
# 實例化一個PyAudio對象
pa = pyaudio.PyAudio()
# 打開聲卡,設置 採樣深度爲16位、聲道數爲2、採樣率爲16K、輸入、採樣點緩存數量爲2048
stream = pa.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=2048)
# 新建一個列表,用來存儲採樣到的數據
record_buf = []
# 開始採樣
for i in tqdm(range( 8 * 5 )): # 錄音5秒
audio_data = stream.read(2048) # 讀出聲卡緩衝區的音頻數據
record_buf.append(audio_data) # 將讀出的音頻數據追加到record_buf列表
wf = wave.open(file_name, 'wb') # 創建一個音頻文件,名字爲“01.wav"
wf.setnchannels(1) # 設置聲道數爲2
wf.setsampwidth(2) # 設置採樣深度爲2個字節,即16位
wf.setframerate(16000) # 設置採樣率爲16000
# 將數據寫入創建的音頻文件
wf.writeframes("".encode().join(record_buf))
# 寫完後將文件關閉
wf.close()
# 停止聲卡
stream.stop_stream()
# 關閉聲卡
stream.close()
# 終止pyaudio
pa.terminate()
if __name__ == '__main__':
main()