2016-08-05 79 views
0

我試圖將從麥克風(48,000赫茲)採集的原始PCM流轉換爲ISpRecognizer將識別的波形格式(44,100赫茲)(對於48,000赫茲的PCM流,它會從SetRecoState(SPRST_ACTIVE_ALWAYS)返回AUDCLNT_E_UNSUPPORTED_FORMAT,但對於44,100 Hz WAV文件)。如何使用ISpStreamFormatConverter?

我創建ISpStreamFormatConverter接口的實例,用ISpStreamFormatConverter::SetBaseStream()通過我自己的執行ISpStreamFormat是在現有IStream的頂部坐在我現有的流提供它。 ISpStreamFormatConverter成功呼叫我的執行ISpStreamFormat::GetFormat,但是當我撥打ISpStreamFormatConverter::RemoteRead()ISpStreamFormatConverter::RemoteCopyTo(),我總是得到SPERR_UNINITIALIZED錯誤代碼。

在轉換進行之前是否需要執行任何其他步驟?我找不到使用ISpStreamFormatConverter接口的任何示例。

UPDATE。這是attempst使用ISpStreamFormatConverter代碼(德爾福):

res := CoCreateInstance(CLASS_SpStreamFormatConverter, 
    nil, CLSCTX_INPROC_SERVER, 
    IID_ISpStreamFormatConverter, 
    SpStreamFormatConverter); 
if CheckFunction(res, 'CoCreateInstance(CLASS_SpStreamFormatConverter)') then begin 
    fFileStream.Position := 0; 
    //TSpStreamFormat is my own class that implemaants ISpStreamFormat 
    iSourceStream := TSpStreamFormat.Create(fFileStream, fCaptureWaveFormatEx) as ISpStreamFormat; 
    res := SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0); 
    if CheckFunction(res, 'ISpStreamFormatConverter.SetBaseStream)') then begin 
    res := SpStreamFormatConverter.ResetSeekPosition; 
    if CheckFunction(res, 'ISpStreamFormatConverter.ResetSeekPosition)') then begin 
     res := cpRecognizer.SetInput(SpStreamFormatConverter, 1); 
     if CheckFunction(res, 'ISpRecognizer.SetInput') then begin 
     res := cpRecognizer.SetRecoState(SPRST_ACTIVE_ALWAYS); 
     end; 
    end; 
    end; 
end; 
+0

查看ISpStreamFormatConverter的一些(內部)示例,它旨在在已知音頻格式之間進行轉換。由於ISpStreamFormatConverter擴展了ISpStreamFormat,通常只需將ISpStreamFormatConverter傳遞給ISpRecognizer :: SetInput即可。所以我不清楚爲什麼你要首先調用ISpStreamFormatConverter :: RemoteRead。 –

+0

我將ISpStream傳遞給ISpRecognizer :: SetInput。 ISpStream從SPBindToFile中檢索。所以如果我通過ISpStreamFormatConverter,ISpRecognizer會請求它喜歡的格式,而不是我在WAV文件中的格式? –

+0

這沒有幫助 - 我仍然從ISpRecognizer.SetRecoState(SPRST_ACTIVE_ALWAYS)獲得SPERR_UNSUPPORTED_FORMAT .. –

回答

1

它看起來像你錯過了一步 - 調用

SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0); 

你需要調用SetFormat定義輸出格式後:

SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx); 

(我不熟悉德爾福,那麼很可能你就必須有所調整此進行編譯。)

+0

我得到SPERR_UNSUPPORTED_FORMAT - WANEFORMATEX結構是(1,2,44,100,176400,4,16,0)。 –

+0

如果我通過源格式(1,2,48000,384000,8,32,0),我得到S_OK。 –

+0

@DmitryStreblechenko您是否閱讀過SpStreamFormatConverter的評論?特別是,它依靠現有的音頻編解碼器來完成轉換,並且如果格式未由現有[SPSTREAMFORMAT](https://msdn.microsoft.com/en-us/library/ms717276(v = vs.85).aspx)枚舉,很可能你會得到SPERR_UNSUPPORTEDFORMAT。 –