從網(wǎng)上看到一本關(guān)于樹(shù)莓派的電子書 Raspberry Pi for Secret Agents,利用樹(shù)莓派打造“特工裝備”。
其中有一章講到音頻設(shè)備的配置和幾個(gè)相關(guān)的應(yīng)用場(chǎng)景(比如錄音、監(jiān)聽(tīng)、搭建電話系統(tǒng)等),感覺(jué)比較有意思。
一、音頻系統(tǒng)簡(jiǎn)單配置
1. ALSA
ALSA (Advanced Linux Sound Architecture) 是一個(gè)承載樹(shù)莓派上音頻系統(tǒng)的底層框架,為樹(shù)莓派及其外接的播放或錄制設(shè)備提供內(nèi)核驅(qū)動(dòng)程序。同時(shí)該框架也包含用于制作音頻應(yīng)用的程序代碼,和一些方便的命令行實(shí)用程序。
在 ALSA 的定義里,系統(tǒng)中的每一個(gè)音頻設(shè)備都稱作“聲卡”。可以使用如下命令列出所有已連接的音頻設(shè)備:
$ cat /proc/asound/cards 0 [ALSA ]: bcm2835_alsa - bcm2835 ALSA bcm2835 ALSA可以看到此時(shí)系統(tǒng)中只有樹(shù)莓派默認(rèn)的聲卡 0 bcm2835 ALSA。
2. 調(diào)節(jié)音量大小
可以使用 alsamixer 命令打開(kāi) AlsaMixer 實(shí)用程序,對(duì)音量等聲音系統(tǒng)參數(shù)進(jìn)行調(diào)節(jié):
alsamixer
界面中 View 選項(xiàng)后面的 Playback、Capture、All 分別對(duì)應(yīng)播放、錄制和全部。
可以按鍵盤上的 TAB 鍵切換到對(duì)應(yīng)的界面。按下 fn+F6 或 S 鍵切換聲卡設(shè)備(此時(shí)只有一個(gè)聲卡)
使用 ↑ ↓ 方向鍵調(diào)節(jié)音量,設(shè)置完成后按 ESC 鍵退出 AlsaMixer。
3. 切換音頻輸出
樹(shù)莓派提供兩種音頻輸出接口:3.5mm 模擬音頻接口和 HDMI。
可以通過(guò) $sudo raspi-config 命令(選擇 Advanced Options - Audio)配置音頻輸出方向,使音頻輸出固定使用 3.5mm 接口或 HDMI:
raspi-config
類似的操作也可以直接通過(guò) amixer 命令完成:
$ amixer cset numid=3 1 :指定音頻輸出接口為 3.5mm 耳機(jī)接口
$ amixer cset numid=3 2 :指定音頻輸出接口為 HDMI
$ amixer cset numid=3 1numid=3,iface=MIXER,name='PCM Playback Route' ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0 : values=14. 播放測(cè)試
可以使用 $ speaker-test -c2 -t wav 命令測(cè)試音頻播放是否正常。
如一切順利,則會(huì)依次從左耳耳機(jī)(或音箱)聽(tīng)到 Front Left,從右耳耳機(jī)聽(tīng)到 Front Right 的女聲語(yǔ)音,直到按下 Ctrl + C 終止測(cè)試。
二、音頻錄制設(shè)備
1. USB聲卡
樹(shù)莓派提供的音頻接口是不支持語(yǔ)音輸入的。
使用 alsamixer 命令進(jìn)入 AlsaMixer 程序,按下 TAB 鍵切換到 Caputre 界面,可以看到此設(shè)備無(wú)音頻采集控制的提示:
bcm2835 ALSA Capture
為了錄制音頻,需要使用外接的音頻輸入設(shè)備??梢詮木W(wǎng)上購(gòu)買一個(gè)便攜式的 USB 免驅(qū)動(dòng)聲卡。
USB聲卡及線控耳機(jī)
插入U(xiǎn)SB聲卡后,通過(guò) $ cat /proc/asound/cards 命令查看當(dāng)前系統(tǒng)檢測(cè)到的音頻設(shè)備:$ cat /proc/asound/cards 0 [ALSA ]: bcm2835_alsa - bcm2835 ALSA bcm2835 ALSA 1 [Device ]: USB-Audio - USB Audio Device GeneralPlus USB Audio Device at usb-3f980000.usb-1.3, full speed此時(shí)輸出信息中多了一個(gè)序號(hào)為 1 的聲卡設(shè)備 USB-Audio。
可以使用 $ speaker-test -D plughw:1 -c2 -t wav 測(cè)試 USB 聲卡的音頻播放是否正常(注意命令中的 -D plughw:1)。
使用 alsamixer -c1 命令調(diào)節(jié)新聲卡的具體參數(shù)。其中 -c1 選項(xiàng)用于指定編號(hào)為 1 的聲卡設(shè)備,即新插入的 USB 聲卡。
alsamixer -c1
按下 fn+F4 或 TAB 鍵將視圖切換到 Capture 界面,確保 Mic 上方有出現(xiàn) CAPTURE 字樣(說(shuō)明已開(kāi)啟錄制功能,可以使用空格鍵切換開(kāi)關(guān)狀態(tài)):
Capture
2. 麥克風(fēng)測(cè)試
首先安裝
SoX 工具及其 mp3 格式支持:$sudo apt-get install sox libsox-fmt-mp3
SoX 是 Linux 系統(tǒng)上一個(gè)強(qiáng)大的音頻處理工具,詳細(xì)使用方法可以參考這篇文章:
SoX — 音頻處理工具里的瑞士軍刀。
sox 命令的基本格式為 sox <input> <output> 。其中的 <input> 和 <output> 既可以是某個(gè)具體的音頻文件,也可以是某個(gè)特定的音頻設(shè)備。
所以可以簡(jiǎn)單的理解為,sox 工具就是對(duì)音頻進(jìn)行“傳導(dǎo)”:
從文件到設(shè)備即為播放 sox music.mp3 <device>
從設(shè)備到文件即為錄制 sox <device> myrec.wav
從文件到文件即為轉(zhuǎn)碼 sox input.wav output.mp3
可以使用 $ sox -t alsa plughw:1 -t alsa plughw:1 命令對(duì)麥克風(fēng)進(jìn)行測(cè)試。
其中 -t alsa plughw:1 表示 ALSA 聲卡設(shè)備 1(即USB聲卡)。
上述命令表示既使用USB聲卡(麥克風(fēng)) 作為音頻輸入,又用它(耳機(jī))作為音頻輸出。
如一切正常,此時(shí)可以通過(guò)耳機(jī)聽(tīng)到自己對(duì)著麥克風(fēng)講話的聲音。
3. 切換默認(rèn)的音頻設(shè)備
可以通過(guò)修改配置文件,將樹(shù)莓派默認(rèn)用于播放和錄制的音頻設(shè)備(即樹(shù)莓派內(nèi)置聲卡),改為當(dāng)前插入的USB聲卡。
編輯 ~/.asoundrc 文件,改為如下內(nèi)容:
pcm.!default { type hw card 1}ctl.!default { type hw card 1}其實(shí)就是將配置文件中的 card 0 改為 card 1。
此時(shí)可直接使用 $ sox -d -d 命令測(cè)試USB聲卡上連接的麥克風(fēng)和耳機(jī),無(wú)需再通過(guò) -t alsa plughw:1 選項(xiàng)手動(dòng)指定USB聲卡(-d 選項(xiàng)表示默認(rèn)音頻設(shè)備,即已配置成默認(rèn)的USB聲卡)。
4. 錄制與播放
默認(rèn)音頻設(shè)備切換為USB聲卡后,可以使用以下命令錄制一段音頻并將其保存在 myrec.mp3 文件中:
$ sox -d myrec.mp3 或 $ rec myrec.mp3
播放前面錄制的音頻文件可使用如下命令:
$ sox myrec.mp3 -d 或 $ play myrec.mp3
如未能配置USB聲卡為默認(rèn)音頻設(shè)備或配置不成功,也可以使用如下命令進(jìn)行錄制與播放:
錄制:$ sox -t alsa plughw:1 myrec.mp3
播放:$ sox myrec.mp3 -t alsa plughw:1
錄制固定長(zhǎng)度的音頻片段(如 30 分鐘)并保存在指定文件中:
$ sox -t alsa plughw:1 myrec.wav trim 0 00:30:00
持續(xù)錄制很長(zhǎng)時(shí)間的音頻,保存在幾個(gè)不同的文件中,每隔一小時(shí)保存一次:
$ sox -t alsa plughw:1 myrec.wav trim 0 01:00:00 : newfile : restart
三、遠(yuǎn)程監(jiān)聽(tīng)
可以通過(guò)樹(shù)莓派的 SSH 服務(wù),在另一臺(tái)電腦上遠(yuǎn)程收聽(tīng)樹(shù)莓派通過(guò)USB聲卡收集到的音頻數(shù)據(jù)。
也就是說(shuō),用樹(shù)莓派的麥克風(fēng)錄制周圍環(huán)境的聲音,同時(shí)在遠(yuǎn)程的另一臺(tái)電腦上實(shí)時(shí)地(有短暫延遲)收聽(tīng)錄制的內(nèi)容,達(dá)到監(jiān)聽(tīng)的效果。
在電腦端(也需要安裝 sox 程序)執(zhí)行如下命令即可:
$ ssh pi@[IP address] sox -t alsa plughw:1 -t sox - | sox -q -t sox - -d
sox
對(duì)于 Windows 系統(tǒng),除安裝 SoX 工具外,還需要先下載完整版
PuTTY 工具,并確保這兩個(gè)工具的安裝路徑都已添加至 PATH 環(huán)境變量。
則可以使用如下命令通過(guò)樹(shù)莓派進(jìn)行遠(yuǎn)程監(jiān)聽(tīng):
plink pi@[IP address] -pw [password] sox -t alsa plughw:1 -t sox - | sox -q -t sox - -t waveaudio default
可以使用如下命令,將遠(yuǎn)程樹(shù)莓派收集到的音頻數(shù)據(jù)直接保存在本地文件中:
$ ssh pi@[IP address] sox -t alsa plughw:1 -t mp3 - > ~/Desktop/myrec.mp3
或 plink pi@[IP address] sox -t alsa plughw:1 -t mp3 - > D:\myrec.mp3 (Windows 系統(tǒng))
使用如下命令,讓本地電腦作為音頻輸入源,將其麥克風(fēng)收集到的音頻數(shù)據(jù),通過(guò) SSH 發(fā)送到遠(yuǎn)程樹(shù)莓派上進(jìn)行播放。
也就是將自己對(duì)著本地電腦講的話通過(guò)樹(shù)莓派進(jìn)行遠(yuǎn)程廣播:
$ sox -d -t sox - | ssh pi@[IP address] sox -q -t sox - -d
或 sox -t waveaudio default -t sox - | plink pi@[IP address] -pw [password] sox -q -t sox - -d (Windows 系統(tǒng))
同樣的原理,也可以將本地磁盤上的音頻文件直接發(fā)送到遠(yuǎn)程的樹(shù)莓派上進(jìn)行播放:
$ cat ~/Desktop/media/audios/Faded.wav | ssh pi@[IP address] sox -t wav - -d
或 type D:\myrec.mp3 | plink pi@[IP address] -pw [password] sox -t mp3 - -d(Windows 系統(tǒng))
四、藍(lán)牙耳機(jī)
樹(shù)莓派 3 代 B+ 自帶了 WIFI 和藍(lán)牙功能,可以直接通過(guò)藍(lán)牙連接音頻設(shè)備。
1. 使用 hciconfig 命令獲取藍(lán)牙模塊的相關(guān)信息:
$ hciconfig -ahci0: Type: Primary Bus: UART BD Address: B8:27:EB:C3:38:31 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:4181 acl:136 sco:0 events:135 errors:0 TX bytes:5065 acl:128 sco:0 commands:60 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'raspberrypi' Class: 0x480000 Service Classes: Capturing, Telephony Device Class: Miscellaneous, HCI Version: 4.2 (0x8) Revision: 0xfc LMP Version: 4.2 (0x8) Subversion: 0x6119 Manufacturer: Broadcom Corporation (15)2. 使用 hcitool scan 命令掃描附近可供連接的藍(lán)牙設(shè)備,并記下藍(lán)牙耳機(jī)對(duì)應(yīng)的 MAC 地址
$ hcitool scanScanning ... FC:58:FA:F4:67:33 A2 50:8F:4C:0D:31:3A Starky3. 通過(guò) MAC 地址與藍(lán)牙耳機(jī)進(jìn)行配對(duì)
使用 bluetoothctl 命令進(jìn)入藍(lán)牙控制臺(tái),依次通過(guò) power on 、agent on 、scan on 、pair 、trust 、connect 等命令連接藍(lán)牙設(shè)備。
注意此處連接藍(lán)牙使用的是藍(lán)牙設(shè)備的 MAC 地址。
$ bluetoothctl[NEW] Controller B8:27:EB:C3:38:31 raspberrypi [default][NEW] Device 50:8F:4C:0D:31:3A Starky...[bluetooth]# power onChanging power on succeeded[bluetooth]# agent onAgent registered[bluetooth]# scan onDiscovery started[bluetooth]# pair FC:58:FA:F4:67:33Attempting to pair with FC:58:FA:F4:67:33Pairing successful[bluetooth]# trust FC:58:FA:F4:67:33[CHG] Device FC:58:FA:F4:67:33 Trusted: yesChanging FC:58:FA:F4:67:33 trust succeeded[bluetooth]# connect FC:58:FA:F4:67:33Attempting to connect to FC:58:FA:F4:67:33[CHG] Device FC:58:FA:F4:67:33 Connected: yesConnection successful[A2]#退出藍(lán)牙控制臺(tái),使用 hcitool con 命令查看當(dāng)前已連接的藍(lán)牙設(shè)備,確認(rèn)連接成功:
$ hcitool conConnections: > ACL FC:58:FA:F4:67:33 handle 11 state 1 lm SLAVE AUTH ENCRYPT4. 將音頻輸出設(shè)備切換為藍(lán)牙耳機(jī)
首先安裝 PulseAudio 軟件包:
$ sudo apt-get install pulseaudio pulseaudio-module-bluetooth
啟動(dòng) PulseAudio 守護(hù)進(jìn)程:
$ pulseaudio --start
列出 PulseAudio 檢測(cè)到的音頻設(shè)備名稱:
$ pacmd list-sinks short | grep -e 'name:' name: <alsa_output.platform-soc_audio.analog-mono> name: <bluez_sink.FC_58_FA_F4_67_33.headset_head_unit>使用 pactl 命令將藍(lán)牙耳機(jī)作為默認(rèn)的音頻設(shè)備:
$ pactl set-default-sink bluez_sink.FC_58_FA_F4_67_33.headset_head_unit
此時(shí),即可直接使用 play 命令通過(guò)藍(lán)牙耳機(jī)播放音頻文件:
image.png
如果需要將音頻輸出切換回系統(tǒng)默認(rèn),運(yùn)行如下命令即可:
$ pactl set-default-sink alsa_output.platform-soc_audio.analog-mono
或者自己對(duì)當(dāng)前的音頻配置有點(diǎn)混亂了。。??梢允褂萌缦旅钪刂茫?div style="height:15px;">
5. 注意事項(xiàng)
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)藍(lán)牙耳機(jī)連接后音質(zhì)相差太大,播放速度明顯放緩,未確定是哪里的問(wèn)題。
同時(shí)我的藍(lán)牙耳機(jī)開(kāi)啟后會(huì)自動(dòng)連接至樹(shù)莓派,如無(wú)法自動(dòng)連接或者連接以后并沒(méi)有被 PulseAudio 檢測(cè)到,可以先使用 bluetoothctl 命令進(jìn)入藍(lán)牙控制臺(tái):
依次輸入 power off、power on 命令重啟藍(lán)牙,使用 connect <MAC address> 命令重新連接藍(lán)牙耳機(jī)(無(wú)需再配對(duì)和信任,直接連接)。
藍(lán)牙耳機(jī)為默認(rèn)音頻設(shè)備后,之前配置 USB 聲卡為默認(rèn)的操作不再生效(除非斷開(kāi)藍(lán)牙或關(guān)閉藍(lán)牙耳機(jī))。
如 $ sox -t alsa plughw:1 -d :使用 USB 聲卡作為音頻輸入源,再將采集到的音頻輸出到默認(rèn)設(shè)備(藍(lán)牙耳機(jī))
即 Voice over Internet Protocol ,就是將聲音信號(hào)經(jīng)過(guò)壓縮與封包之后,以數(shù)據(jù)封包的形式在IP網(wǎng)絡(luò)間進(jìn)行傳輸。通俗地說(shuō)也就是互聯(lián)網(wǎng)電話或IP電話。
1. 安裝 SIP Witch
2. 編輯配置文件
<user id="phone1"> <extension>201</extension> <secret>SecretSauce201</secret> <display>Agent 201</display></user><user id="phone2"> <extension>202</extension> <secret>SecretSauce202</secret> <display>Agent 202</display></user>其中的 id 表示注冊(cè)用戶登錄時(shí)需要輸入的用戶名,<secret> 表示登錄時(shí)使用的密碼。
3. 客戶端配置