我試圖將從麥克風(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;
查看ISpStreamFormatConverter的一些(內部)示例,它旨在在已知音頻格式之間進行轉換。由於ISpStreamFormatConverter擴展了ISpStreamFormat,通常只需將ISpStreamFormatConverter傳遞給ISpRecognizer :: SetInput即可。所以我不清楚爲什麼你要首先調用ISpStreamFormatConverter :: RemoteRead。 –
我將ISpStream傳遞給ISpRecognizer :: SetInput。 ISpStream從SPBindToFile中檢索。所以如果我通過ISpStreamFormatConverter,ISpRecognizer會請求它喜歡的格式,而不是我在WAV文件中的格式? –
這沒有幫助 - 我仍然從ISpRecognizer.SetRecoState(SPRST_ACTIVE_ALWAYS)獲得SPERR_UNSUPPORTED_FORMAT .. –