ISpStreamFormatConverter

ISpStreamFormatConverter

我正在尝试将从麦克风(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并不熟悉,因此您可能必须对它进行一些调整才能编译。)

08-26 05:00