語音擷取 DSP
物件,封裝數個與語音擷取相關的 DSP。
CLSID
CLSID_CWMAudioAEC
介面
- IMediaObject
- IPropertyStore
屬性
備註
不同于其他 DSP,語音擷取物件會將多個 DSP 封裝在單一物件中,而物件只是 DMO 物件, (它不會實作 IMFTransform) 。 語音擷取 DMO 包含下列 DSP 元件:
- AEC (聲場回音取消)
- 麥克風陣列處理
- 雜訊抑制
- 自動增益控制
- 語音活動偵測
應用程式可以個別開啟和關閉每個元件。
語音擷取 DMO 支援兩種作業模式: 篩選 模式和 來源 模式。 在篩選模式中,應用程式會從麥克風和喇叭線路將音訊樣本傳送至 DMO,而 DMO 會產生輸出。
在來源模式中,應用程式不需要將範例傳遞至 DMO。 相反地,DMO 會管理音訊裝置上的所有作業,包括初始化裝置、擷取和同步處理音訊串流、計算時間戳記,以及擷取麥克風陣列的幾何。 使用來源模式時,應用程式只會設定 DMO,而 DMO 的輸出則是乾淨且已處理的麥克風訊號。 來源模式比篩選模式更容易使用,而且建議用於大部分的應用程式。
目前語音擷取 DMO 僅支援單通道聲場回音取消 (AEC) ,因此來自喇叭線路的輸出必須是單通道。 如果停用麥克風陣列處理,多通道輸入會折迭成一個通道以進行 AEC 處理。 如果同時啟用麥克風陣列處理和 AEC 處理,則會在麥克風陣列處理之前,在每個麥克風元素上執行 AEC。
麥克風陣列處理
麥克風陣列是一組緊密定位的麥克風。 麥克風陣列可達到比單一麥克風更好的方向性,因為聲波會以稍微不同的時間抵達每個麥克風。 如需麥克風陣列的詳細資訊,請參閱 Web 文章 Windows Vista 中的麥克風陣列支援 和 如何建置和使用 Windows Vista 的麥克風陣列。
使用語音擷取 DSP
若要使用語音擷取 DSP,請執行下列步驟。
1.初始化 DMO
使用 CLSID CLSID_CWMAudioAEC呼叫CoCreateInstance來建立語音擷取 DMO。 語音擷取 DSDP 只會公開 IMediaObject 和 IPropertyStore 介面,因此只能作為 DMO 使用。
DMO 預設為來源模式。 若要選取篩選模式,請將 MFPKEY_WMAAECMA_DMO_SOURCE_MODE 屬性設定為 VARIANT_FALSE。
接下來,使用 IPropertyStore 介面設定 DMO 的內部屬性。 應用程式必須設定的唯一屬性是 MFPKEY_WMAAECMA_SYSTEM_MODE 屬性。 此屬性會設定 DMO 內的處理管線。 其他屬性是選擇性的。
2.設定輸入和輸出格式
如果您在篩選模式中使用 DMO,請呼叫 IMediaObject::SetInputType來設定輸入格式。 輸入格式幾乎可以是任何有效的未壓縮 PCM 或 IEEE 浮點音訊類型。 如果輸入格式不符合輸出格式,DMO 會自動執行取樣速率轉換。
如果您在來源模式中使用 DMO,請勿設定輸入格式。 DMO 會根據音訊裝置自動設定輸入格式。
在任一模式中,呼叫 IMediaObject::SetOutputType來設定輸出格式。 DMO 可以接受下列輸出格式:
- 子類型: MEDIASUBTYPE_PCM 或 MEDIASUBTYPE_IEEE_FLOAT
- 格式區塊.. ][HTTPAT ] 或 [ HTTPATEX]
- 每秒樣本數:8,000;11,025;16,000;或 22,050
- 通道:1 表示僅限 AEC 模式,2 或 4 用於麥克風陣列處理
- 每個範例的位數:16
下列程式碼會將輸出類型設定為 16 位單通道 PCM 音訊:
DMO_MEDIA_TYPE mt; // Media type.
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.lSampleSize = 0;
mt.bFixedSizeSamples = TRUE;
mt.bTemporalCompression = FALSE;
mt.formattype = FORMAT_WaveFormatEx;
// Allocate the format block to hold the WAVEFORMATEX structure.
hr = MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
if (SUCCEEDED(hr))
{
WAVEFORMATEX *pwav = (WAVEFORMATEX*)mt.pbFormat;
pwav->wFormatTag = WAVE_FORMAT_PCM;
pwav->nChannels = 1;
pwav->nSamplesPerSec = 16000;
pwav->nAvgBytesPerSec = 32000;
pwav->nBlockAlign = 2;
pwav->wBitsPerSample = 16;
pwav->cbSize = 0;
// Set the output type.
if (SUCCEEDED(hr))
{
hr = pDMO->SetOutputType(0, &mt, 0);
}
// Free the format block.
MoFreeMediaType(&mt);
}
3. 處理資料
處理任何資料之前,建議呼叫 IMediaObject::AllocateStreamingResources。 這個方法會配置 DMO 在內部使用的資源。 在先前列出的步驟之後呼叫 AllocateStreamingResources ,而不是之前所列的步驟。 如果您未呼叫此方法,DMO 會在資料處理啟動時自動設定資源。
如果您在篩選模式中使用 DMO,您必須呼叫 IMediaObject::P rocessInput,將輸入資料傳遞至 DMO。 來自麥克風的音訊資料會移至串流 0,而來自喇叭線路的音訊資料會移至串流 1。 如果您在來源模式中使用 DMO,則不需要呼叫 ProcessInput。
若要從 DSP 取得輸出資料,請執行下列步驟:
- 建立緩衝區物件來保存輸出資料。 緩衝區物件必須實作 IMediaBuffer 介面。 緩衝區的大小取決於應用程式的需求。 配置較大的緩衝區可能會降低發生問題的機會。
- 宣告 DMO_OUTPUT_DATA_BUFFER 結構,並將 pBuffer 成員設定為指向您的緩衝區物件。
- 將 DMO_OUTPUT_DATA_BUFFER 結構傳遞至 IMediaObject::P rocessOutput 方法。
- 只要 DMO 有輸出資料,請繼續呼叫這個方法。 DSP 會透過在DMO_OUTPUT_DATA_BUFFER結構的dwStatus成員中設定DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE旗標,以發出更多輸出的訊號。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 |
Windows Server 2008 [僅限傳統型應用程式] |
標頭 |
|
DLL |
|
另請參閱