本文將以Linux開發板為基礎,使用ALSA音頻框架和C#語言,演示如何實現基礎的音頻錄制與播放功能。
1. 背景
音頻處理是嵌入式開發中常見的需求,無論是語音交互、環境監測還是多媒體應用都離不開音頻模塊的支持。在Linux系統中,ALSA(Advanced Linux Sound Architecture)是一個成熟的音頻框架,提供了豐富的音頻處理接口,支持音頻的錄制、播放、混音等功能。而C#語言作為一種跨平臺的高級語言,也有著廣泛的應用場景,通過.NET技術,我們可以在Linux系統中使用C#語言進行開發。
解決了.NET IOT 設備的音頻處理的基礎需求,我們就可以在此基礎上實現更多的功能,比如關鍵詞喚醒,接入大模型的語音交互功能等。
2. 環境準備
在開始之前,我們需要準備一些基礎的環境。
2.1. 硬件要求
- 搭載Linux系統的開發板(如樹莓派、Jetson Nano、D-Robotics、OrangePi、Luckfox 等)
- 支持ALSA驅動的音頻輸入/輸出設備(板載聲卡或USB聲卡)
- 一定的存儲空間和內存
這里的演示我們以 Luckfox 開發板為例,其他開發板也可以根據實際情況進行調整。對于音頻輸入/輸出設備,Luckfox Pico Ultra 板載了貼片麥克風,并有一個MX1.25 2P 連接器,支持接入 8Ω 1W 喇叭。對于樹莓派或 Jetson Nano 可以在微雪官網找到對應的音頻擴展板,也可以使用USB聲卡,根據實際需求進行選擇。
2.2. 軟件依賴
首先,建議安裝好.NET 環境,.NET 8 或 .NET 9 都可以。當然也可以選擇在本地開發完畢后發布非框架依賴的版本到開發板上運行。但是,這樣傳輸不便,畢竟文件較大。直接在開發板上開發,也是非常不建議的,因為開發板的性能有限,開發效率低下,編譯時間長。
其次,需要安裝 ALSA 的開發庫,以便在C#中調用ALSA的接口。在Ubuntu系統中,可以通過以下命令安裝:
sudo apt-get install libasound2-dev
同時,為了方便我們使用音頻設備,需要將當前用戶添加到音頻組中,以便在無需 sudo
訪問音頻設備。可以通過以下命令添加:
sudo usermod -a -G audio $USER
加入音頻組后,需要重新登錄或重啟系統,使用戶組生效。
2.3. 音頻配置
在開始之前,我們需要確認音頻設備可以正常使用。可以通過以下命令查看當前系統的音頻設備信息:
arecord -l
aplay -l
同時我們可以對音頻設備進行簡單的測試:
arecord -f S16_LE -r 16000 -c 2 -d 5 test.wav
aplay test.wav
上面的命令使用的是默認的音頻設備,如果有多個音頻設備,可以通過 -D
參數指定設備名稱。如果能夠正常錄制和播放音頻,則說明音頻設備可以正常使用。
為了提高麥克風收音范圍和播放的音量大小,我們可以通過以下命令調整麥克風增益以及播放音量:
amixer cset name='ADC ALC Left Volume' 26
amixer cset name='ADC ALC Right Volume' 6
amixer cset name='ADC Digital Left Volume' 195
amixer cset name='ADC Digital Right Volume' 195
amixer cset name='ADC MIC Left Gain' 3
amixer cset name='ADC MICBIAS Voltage' 'VREFx0_975'
amixer cset name='ADC Mode' 'SingadcL'
amixer cset name='DAC LINEOUT Volume' 30
不同的設備可能有不同的音頻控制器,可以通過 amixer scontrols
查看當前設備支持的音頻控制器,然后通過 amixer scontents
查看具體的控制器名稱和取值范圍。
需要注意的是,有的 name
可能需要增加一個 Volume
后綴,同時需要注意取值范圍,不要設置過大或過小,以免損壞設備。對于不同的設備,可能存在不一樣的地方,可以根據實際情況進行調整。主要就是調整麥克風的增益和提高偏置電壓,以適應不同的環境。
當然,除了指令外,也可以通過 alsamixer
命令進入交互式界面進行調整,可以參考 Luckfox 開發板的音頻配置文檔。
3. 編寫代碼
首先我們需要進行項目的初始化,可以通過以下命令創建一個新的控制臺應用程序。同時,我們需要安裝一個用于操作ALSA的.NET庫 Alsa.Net
,這個庫實現了對ALSA的封裝,方便我們在.NET中調用ALSA的接口。
dotnet new console -n AudioDemo
cd AudioDemo
dotnet add package Alsa.Net
完整的代碼如下:
using Alsa.Net;class Program
{static void Main(string[] args){var settings = new SoundDeviceSettings{MixerDeviceName = "hw:0", // 混音設備PlaybackDeviceName = "hw:0", // 播放設備RecordingDeviceName = "hw:0", // 錄音設備RecordingSampleRate = 16_000 // 16kHz采樣率};using var alsaDevice = AlsaDeviceBuilder.Create(settings);// 錄制10秒音頻Console.WriteLine("開始錄音...");alsaDevice.Record(10, "output.wav");// 播放錄制的音頻Console.WriteLine("播放音頻...");alsaDevice.Play("output.wav");}
}
在代碼中,我們首先創建了一個 SoundDeviceSettings
對象,用于指定音頻設備的名稱和采樣率。然后通過 AlsaDeviceBuilder.Create
方法創建一個 AlsaDevice
對象,用于操作音頻設備。在 AlsaDevice
對象中,我們可以調用 Record
方法錄制音頻,或者調用 Play
方法播放音頻。hw:0
表示使用第一個硬件設備,可通過aplay -l
查看可用設備。16kHz適用于語音場景,音樂場景建議使用44.1kHz或48kHz。
編寫好代碼后,我們就可以發布到開發板上運行了,對于 Luckfox 開發板記得選則 arm
架構,其他開發板根據實際情況進行選擇。
4. 總結
通過ALSA框架與C#的結合,開發者可以快速在Linux嵌入式設備上實現音頻功能。本文展示了基礎的錄音/播放實現,實際項目中還需要考慮更多的優化和使用方式,具體的可以前往 Alsa.Net
項目倉庫查看更多的使用方法。需要注意的是,因為設備和系統的差異,以及項目更新的問題,可能會出現一些部分接口不支持的情況,需要根據實際情況進行調整。