2012-12-30 3 views
1

나는 음성을 인식하고 피드백을 주거나 일을해야한다는 것을 의미하는 PC asistant에서 일하고 있습니다. 피드백은 컴퓨터가 생성 한 음성이어야합니다. 예를 들어 javax.speech를 사용하여 Java 내부에서이 작업을 수행하는 방법을 알고 있습니다. 이 음성은 실제로 좋은 품질은 아니지만 모든 종류의 라이브러리를 필요로하지 않으며 사용하기 쉽습니다.Java TTS (텍스트 음성 변환) speech.properties 파일

public static void speech(String text) { 
     if(text.trim() == "") 
      return; 

     String voiceName = "kevin16"; 

     try { 
      SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, null, null); 
      Synthesizer synth = Central.createSynthesizer(desc); 
      synth.allocate(); 
      synth.resume(); 
      desc = (SynthesizerModeDesc) synth.getEngineModeDesc(); 
      Voice[] voices = desc.getVoices(); 
      Voice voice = null; 
      for(Voice entry : voices) { 
       if(entry.getName().equals(voiceName)) { 
        voice = entry; 
        break; 
       } 
      } 
      synth.getSynthesizerProperties().setVoice(voice); 
      synth.speakPlainText(text, null); 
      synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
      synth.deallocate(); 

     } catch(Exception ex) { 
      String message = " missing speech.properties in " + System.getProperty("user.home") + "\n"; 
      System.out.println("" + ex); 
      System.out.println(message); 
      ex.printStackTrace(); 
     } 
    } 

에서 : 나는 현재이 프로토 타입 코드가 converting text to speech java code

나는 코드가 파일 speech.properties이 발견되지 않기 때문에 즉, 내 사용자에 있어야있어, 오류가 발생 실행하면 예배 규칙서. 문제는이 파일을 어디서 가져올 지, 아니면이 파일에 있어야하는지 모르는 사람이 나를 도울 수 있습니까?

또한 훌륭한 연설 자습서 링크를 누군가에게 보낼 수 있다면 좋겠지 만 웹 검색은 어렵지만 찾기가 어렵습니다.

답변

4

몇 가지 변경 사항을 적용하여 예제를 수정할 수 있습니다.

첫째, 나는 당신의 시도-catch 블록의 beggining에이 라인을 추가 :

 System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 
     System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
     Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 

이 라인이 그 성가신 speech.properties 파일에 대한 필요성을 우회.

두 번째로 음성 이름은 "kevin16"이고 "kelvin16"이 아닙니다.

셋째, synth.resume()synth.getSynthesizerProperties().setVoice(voice) 행 다음으로 이동했습니다. 미리 정의 된 음성 없이는 아무 것도 말할 수 없기 때문입니다.

if(text.trim() == "")==을 사용하여 문자열을 비교하는 것이 좋지 않으므로 잘못되었습니다.

public static void speech(String text) { 
    if (text == null || text.trim().isEmpty()) return; 

    String voiceName = "kevin16"; 

    try { 
     System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 
     System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
     Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 

     SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, null, null); 

     Synthesizer synth = Central.createSynthesizer(desc); 
     synth.allocate(); 
     desc = (SynthesizerModeDesc) synth.getEngineModeDesc(); 
     Voice[] voices = desc.getVoices(); 
     Voice voice = null; 
     for (Voice entry : voices) { 
      if(entry.getName().equals(voiceName)) { 
       voice = entry; 
       break; 
      } 
     } 
     synth.getSynthesizerProperties().setVoice(voice); 
     synth.resume(); 
     synth.speakPlainText(text, null); 
     synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
     synth.deallocate(); 

    } catch(Exception ex) { 
     String message = " missing speech.properties in " + System.getProperty("user.home") + "\n"; 
     System.out.println("" + ex); 
     System.out.println(message); 
     ex.printStackTrace(); 
    } 
} 
: 여기

은 결과 코드