将音频流转换为PCM

时间:2017-02-28 01:28:05

标签: java audio sip rtp

我正在尝试从文本到语音接口(MaryTTS)获取音频流并在SIP RTP会话中流式传输(使用Peers)。

Peers希望SoundSource传输音频,这是一个定义为

的接口
public interface SoundSource {

    byte[] readData();

}

和MaryTTS将String合成为AudioInputStream。我试着简单地读取流并将其缓冲到实施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
电话响了,我听到一个缓慢,低沉,嘈杂的声音,而不是合成的语音。我想这可能是SIP RTP会话期望的音频格式,因为Peers文档声明

  

声源必须是原始音频,格式如下:线性PCM 8kHz,16位有符号,单声道,小端。

如何转换/读取AudioInputStream以满足这些要求?

1 个答案:

答案 0 :(得分:0)

我知道的一种方法是 - 鉴于您使用的系统,我不知道它是否会通过:

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(); }
}

还有这个

AudioSysytem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream)

可以使用上述参数。