2017-02-28 6 views
0

テキスト読み上げインターフェイス(MaryTTS)からオーディオストリームを取得し、それをSIP RTPセッション(ピアを使用)でストリーミングしようとしています。オーディオストリームをPCMに変換する

ピア

public interface SoundSource { 

    byte[] readData(); 

} 

とMaryTTS AudioInputStreamStringを合成するように定義されたインタフェースであり、SoundSourceオーディオストリームたいです。私は単に

MaryInterface tts = new LocalMaryInterface(); 
AudioInputStream audio = tts.generateAudio("This is a test."); 
SoundSource soundSource = new SoundSource() { 

    @Override 
    public byte[] readData() { 
     try { 
      byte[] buffer = new byte[1024]; 
      audio.read(buffer); 
      return buffer; 
     } catch (IOException e) { 
      return null; 
     } 
    } 
}; 
// issue call with soundSource using Peers 

電話が鳴るのラインで、ストリームを読み、SoundSourceを実装するピアにそれをバッファリングしてみました、そして私の代わりに合成音声の遅い、低、騒々しい音を聞きます。私はそれがSIP RTPセッションが期待するオーディオ形式の何かであると思う、Peersのドキュメント状態以来

音源は以下の形式の生のオーディオでなければならない:リニアPCM 8kHz、リトルエンディアン。

AudioInputStreamをこれらの要件を満たすように変換/読み取るにはどうすればよいですか?私が知っている

答えて

0

一つの方法はこれです - あなたは、私が知らない使用しているシステムに与えられ、それが通過するかどうか:また、あなたが使用することができ、この

AudioSysytem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) 

あり

ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 
    try { 
    byte[] data=new byte[1024]; 
    while(true) { 
     k=audioInputStream.read(data, 0, data.length); 
     if(k<0) break; 
     outputStream.write(data, 0, k); 
    } 
    AudioFormat af=new AudioFormat(8000f, 16, 1, true, false); 
    byte[] audioData=outputStream.toByteArray(); 
    InputStream byteArrayInputStream=new ByteArrayInputStream(audioData); 
    AudioInputStream audioInputStream2=new AudioInputStream(byteArrayInputStream, af, audioData.length/af.getFrameSize()); 
    outputStream.close(); 
    } 
    catch(Exception ex) { ex.printStackTrace(); } 
} 

上記のパラメータ。

関連する問題