樹莓派學習之旅(2)— 使用USB聲卡進行錄音

樹莓派學習之旅(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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章