我正在尝试从文本到语音接口(MaryTTS)获取音频流,并将其流到SIP会话中(使用对等体)。
对等点需要一个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会话所期望的音频格式有关,因为对等文档声明
声源必须是原始音频,格式如下:线性PCM 8 8kHz,16位签名,单通道,小终端。
如何转换/读取AudioInputStream以满足这些要求?
发布于 2017-02-28 02:39:12
我知道的一种方法是--考虑到你正在使用的系统,我不知道它是否会通过:
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)可以与上述参数一起使用。
https://stackoverflow.com/questions/42498622
复制相似问题