來源 | HaaS技術社群不看這幾篇好文,就别說自己了解物聯網
1、背景
近十年是移動智能裝置迅速爆發的十年。随着智能手機、平闆電腦、AI智能音響、車載智能裝置的普及,“語音”已經成為了使用者與智能裝置互動的最重要方式之一。
例如,當您拿出手機撥打電話時,“内置mic”負責您聲音的采集、“聽筒”是對方聲音輸出的預設裝置。當您家人也想和對方聊上幾句時,您往往會打開Speaker讓家人一起暢聊。當您接聽的是商務會議時,您往往會插上“3.5mm耳機”或者“藍牙耳機”,讓自己擁有更加私密的通話氛圍。
開車中的您正在沉浸在車載音樂BGM中時,如果手機導航軟體需要提醒您“前方有違章拍照”時手機會怎麼做呢?以Android手機為例,Android會把BGM的音量降低,然後将導航播報的聲音和低音量的BGM混音後播放,當導航播報完畢後再将BGM恢複到原來的音量繼續播放。這種無縫切換的設計不僅友好的提醒了您前方的路況資訊,又讓您持續的沉浸在BGM中無法自拔。
還有細心的朋友可能會發現,現在大型商場中,AI智能機器人越來越多了。您已經不需要在手機上打開某個APP、敲上想查的關鍵字去搜尋您想找的商戶來,您需要做的僅僅是開口說出您的問題,機器人即可給您滿意的答案。
2、為什麼需要音頻系統架構
以上這些應用場景的實作都是由智能裝置中的“音頻中樞系統”來完成的。如果要用一句話來描述智能裝置的“音頻系統”的話,那麼可以這麼了解,就是“向下屏蔽和管理的錯中複雜的聲霸卡裝置,向上為應用程式提供友好豐富的語音服務接口”。
嵌入式OS中需要管理的音頻硬體codec錯綜複雜。功能上區分有僅支援錄音的、僅支援播放的、同時支援錄音播放/播放的codec、有支援音量調節的也有不支援的。接口上區分有I2S接口的,PCM接口的,AC97接口的。音頻codec的廠商也有近百家,搭配的CPU平台也有幾十種,排列組合之後就是上萬種的“CPU + Audio Codec”的可能,且每一種排列組合在Linux核心中都已經有成熟的音頻驅動程式支援,繁榮的硬體驅動生态是各種主流智能裝置的OS無法摒棄Linux核心的重要原因。

圖1: 典型音頻硬體系統架構
豐富的應用生态也是Linux在嵌入式裝置中經久不衰的重要原因。以Linux系統為例,Linux屏蔽了底層音頻硬體的差異,在使用者态通過alsa-lib為生态中的音頻應用提供了統一的API接口供調用。
是以要快速開發一款經久不衰的智能語音産品,一個優秀的的音頻系統架構是至關重要的。
3、Linux ALSA音頻架構
ALSA是Advanced Linux Sound Architecture的縮寫,即進階Linux音頻架構,在Linux上提供了對音頻和MIDI(較少使用)的支援。在Linux 2.6的核心版本後,AlSA目前已經成為了linux的主流音頻體系結構。官方資料和源碼下載下傳參考:“
ALSA-Project”。
ALSA包含核心裝置驅動層ALSA-Driver以及使用者态的ALSA-Lib兩大子產品。應用程式直接調用ALSA-Lib的标準接口即可完成對底層音頻硬體的控制,直接通路核心接口是不被允許的。
ALSA有如下特點
- 标準音頻驅動模型,支援多種音頻裝置。
- 子產品化的核心驅動程式,支援熱插拔(例如3.5mm耳機)。
- 支援SMP(對稱多處理)和多線程。
- 提供多種音頻處理元件(例如重采樣,混音,多聲道管理,軟音量調節等),以及豐富的調試診斷工具。
- 相容舊版本OSS應用程式。
圖2: Linux ALSA音頻系統架構
3.1 使用者态ALSA-Lib
ALSA-Lib提供了對核心ALSA-Driver完整功能接口的支援,為應用提供了更加安全的API接口,同時也提供了豐富的音頻元件,進而讓應用程式的開發更加簡單且高效。
3.1.1 ALSA-Lib API
官網給出的alsa-lib的API清單資訊如下,
圖3:ALSA官網對ALSA-Lib API的描述
下面提供了一些ALSA-Lib接口的簡單描述,
- Control interface: 提供靈活的方式管理注冊的音頻裝置,并提供裝置查詢接口。
- PCM digital interface:PCM(pulse code modulation脈沖編碼調制)是最常見的數字表示模拟信号的方法。PCM音頻流幾乎被所有的計算機系統支援,是以alsa的PCM子產品中提供了豐富的接口供應用層完成對音頻資料流的通路。PCM子產品中的playback和capture兩個子子產品提供了上層應用依賴的重要接口。
- playback: 負責把使用者空間的解碼後的PCM音頻流輸出到音頻驅動層,進而通過硬體codec轉換成人耳可以辨識的模拟音頻。
- capture: 底層硬體mic拾取到模拟信号,經過采樣、量化,最終轉換成數字PCM流。capture子產品提供了應用層擷取PCM音頻流的接口。
- RawMidi interface:MIDI (Music Instrument Digital Interface)是一種标準電子音樂指令集,該子產品提供了通路聲霸卡上MIDI總線的接口,這些接口封裝了豐富的MIDI事件(例如音符...),開發者隻需要管理音頻中各MIDI事件的組合與時間即可。值得注意的是MIDI接口的裝置已經逐漸退出,使用範圍越來越少了。
- Sequencer interface: 一個比原始RawMidi接口進階的MIDI程式設計和聲音同步接口,可以處理很多MIDI協定和定時器。
- Timer interface: 為支援聲音的同步事件提供通路聲霸卡上的定時器。
- Mixer interface: 混音器接口,控制多路音頻混合輸出以及各路音頻音量控制。
3.1.2 ALSA-Lib插件
ALSA-Lib還提供了豐富的PCM插件。插件可以自動處理諸如:命名裝置、采樣率轉換、通道間的采樣複制、寫入檔案、為多個輸入/輸出連接配接聲霸卡/裝置(不同步采樣)、使用多通道聲霸卡/裝置等工作。插件的使用是通過ALSA-Lib的配置檔案來進行,同時配置檔案也規定了音頻在ALSA-Lib中的處理鍊路。常用的音頻插件包括,
- softvol: 軟音量插件,主要用來調節增益用的,采用的整形數運算。
- route: 主要做聲道的轉換,如雙聲道轉化為單聲道
- rate: 采樣率轉換插件,預設的采用linear 算法會有失真,可以嘗試speexdsp的重采樣算法來優化。
- dmix: 混音插件。
- file: 主要用于問題定位,将pcm資料直接儲存的檔案裡面供調試使用。
- dsnoop: 與dmix 剛好相反,他是将DAC錄音的pcm 資料分發給多個client。
- hw: 與alsa-driver操作的接口
- multi: 将多個聲霸卡的合并為一個虛拟的pcm 節點,即對不同的聲霸卡的pcm 進行merge
- extplug: 主要承接外部自定義的插件,友善介入第三方或者自定義的插件,天貓精靈中的DTS/Sona 音效就可以通過extplug來做。
3.1.3 移植ALSA-Lib的難點
ALSA-Lib提供了對核心ALSA Driver的完整支援,同時也有非常多的元件可供使用,但是如果嘗試移到ALSA-Lib到AliOS Things中也面臨着以下的問題,
- 代碼量龐大:Linux 2.5版本開始ALSA音頻架構取代了舊的OSS音頻架構,主要原因是性能更好且支援多個播放源。但經過多個版本疊代之後,代碼量已經達到數十萬行的級别,且依賴大量Linux上才有的頭檔案和接口。短時間内要把ALSA-Lib完整功能移植到AliOS Things中是耗時耗力的工程,ROI并不高。更合理的做法是根據AliOS Things的定位,結合實際項目場景的需求,擇優而取。
- 很多被淘汰的代碼接口:由于曆史原因,ALSA保持了對舊的OSS音頻架構的完整支援,同時還有對MIDI, Sequencer, Timer等現代智能裝置已經不再使用的接口支援。這些過時的接口和标準分布在ALSA-LIB的各處代碼中。要将ALSA-Lib裁剪的足夠小也是一個耗時耗力的事情。
- Licence不太友好:Linux ALSA是GPL Licence, 存在代碼污染的風險。
3.2 核心态ALSA-Driver
Linux kernel中ALSA-Driver主要包含ALSA Core, ASOC Core, Hardware Driver三部分。
圖4: Linux ALSA音頻驅動代碼結構
3.2.1 ALSA-Core
ALSA-Core是alsa-driver的核心層,向上提供音頻裝置(PCM/ Control/ MIDI/ Timer ...)的系統調用,向下驅動硬體裝置。
3.2.2 ASOC-Core
ASOC-Core是建立在标準ALSA Core基礎上,為了更好支援嵌入式系統和應用于移動裝置的音頻Codec的一套軟體體系。在移動裝置中, 為了更好的提供ALSA支援, 在核心層的基礎上出現了ASOC(ALSA System on Chip)層,主要由如下三部分組成,
- Codec: 負責配置Codec為音頻capture和playback模式,音量調節,bias參數等。
- Platform: 主要負責SoC平台音頻DMA和音頻接口的配置和控制, 包括時鐘、DMA、I2S、PCM等。
- Machine: 可以了解成Codec、Platform的組合。每個産品的硬體平台可以支援多個Machine (Platform + Codec),使用者根據實際硬體設定和應用場景動态配置。
3.2.3 Hardware Driver
處于ALSA Driver架構的最底層,具體的代碼邏輯也是驅動開發人員需要實作的部分。Linux ALSA Driver中将Audio硬體抽象成了platform, codec, machine三大塊,每個子產品分工清晰。
4、AliOS Things的音頻架構設計
AliOS Things的定位是輕量級的物聯網作業系統,作為後起之秀,和衆多物聯網作業系統一樣,很難獲得廣大硬體廠商的軟體支援,同時在應用生态上也無法與成熟的Linux相媲美。是以我們不妨大膽的去嘗試,積極擁抱已有的Linux硬體驅動生态和應用生态将會是AliOS Things快速擷取使用者認可的重要選擇。
綜上AliOS Things的音頻系統架構主要出于以下三點考慮:
- 相容已有的Linux音頻應用生态:Linux版本的AI智能音箱、IP Camera、智慧面闆等産品都是基于Linux ALSA音頻架構開發的,為了降低開發者基于AliOS Things開發類似産品的門檻,AliOS Things的音頻架構向上為應用層提供Linux一緻的接口是合理的。
- 相容已有的Linux硬體驅動生态:一個音頻系統的硬體平台可能有上萬種的排列組合,如果開發者基于AliOS Things開發音頻軟體系統需要重新适配上萬種的硬體驅動,那麼對于開發者而言将是災難。是以AliOS Things如何更友好的去相容已有的硬體驅動生态是必須考慮的問題。
- 降低音頻應用開發難度,培養良好的開發者生态:滿足了以上兩點的要求,那麼對于開發者來說基于AliOS Things開發應用程式并沒有特别高的門檻,這是讓開發者不畏懼AliOS Things,敢為使用AliOS Things的重要因素。
4.1 整體設計
圖5: AliOS Things音頻架構設計
由圖可見,AliOS Things音頻系統包括音頻驅動架構、音頻服務架構、音頻應用元件三大部分。
4.2 音頻驅動
AliOS Things音頻驅動架構設計的2大目标是,
- 遵循“一切皆檔案”的思想,通過VFS向使用者測提供和Linux/Android一樣的操作接口。
- 向下同時相容RTOS上碎片化的、Linux上豐富标準的音頻驅動生态。
4.3 音頻服務
音頻服務架構(Audio Service)是AliOS Things音頻系統的核心子產品,包括應用測Sound PCM/Control接口設計、音量管理、播放焦點管理、音效管理、dsnoop錄音分發子產品、plugin管理子產品,Audio Card Manage、PCM/Control Interface子產品等。其中plugin管理子產品涉及的插件有"soft volume", "rate", "dmix"和 "sona/dts"等。
4.4 音頻應用
目前AliOS Things上已經适配好的音頻應用元件有"FFMPEG & SDL", "wav播放器",uVoice等,例如智能音響上常用的url播放器, tts播放器, 本地提示音(mp3, aac ...)播放器,藍牙A2DP音頻等。已經初步具備了雲端釘一體的智能語音能力。
5、未來
目前AliOS Things的音頻驅動架構還處于初級階段,距離Android上非常完整的、優秀的音頻服務體驗還有很大的差距。好在AliOS Things也算是在音頻應用領域邁出了堅實的一步,未來還有很多工作需要去嘗試。
希望廣大的HaaS開發者們積極給我們提意見,一起為AliOS Things的音頻架構出謀劃策,一起拼一起赢。