如何使用 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,所以您可能需要稍微调整一下才能编译。)