在Linux開(kāi)發(fā)板中使用.NET實(shí)現(xiàn)音頻錄制與播放功能
1. 背景
音頻處理是嵌入式開(kāi)發(fā)中常見(jiàn)的需求,無(wú)論是語(yǔ)音交互、環(huán)境監(jiān)測(cè)還是多媒體應(yīng)用都離不開(kāi)音頻模塊的支持。在Linux系統(tǒng)中,ALSA(Advanced Linux Sound Architecture)是一個(gè)成熟的音頻框架,提供了豐富的音頻處理接口,支持音頻的錄制、播放、混音等功能。而C#語(yǔ)言作為一種跨平臺(tái)的高級(jí)語(yǔ)言,也有著廣泛的應(yīng)用場(chǎng)景,通過(guò).NET技術(shù),我們可以在Linux系統(tǒng)中使用C#語(yǔ)言進(jìn)行開(kāi)發(fā)。
解決了.NET IOT 設(shè)備的音頻處理的基礎(chǔ)需求,我們就可以在此基礎(chǔ)上實(shí)現(xiàn)更多的功能,比如關(guān)鍵詞喚醒,接入大模型的語(yǔ)音交互功能等。
2. 環(huán)境準(zhǔn)備
在開(kāi)始之前,我們需要準(zhǔn)備一些基礎(chǔ)的環(huán)境。
- 搭載Linux系統(tǒng)的開(kāi)發(fā)板(如樹(shù)莓派、Jetson Nano、D-Robotics、OrangePi、Luckfox 等)
- 支持ALSA驅(qū)動(dòng)的音頻輸入/輸出設(shè)備(板載聲卡或USB聲卡)
- 一定的存儲(chǔ)空間和內(nèi)存
這里的演示我們以 Luckfox 開(kāi)發(fā)板為例,其他開(kāi)發(fā)板也可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。對(duì)于音頻輸入/輸出設(shè)備,Luckfox Pico Ultra 板載了貼片麥克風(fēng),并有一個(gè)MX1.25 2P 連接器,支持接入 8Ω 1W 喇叭。對(duì)于樹(shù)莓派或 Jetson Nano 可以在微雪官網(wǎng)找到對(duì)應(yīng)的音頻擴(kuò)展板,也可以使用USB聲卡,根據(jù)實(shí)際需求進(jìn)行選擇。
2.2. 軟件依賴(lài)
首先,建議安裝好.NET 環(huán)境,.NET 8 或 .NET 9 都可以。當(dāng)然也可以選擇在本地開(kāi)發(fā)完畢后發(fā)布非框架依賴(lài)的版本到開(kāi)發(fā)板上運(yùn)行。但是,這樣傳輸不便,畢竟文件較大。直接在開(kāi)發(fā)板上開(kāi)發(fā),也是非常不建議的,因?yàn)殚_(kāi)發(fā)板的性能有限,開(kāi)發(fā)效率低下,編譯時(shí)間長(zhǎng)。
其次,需要安裝 ALSA 的開(kāi)發(fā)庫(kù),以便在C#中調(diào)用ALSA的接口。在Ubuntu系統(tǒng)中,可以通過(guò)以下命令安裝:
sudo apt-get install libasound2-dev
同時(shí),為了方便我們使用音頻設(shè)備,需要將當(dāng)前用戶(hù)添加到音頻組中,以便在無(wú)需 sudo
訪(fǎng)問(wèn)音頻設(shè)備??梢酝ㄟ^(guò)以下命令添加:
sudo usermod -a -G audio $USER
加入音頻組后,需要重新登錄或重啟系統(tǒng),使用戶(hù)組生效。
2.3. 音頻配置
在開(kāi)始之前,我們需要確認(rèn)音頻設(shè)備可以正常使用??梢酝ㄟ^(guò)以下命令查看當(dāng)前系統(tǒng)的音頻設(shè)備信息:
arecord -l aplay -l
同時(shí)我們可以對(duì)音頻設(shè)備進(jìn)行簡(jiǎn)單的測(cè)試:
arecord -f S16_LE -r 16000 -c 2 -d 5 test.wav aplay test.wav
上面的命令使用的是默認(rèn)的音頻設(shè)備,如果有多個(gè)音頻設(shè)備,可以通過(guò) -D
參數(shù)指定設(shè)備名稱(chēng)。如果能夠正常錄制和播放音頻,則說(shuō)明音頻設(shè)備可以正常使用。
為了提高麥克風(fēng)收音范圍和播放的音量大小,我們可以通過(guò)以下命令調(diào)整麥克風(fēng)增益以及播放音量:
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
不同的設(shè)備可能有不同的音頻控制器,可以通過(guò) amixer scontrols 查看當(dāng)前設(shè)備支持的音頻控制器,然后通過(guò) amixer scontents 查看具體的控制器名稱(chēng)和取值范圍。
需要注意的是,有的 name 可能需要增加一個(gè) Volume 后綴,同時(shí)需要注意取值范圍,不要設(shè)置過(guò)大或過(guò)小,以免損壞設(shè)備。對(duì)于不同的設(shè)備,可能存在不一樣的地方,可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。主要就是調(diào)整麥克風(fēng)的增益和提高偏置電壓,以適應(yīng)不同的環(huán)境。
當(dāng)然,除了指令外,也可以通過(guò) alsamixer
命令進(jìn)入交互式界面進(jìn)行調(diào)整,可以參考 Luckfox 開(kāi)發(fā)板的音頻配置文檔。
3. 編寫(xiě)代碼
首先我們需要進(jìn)行項(xiàng)目的初始化,可以通過(guò)以下命令創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序。同時(shí),我們需要安裝一個(gè)用于操作ALSA的.NET庫(kù) Alsa.Net,這個(gè)庫(kù)實(shí)現(xiàn)了對(duì)ALSA的封裝,方便我們?cè)?NET中調(diào)用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", // 混音設(shè)備 PlaybackDeviceName = "hw:0", // 播放設(shè)備 RecordingDeviceName = "hw:0", // 錄音設(shè)備 RecordingSampleRate = 16_000 // 16kHz采樣率 }; using var alsaDevice = AlsaDeviceBuilder.Create(settings); // 錄制10秒音頻 Console.WriteLine("開(kāi)始錄音..."); alsaDevice.Record(10, "output.wav"); // 播放錄制的音頻 Console.WriteLine("播放音頻..."); alsaDevice.Play("output.wav"); } }
在代碼中,我們首先創(chuàng)建了一個(gè) SoundDeviceSettings 對(duì)象,用于指定音頻設(shè)備的名稱(chēng)和采樣率。然后通過(guò) AlsaDeviceBuilder.Create 方法創(chuàng)建一個(gè) AlsaDevice 對(duì)象,用于操作音頻設(shè)備。在 AlsaDevice 對(duì)象中,我們可以調(diào)用 Record 方法錄制音頻,或者調(diào)用 Play 方法播放音頻。hw:0 表示使用第一個(gè)硬件設(shè)備,可通過(guò)aplay -l查看可用設(shè)備。16kHz適用于語(yǔ)音場(chǎng)景,音樂(lè)場(chǎng)景建議使用44.1kHz或48kHz。
編寫(xiě)好代碼后,我們就可以發(fā)布到開(kāi)發(fā)板上運(yùn)行了,對(duì)于 Luckfox 開(kāi)發(fā)板記得選則 arm 架構(gòu),其他開(kāi)發(fā)板根據(jù)實(shí)際情況進(jìn)行選擇。
4. 總結(jié)
通過(guò)ALSA框架與C#的結(jié)合,開(kāi)發(fā)者可以快速在Linux嵌入式設(shè)備上實(shí)現(xiàn)音頻功能。本文展示了基礎(chǔ)的錄音/播放實(shí)現(xiàn),實(shí)際項(xiàng)目中還需要考慮更多的優(yōu)化和使用方式,具體的可以前往 Alsa.Net 項(xiàng)目倉(cāng)庫(kù)查看更多的使用方法。需要注意的是,因?yàn)樵O(shè)備和系統(tǒng)的差異,以及項(xiàng)目更新的問(wèn)題,可能會(huì)出現(xiàn)一些部分接口不支持的情況,需要根據(jù)實(shí)際情況進(jìn)行調(diào)整。
以上就是在Linux開(kāi)發(fā)板中使用.NET實(shí)現(xiàn)音頻錄制與播放功能的詳細(xì)內(nèi)容,更多關(guān)于Linux .NET音頻錄制與播放的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CentOs下手動(dòng)升級(jí)node版本的方法
這篇文章主要介紹了CentOs下手動(dòng)升級(jí)node版本的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11rsync如何實(shí)現(xiàn)斷點(diǎn)續(xù)傳
rsync命令是一種高效的文件傳輸工具,相較于scp命令,它具有支持?jǐn)帱c(diǎn)續(xù)傳和僅拷貝修改過(guò)的文件等優(yōu)勢(shì),大大提高了文件傳輸?shù)男?特別適用于傳輸大文件和定期同步文件夾,通過(guò)參數(shù)配置,rsync能夠?qū)崿F(xiàn)多種高級(jí)功能2024-10-10如何設(shè)置linux centos7連接網(wǎng)絡(luò)
這篇文章主要介紹了如何設(shè)置linux centos7連接網(wǎng)絡(luò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Centos中TCPWrappers訪(fǎng)問(wèn)控制實(shí)現(xiàn)
這篇文章主要介紹了Centos中TCPWrappers訪(fǎng)問(wèn)控制實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Apache默認(rèn)是不支持SSI如何給Apache增加SSI支持
SSI翻譯成中文就是服務(wù)器端包含的意思,從技術(shù)角度上說(shuō),SSI就是在HTML文件中,可以通過(guò)注釋行調(diào)用的命令或指針,下面給大家介紹下如何給Apache增加SSI支持2014-05-05