2016-08-05 16 views
0

マイク(48,000Hz)から収集した生のPCMストリームを、ISpRecognizerが認識するウェーブフォーマット(44,100Hz)に変換しようとしています(48,000Hz PCMストリームの場合はSetRecoState(SPRST_ACTIVE_ALWAYS)から、ファイル)。ISpStreamFormatConverterの使用方法は?

私は、ISpStreamFormatConverterインターフェースのインスタンスを作成し、既存のIStreamの上に座っISpStreamFormatの私の独自の実装を渡すISpStreamFormatConverter::SetBaseStream()を使用して、私の既存のストリームとそれを提供します。 ISpStreamFormatConverterISpStreamFormat::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; 
+0

ISpStreamFormatConverterのいくつかの(内部の)例を見ると、既知のオーディオ形式を変換するように設計されています。 ISpStreamFormatConverterはISpStreamFormatを拡張するので、通常はISpRecognizer :: SetInputにISpStreamFormatConverterを渡します。だから私はなぜあなたがISpStreamFormatConverter :: RemoteReadを最初に呼び出すのかはわかりません。 –

+0

私はISpRecognizer :: SetInputにISpStreamを渡します。 ISpStreamはSPBindToFileから取得されます。 ISpStreamFormatConverterを渡すと、ISpRecognizerはWAVファイルの代わりに好きな形式を要求します。 –

+0

これは役に立ちませんでした - 私はまだSPRR_UNSUPPORTED_FORMATをISpRecognizer.SetRecoState(SPRST_ACTIVE_ALWAYS)から取得します。 –

答えて

1

に見えます -

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

を呼び出した後、あなたは、出力形式を定義するためにSetFormatを呼び出す必要があります:

SpStreamFormatConverter.SetFormat(SPDFID_WaveFormatEx,pConvertedWaveFormatEx); 

(私はデルファイに精通していないよ、それはあなたがコンパイルするややこれを微調整する必要があります可能性があります。)

+0

私はSPERR_UNSUPPORTED_FORMATを取得します - WANEFORMATEX構造体は(1,2,4,4100,176400,4,16,0)です。 –

+0

ソースフォーマット(1、2、48000、384000、8、32、0)を渡すと、私はS_OKを返します。 –

+0

@DmitryStreblechenkoあなたはSpStreamFormatConverterの発言を読んだことがありますか?特に、既存のオーディオコーデックを使用して変換を行います。形式が既存の[SPSTREAMFORMAT](https://msdn.microsoft.com/en-us/library/ms717276(v = vs.85).aspx)列挙型の場合、SPERR_UNSUPPORTEDFORMATを取得する可能性があります。 –