如何使用 ISpStreamFormatConverter?
How to use ISpStreamFormatConverter?
我正在尝试将从麦克风 (48,000 Hz) 收集的原始 PCM 流转换为 ISpRecognizer
可以识别的波形格式 (44,100 Hz)(它 returns AUDCLNT_E_UNSUPPORTED_FORMAT
来自SetRecoState(SPRST_ACTIVE_ALWAYS)
适用于 48,000 Hz PCM 流,但适用于 44,100 Hz WAV 文件。
我创建了一个 ISpStreamFormatConverter
接口的实例,使用 ISpStreamFormatConverter::SetBaseStream()
将我自己的 ISpStreamFormat
实现提供给它,它位于现有 [=17] 之上=]. 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;
您似乎错过了一步 - 在调用
之后
SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0);
您需要调用SetFormat来定义输出格式:
SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx);
(我不熟悉 Delphi,所以您可能需要稍微调整一下才能编译。)
我正在尝试将从麦克风 (48,000 Hz) 收集的原始 PCM 流转换为 ISpRecognizer
可以识别的波形格式 (44,100 Hz)(它 returns AUDCLNT_E_UNSUPPORTED_FORMAT
来自SetRecoState(SPRST_ACTIVE_ALWAYS)
适用于 48,000 Hz PCM 流,但适用于 44,100 Hz WAV 文件。
我创建了一个 ISpStreamFormatConverter
接口的实例,使用 ISpStreamFormatConverter::SetBaseStream()
将我自己的 ISpStreamFormat
实现提供给它,它位于现有 [=17] 之上=]. 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;
您似乎错过了一步 - 在调用
之后SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0);
您需要调用SetFormat来定义输出格式:
SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx);
(我不熟悉 Delphi,所以您可能需要稍微调整一下才能编译。)