将音频流转换为 PCM

Convert an audio stream to PCM

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

Peers 想要一个 SoundSource 来传输音频,这是一个定义为

的接口
public interface SoundSource {

    byte[] readData();

}

MaryTTS 将 String 合成为 AudioInputStream。我试图简单地读取流并将其缓冲到实现 SoundSource 的 Peers,在

的行中
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

phone 铃声响起,我听到缓慢、低沉、嘈杂的声音,而不是合成语音。我想这可能与 SIP RTP 会话期望的音频格式有关,因为 Peers 文档指出

The sound source must be raw audio with the following format: linear PCM 8kHz, 16 bits signed, mono-channel, little endian.

我如何convert/read AudioInputStream 来满足这些要求?

我知道的一种方法是 - 考虑到您正在使用的系统,我不知道它是否会通过:

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)

您可以将其与上述参数一起使用。