Kinect 首發時,骨骼追蹤光芒掩蓋了麥克風陣列的價值。但事實上,語音指令結合姿勢 是解決 Kinect 「選取操作困難」的關鍵:傳統 GUI 的「點選」在 Kinect 中極不自然,複合互動 (保持姿勢 + 說出指令) 才是未來趨勢。本文深入解析 Kinect 音訊架構、核心類別 KinectAudioSource 與錄製實作。
Kinect 底部 4 支水平排列麥克風組成陣列,硬體層完成:
這些處理在硬體與 SDK 之間完成,開發者只需透過 KinectAudioSource 設定功能屬性即可。
| 術語 | 說明 |
|---|---|
| AEC (Acoustic Echo Cancellation) | 消除喇叭聲音被麥克風收回的迴音 |
| Beamforming | 利用多麥克風時間差模擬定向收音 |
| Optibeam | Kinect 專用波束成形系統模式,產生 11 條邏輯波束 |
| SNR (Signal-to-Noise Ratio) | 訊噪比,越高品質越好 |
| Frame Size | AEC 處理的音訊幀大小 |
KinectAudioSource 封裝了 DMO (DirectX Media Object) 底層複雜設定,提供高層 功能屬性:
| 屬性 | 型別 | 預設/建議值 | 用途 |
|---|---|---|---|
| NoiseSuppression | bool | true | 開啟雜訊抑制 |
| AutomaticGainControlEnabled | bool | true | 開啟自動增益 |
| EchoCancellationMode | Enum | CancellationOnly | 迴音消除模式:None / CancellationOnly / CancellationAndSuppression |
| EchoCancellationSpeakerIndex | int | 0 | 指定參考喇叭裝置索引 |
| BeamAngleMode | Enum | Adaptive | 波束模式:Adaptive(自動追蹤) / Manual(手動指定角度) |
| ManualBeamAngle | double | 0 | Manual 模式下指定波束角度 (弧度) |
最佳實務:語音辨識場景建議 BeamAngleMode = Adaptive、NoiseSuppression = true;若需播放音樂同時辨識,必須啟用 AEC 並設正確 EchoCancellationSpeakerIndex。
Kinect 專用 Microsoft.Speech (Server 版),非桌面版 System.Speech。核心流程:
InstalledRecognizers() 找含 AdditionalInfo["Kinect"] == "True" 且 Culture 為 en-US 的引擎。SpeechRecognitionEngine(ri.Id)。Grammar (關鍵字規則)。SetInputToAudioStream(source.Start(), SpeechAudioFormatInfo...) 接管 Kinect 音訊流。RecognizeAsync(RecognizeMode.Multiple) 開始非同步持續辨識。new SpeechAudioFormatInfo(
EncodingFormat.Pcm, // 編碼
16000, // 採樣率 16kHz
16, // 位元深度 16-bit
1, // 聲道數 Mono
32000, // 平均位元率 32kbps
2, // 區塊對齊
null)
利用 KinectAudioSource.Start() 回傳 Stream 直接寫入 WAV 檔。
public static void WriteWavFile(KinectAudioSource source, FileStream fs) {
int dataSize = 0;
WriteWavHeader(fs, 0); // 先寫假頭
using (var audioStream = source.Start()) {
byte[] buffer = new byte[4096];
int read;
while ((read = audioStream.Read(buffer, 0, buffer.Length)) > 0 && IsRecording) {
fs.Write(buffer, 0, read);
dataSize += read;
}
}
// 回寫真實頭部資訊
long pos = fs.Position;
fs.Seek(0, SeekOrigin.Begin);
WriteWavHeader(fs, dataSize);
fs.Seek(pos, SeekOrigin.Begin);
}
WAVEFORMATEX 結構需對應上述 16kHz/16-bit/Mono 格式。
WriteWavFile,檔名含時間戳記。MediaPlayer 播放剛錄製的檔案。AudioSource.Stop() 中斷錄音串流。NoiseSuppression、AutomaticGainControlEnabled、EchoCancellationMode 即時切換體驗差異。本文建立了 Kinect 語音開發的完整知識地圖:從硬體陣列原理、DMO 封裝層 KinectAudioSource、辨識引擎 SpeechRecognitionEngine 到錄製實作。掌握這些基石,下一篇即可輕鬆實作波束追蹤視覺化與自然語音指令控制。敬請期待!