我正在尝试从文本到语音接口(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
以满足这些要求?
答案 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)
可以使用上述参数。