0

これについては間違っているかもしれませんが、NAudio の私の WAV ファイルは非同期で再生されているようです。ライブラリから呼び出すと、WAV の開始を聞くことができますが、すぐに終了 (および再生が停止) します。

フォーム(開いたまま)から実行すると問題ありません。しかし、コードからバックグラウンド スレッドとして実行しようとすると、最初に小さな断片しか聞こえません。サウンドの再生が終了する前にメソッドが終了しているようです。

Text To Speech Synthesizer を使用して、メモリ ストリームに WAV を作成しています。

        SpeechSynthesizer m_speechSynth = new SpeechSynthesizer();
        m_speechSynth.Volume = 100;
        m_speechSynth.Rate = 2;

        MemoryStream waveStream = new MemoryStream();

        m_speechSynth.SetOutputToWaveStream(waveStream);
        m_speechSynth.Speak(txtToRead);
        m_speechSynth.SetOutputToNull();

        waveStream.Position = 0; // reset counter to start

それはうまくいきます。次に、NAudio をラップするクラスを作成します。

VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV");

ここのコード サンプルは理解しやすいものにしようとしていますが、このクラスが行うことは単純に初期化を行い、NAudio プレーヤーで主な処理を行うためのより高いレベルの制御を提供することです... VoiceThroughNetAudio コンストラクターの内部、

まず、MemStream からリーダー ストリームを作成します。

            readerStream = new WaveFileReader(memStream);
            readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
            readerStream = new BlockAlignReductionStream(readerStream);

そして、ボリュームコントロールを取り付けます(増幅できるように):

_volumeStream = new WaveChannel32(Reader);

WinForm コードから呼び出すと、これはすべて正常に機能します。

        MemoryStream waveStream = new MemoryStream();
        ReadStringAmplified(readTextField.Text, waveStream); // TTS to waveStream
        VoiceThroughNetAudio  PlaySound = new VoiceThroughNetAudio (waveStream, "WAV");
        PlaySound.Volume = 9;
        PlaySound.Play();

しかし、代わりにこのコードを Voice クラスに移動すると、サウンドの再生が開始されてから (ほとんどすぐに) 停止します。イベントを開始して、サウンドが終了する前に終了するようなものですか? もしそうなら、サウンドが終了するまでメソッドを待機させる良い方法はありますか? (whileループを入れて状態を確認してみましたが、これでは無限にwhileループに入ってしまいます(ここでコメントアウト…)

Voice クラスに移動すると、コードは次のようになります。フォームからインスタンス化し、そこですべて実行すると、切り捨てられたサウンドが得られます。

        SpeechSynthesizer m_speechSynth = new SpeechSynthesizer();
        m_speechSynth.Volume = 100;
        m_speechSynth.Rate = 2;

        MemoryStream waveStream = new MemoryStream();
        m_speechSynth.SetOutputToWaveStream(waveStream);
        m_speechSynth.Speak(txtToRead);
        m_speechSynth.SetOutputToNull();
        waveStream.Position = 0; // reset counter to start

        VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV");
        netAudio.Volume = 9;
        TimeSpan ts = netAudio.TotalDuration;
        string len = ts.Milliseconds.ToString();

        netAudio.Play();

        //VoiceThroughNetAudio.PlayBackState chkState = netAudio.State;
        //while (netAudio.State != VoiceThroughNetAudio.PlayBackState.Stopped)
        //{
        //    chkState = netAudio.State;
        //}

単純なものが欠けているようですが、フォームからのみ音声クラスでこれを機能させることができないようです。

4

1 に答える 1

1

問題の最も可能性の高い説明は次のとおりです。

  1. MemoryStreamまだ書き込み中の から再生しようとしています
  2. 出力デバイスが範囲外になり、再生中にガベージ コレクションが実行されました

PlaybackStoppedのイベントをサブスクライブして、IWavePlayerいつ、なぜ起動するかを確認してください (問題がある場合は、例外が含まれている可能性があります)。

WaveFormatConversionStreamまた、 aと aが必要だとはとても思えないので、BlockAlignReductionStream,それらを削除してコードを簡素化してください。

于 2013-05-08T08:41:59.780 に答える