2017-02-28 3 views
0

텍스트 음성 변환 인터페이스 (MaryTTS)에서 오디오 스트림을 가져 와서 Peers를 사용하여 SIP RTP 세션에서 스트리밍하려고합니다.오디오 스트림을 PCM으로 변환

피어

public interface SoundSource { 

    byte[] readData(); 

} 

정의하는 인터페이스 인하는 SoundSource 오디오 스트리밍하려고하고 MaryTTS는 AudioInputStreamString을 synthesises. 나는 단순히

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 

전화 반지의 라인, 스트림을 읽고 SoundSource를 구현 동료에 그것을 밖으로 버퍼링을 시도, 나는 대신에 합성 된 음성의 속도가 느린, 낮은 시끄러운 소리를들을 수 있습니다. 나는 그것이 SIP RTP 세션이 기대하는 오디오 포맷으로 뭔가있을 수 있다고 생각한다. Peers 문서 상태 이후

음원은 선형 PCM 8kHz, 16 비트 서명, 모노 채널, 리틀 엔디안.

AudioInputStream을 이러한 요구 사항을 충족 시키려면 어떻게 변환합니까? 내가 아는

답변

0

한 가지 방법은 이것이다 - 당신은 내가 잘 모릅니다 사용하는 시스템 제공이 통과 할 경우 : 또한 당신이 함께 사용할 수있는이

AudioSysytem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) 

있습니다

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

위의 매개 변수.