我正在尝试将从麦克风(48,000 Hz)收集的原始PCM流转换为ISpRecognizer
可以识别的波形格式(44,100 Hz)(对于48,000 Hz的PCM流,它从AUDCLNT_E_UNSUPPORTED_FORMAT
返回SetRecoState(SPRST_ACTIVE_ALWAYS)
,但对于44,100 Hz的WAV文件工作正常) 。
我创建了ISpStreamFormatConverter
接口(interface)的实例,使用ISpStreamFormatConverter::SetBaseStream()
为它提供了我现有的流,并传递了我自己的ISpStreamFormat
实现,该实现位于现有IStream
的顶部。 ISpStreamFormatConverter
成功调用了ISpStreamFormat::GetFormat
的实现,但是当我调用ISpStreamFormatConverter::RemoteRead()
或ISpStreamFormatConverter::RemoteCopyTo(),
时,我总是收到SPERR_UNINITIALIZED
错误代码。
在进行转换之前,我需要执行其他任何步骤吗?我找不到使用ISpStreamFormatConverter
接口(interface)的任何示例。
更新。这是尝试使用ISpStreamFormatConverter的代码(Delphi):
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;
最佳答案
似乎您错过了一步-致电后
SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0);
您需要调用SetFormat来定义输出格式:
SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx);
(我对Delphi并不熟悉,因此您可能必须对它进行一些调整才能编译。)