マイク(48,000Hz)から収集した生のPCMストリームを、ISpRecognizer
が認識するウェーブフォーマット(44,100Hz)に変換しようとしています(48,000Hz PCMストリームの場合はSetRecoState(SPRST_ACTIVE_ALWAYS)
から、ファイル)。ISpStreamFormatConverterの使用方法は?
私は、ISpStreamFormatConverter
インターフェースのインスタンスを作成し、既存のIStream
の上に座っISpStreamFormat
の私の独自の実装を渡すISpStreamFormatConverter::SetBaseStream()
を使用して、私の既存のストリームとそれを提供します。 ISpStreamFormatConverter
はISpStreamFormat::GetFormat
の実装を正常に呼び出しますが、ISpStreamFormatConverter::RemoteRead()
またはISpStreamFormatConverter::RemoteCopyTo(),
と呼び出すと、いつもSPERR_UNINITIALIZED
エラーコードが表示されます。
変換を続行するには、追加の手順を実行する必要がありますか? ISpStreamFormatConverter
インターフェイスの使用例が見つかりませんでした。
更新。これはISpStreamFormatConverter使用するattempstコード(デルファイ)である:あなたが一歩を逃しているよう
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;
ISpStreamFormatConverterのいくつかの(内部の)例を見ると、既知のオーディオ形式を変換するように設計されています。 ISpStreamFormatConverterはISpStreamFormatを拡張するので、通常はISpRecognizer :: SetInputにISpStreamFormatConverterを渡します。だから私はなぜあなたがISpStreamFormatConverter :: RemoteReadを最初に呼び出すのかはわかりません。 –
私はISpRecognizer :: SetInputにISpStreamを渡します。 ISpStreamはSPBindToFileから取得されます。 ISpStreamFormatConverterを渡すと、ISpRecognizerはWAVファイルの代わりに好きな形式を要求します。 –
これは役に立ちませんでした - 私はまだSPRR_UNSUPPORTED_FORMATをISpRecognizer.SetRecoState(SPRST_ACTIVE_ALWAYS)から取得します。 –