天天看點

透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

來源 | 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核心的重要原因。

透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

圖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應用程式。
透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

圖2: Linux ALSA音頻系統架構

3.1 使用者态ALSA-Lib

ALSA-Lib提供了對核心ALSA-Driver完整功能接口的支援,為應用提供了更加安全的API接口,同時也提供了豐富的音頻元件,進而讓應用程式的開發更加簡單且高效。

3.1.1 ALSA-Lib API

官網給出的alsa-lib的API清單資訊如下,

透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

圖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三部分。

透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

圖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 整體設計

透過ALSA這層迷霧剖析AliOS Things音頻架構設計1、背景2、為什麼需要音頻系統架構3、Linux ALSA音頻架構4、AliOS Things的音頻架構設計5、未來更多精品好文

圖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的音頻架構出謀劃策,一起拼一起赢。

更多精品好文

漫談農業物聯網與網際網路技術的結合 傳感器,物聯網時代的智能硬體數字化入口 如何快速搭建一個像“天貓精靈”的智能語音助手? 物聯網之IP Camera解決方案簡介 從語音互動曆史淺看它是否會是物聯網行業的一個爆點? 帶你走進多媒體世界:視訊檔案是怎麼播放出來的 物聯網雲端一體AI方案的探索 物聯網裝置連接配接的下一個引爆點:4G Cat.1 物聯網教育現狀和前景 一文看懂藍牙在物聯網中的應用場景 下一個智能硬體爆品是什麼? 華為、阿裡、小米都在用的全屋智能技術 為什麼物聯網領域使用Rust的項目越來越多? 物聯網中也能使用區塊鍊技術?面向IoT的區塊鍊基礎架構IoTeX 開源硬體的前世今生 物聯網碎片化的一些思考 邊緣計算在物聯網行業的應用 物聯網太難 ? 不妨試試用Python來開發 5G會給物聯網行業帶來哪些變化? 必須要了解的物聯網安全知識 ARMv9能給ARM帶來新一輪騰飛嗎?(安全篇) ARMv9能給ARM帶來新一輪騰飛嗎?(人工智能篇) 國産物聯網作業系統的出路在哪裡? RISC-V架構能否引領物聯網時代? 物聯網到底為什麼這麼火? 誰才是物聯網連接配接技術中的王者? 物聯網平台大量出現能否将行業帶入爆發式發展 腳本語言适合物聯網開發嗎 從“嵌入式”到“物聯網”的四大轉變 物聯網發展新趨勢

繼續閱讀