2017-02-28 4 views
0

Ich versuche, einen Audio-Stream von einer Text-zu-Sprache-Schnittstelle (MaryTTS) zu erhalten und streamen Sie in einer SIP-RTP-Sitzung (mit Peers).Konvertieren eines Audiostreams in PCM

Peers will ein SoundSource Audio-Stream, der eine Schnittstelle als

public interface SoundSource { 

    byte[] readData(); 

} 

MaryTTS und synthetisiert ein String zu einem AudioInputStream definiert ist. Ich habe versucht, einfach den Strom zu lesen und es heraus zu Peers Pufferung SoundSource, in den Linien der

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 

das Telefon klingelt Implementierung und ich höre einen langsamen, niedrig, laut Ton anstelle der synthetisierten Sprache. Ich denke, es hat etwas mit dem Audioformat der SIP-RTP-Sitzung erwartet, da Peers Dokumentation wird

mit folgendem Format sein muss ausgewertete Audio sein könnte

Die Schallquelle: 16 Bit signed, Mono-Kanal, lineare PCM 8 kHz, kleiner Endianer.

Wie kann ich konvertieren/die AudioInputStream lesen diese Anforderungen zu erfüllen?

Antwort

0

Ein Weg, ich weiß, ist dies - die Systeme gegeben, die Sie verwenden ich weiß nicht, ob es passieren wird:

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

Es gibt auch das ist

AudioSysytem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) 

, die Sie mit der Verwendung können über Parameter.