如何使用ISpStreamFormatConverter?

时间:2016-08-05 04:37:44

标签: winapi audio speech-recognition speech-to-text sapi

我正在尝试将从麦克风(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;

1 个答案:

答案 0 :(得分:1)

看起来你错过了一步 - 在致电

之后
SpStreamFormatConverter.SetBaseStream(SpeechLib_TLB.ISpStreamFormat(iSourceStream), 0, 0);

您需要调用SetFormat来定义输出格式:

SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx);

(我不熟悉Delphi,所以你可能需要稍微调整一下来编译。)