我正在尝试将从麦克风(48,000 Hz)收集的原始PCM流转换为ISpRecognizer
将识别的波形格式(44,100 Hz)(它从AUDCLNT_E_UNSUPPORTED_FORMAT
返回SetRecoState(SPRST_ACTIVE_ALWAYS)
一个48,000赫兹的PCM流,但对于4400赫兹的WAV文件工作正常。)
我创建了ISpStreamFormatConverter
接口的实例,使用ISpStreamFormatConverter::SetBaseStream()
通过我自己的ISpStreamFormat
实现提供现有流,该实现位于现有IStream
之上。 ISpStreamFormatConverter
成功调用了我ISpStreamFormat::GetFormat
的实现,但是当我致电ISpStreamFormatConverter::RemoteRead()
或ISpStreamFormatConverter::RemoteCopyTo(),
时,我总是会收到SPERR_UNINITIALIZED
错误代码。
在转换可以继续之前,是否需要执行任何其他步骤?我找不到使用ISpStreamFormatConverter
接口的任何示例。
更新。这是试图使用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;
答案 0 :(得分:1)
看起来你错过了一步 - 在致电
之后SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0);
您需要调用SetFormat来定义输出格式:
SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx);
(我不熟悉Delphi,所以你可能需要稍微调整一下来编译。)