2010-03-21 5 views
7

का उपयोग करते समय फ्रेट्स के साथ अपवाद मैं फ्रेट्स का उपयोग करके एक प्रोग्राम चलाने की कोशिश कर रहा हूं। मैं इस कार्यक्रम को संकलित करने में सक्षम हूँ लेकिन मैं केविन या mbrola आवाज मैं अंतकेविन या एमब्रोला

सिस्टम संपत्ति "mbrola.base" में follwing उत्पादन संदेश मिलता है उपयोग करने के लिए सक्षम नहीं हूँ अनिर्धारित रहता है। MBROLA आवाज का उपयोग नहीं करेंगे।
लाइन अनुपलब्ध: स्वरूप pcm_signed है 16000.0 हर्ट्ज 16 बिट 1 चैनल बड़ा endian

import javax.speech.*; 
import javax.speech.synthesis.*; 
import java.util.*; 

class freetts { 

    public static void main(String[] args) { 
     try{ 
      Calendar calendar = new GregorianCalendar(); 
      String sayTime = "It is " + calendar.get(Calendar.HOUR) + " " + calendar.get(Calendar.MINUTE) + " " + (calendar.get(Calendar.AM_PM)==0 ? "AM":"PM"); 
      Synthesizer synth = Central.createSynthesizer(null); 
      synth.allocate(); 
      synth.resume(); 
      synth.speakPlainText(sayTime, null); 
      synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
      synth.deallocate(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

मैंने इसे लंबे समय तक उपयोग नहीं किया है। लेकिन, क्या आपने अपने क्लासपाथ में जो कुछ भी चाहिए उसे रखा? इसके अलावा मुझे याद है कि आपको अपनी होम निर्देशिका में कुछ ऐसा करना था (यह एक पुराना संस्करण था), यह किसी समस्या के लिए एक और कारण हो सकता है (यदि आपको अभी भी ऐसा करने की आवश्यकता है)। साथ ही, अन्य पर्यावरण चर भी हो सकते हैं जिन्हें आपको सेट करने की आवश्यकता है, जैसे आपको MBROLA_HOME चर सेट करना होगा। क्या आप इसके साथ आए नमूने कार्यक्रमों में से कोई भी चलाने में सक्षम हैं? मुझे प्रश्न पूछने के लिए खेद है, लेकिन वे समस्या को कम करने में मदद करते हैं। –

+0

क्षमा करें कुछ और, लाइन अनुपलब्ध अपवाद को फेंक दिया जा सकता है जब आप फ़ाइलों को चलाने के लिए किए गए कार्यों के आधार पर एक ही समय में ध्वनि चलाने की कोशिश कर रहे हैं। क्या आप ध्वनि चलाने के लिए उपयोग कर रहे कुछ कोड दिखा सकते हैं। –

+0

हमें भाषण.प्रोपर्टीज की प्रतिलिपि बनाने की आवश्यकता है जो मैंने पहले ही किया है। हालांकि मैं इस कार्यक्रम है और न ही डिफ़ॉल्ट केविन वक्ता withmy mbrola आवाज इंटरफेस को आबद्ध कर सकता लेकिन मैं अपने कार्यक्रम के classpath – manugupt1

उत्तर

2

यह "FreeTTS MBROLA के लिए समर्थन करते हैं, केवल नकल mbrola/mbrola.jar को lib/mbrola.jar सक्षम करने के लिए है कि लगता है।

:

java -Dmbrola.base=/home/jim/mbrola -jar bin/FreeTTSHelloWorld.jar mbrola_us1" 

मैं इस पाया: तब, जब भी आप किसी भी FreeTTS आवेदन चलाने के लिए, एक प्रणाली संपत्ति के रूप में "mbrola.base" निर्देशिका तैयार

1

दूसरे वाक्यांश में मब्रोला के साथ कुछ लेना देना नहीं है, लेकिन एक भयानक जावा लिनक्स ध्वनि बग के साथ जो अभी भी तय नहीं है। https://forums.oracle.com/forums/thread.jspa?threadID=2206163

क्योंकि freetts "ट्रस्ट" sourcedataline, बजाय उस पोस्ट पर वैकल्पिक हल करने का हो रहा है यही कारण है कि: तीसरे पोस्ट यहाँ देखें। बग जेडीके में है, लेकिन यह पता लगाकर काम किया जा सकता है कि फ़्रीट्स में क्या हो रहा है और वर्कअराउंड & रीकंपलिंग को सम्मिलित करना है।

यहाँ एक testcase

package util.speech; 

import java.util.Iterator; 
import java.util.Locale; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.Mixer; 
import javax.sound.sampled.SourceDataLine; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Assume; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import static org.junit.Assert.*; 

public class VoiceTest { 



    public VoiceTest() { 
    } 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 

    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 

    @Before 
    public void setUp() { 

    } 

    @After 
    public void tearDown() { 
    } 

    @Test 
    public void testDataLineAvailableAndBuggyInJDK() throws LineUnavailableException { 
     boolean failedSimpleGetLine = false; 
     AudioFormat format = new AudioFormat(44100, 16, 2, true, false); 
     SourceDataLine line = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
     try { 
      line = (SourceDataLine) AudioSystem.getLine(info); 
     } catch (LineUnavailableException e) { 
      //ok, at least it says so 
      throw e; 
     } 
     try { 
      //if this fails the jdk is very buggy, since it just told us 
      //the line was available 
      line.open(format); 
     } catch (LineUnavailableException e) { 
      failedSimpleGetLine = true; 
     } finally { 
      if (line.isOpen()) { 
       line.close(); 
      } 
     } 



     //now if this is true, test if it's possible to get a valid sourcedataline 
     //or the only bug is adquiring a sourcedataline doesn't throw a lineunavailable 
     //exception before open 
     Assume.assumeTrue(failedSimpleGetLine); 
     line = getSourceDataLine(format); 
     if (line == null) { 
      return; 
     } 

     try { 
      line.open(format); 
     } catch (LineUnavailableException e) { 
      //ok then it is consistent, and there is only one bug 
      fail("Line Unavailable after being adquired"); 
     } finally { 
      if (line.isOpen()) { 
       line.close(); 
      } 
     } 
     fail("line available after first test not managing to adquire it"); 
    } 


    private SourceDataLine getSourceDataLine(AudioFormat format) { 
     try { 
      DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
      for (Mixer.Info mi : AudioSystem.getMixerInfo()) { 
       SourceDataLine dataline = null; 
       try { 
        Mixer mixer = AudioSystem.getMixer(mi); 
        dataline = (SourceDataLine) mixer.getLine(info); 
        dataline.open(format); 
        dataline.start(); 
        return dataline; 
       } catch (Exception e) { 
       } 
       if (dataline != null) { 
        try { 
         dataline.close(); 
        } catch (Exception e) { 
        } 
       } 
      } 
     } catch (Exception e) { 
     } 
     return null; 
    } 
} 
+2

Oracle में केविन उपयोगकर्ता खराब कर दिया है कि मंच लिंक, किसी को पता है जहाँ वह अब है को शामिल किया है नहीं कर रहा हूँ? –

+0

या, पैच/वर्कअराउंड स्वयं। –

+0

IIRC वैकल्पिक हल (कोशिश पकड़ अंत में करीब के साथ) Dataline को खोलने के लिए किया गया था। यह इसलिए आवश्यक है क्योंकि कुछ datalines की रिपोर्ट है कि वे एक प्रारूप का समर्थन है, लेकिन वे को उड़ाने जब आप वास्तव में उन्हें खोलने का प्रयास करें। यह निश्चित रूप से बेकार है। – i30817

2

http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html

लेखक को बहुत बहुत धन्यवाद है।


एक FreeTTS पर आधारित कार्यक्रम, जावा के लिए मुफ्त पाठ से वाक् इंजन, सामयिक त्रुटियों

हो रही थी
"LINE UNAVAILABLE: Format is ..." 

बाहर कर देता है वहाँ कोई जावा अपवाद या अन्य तंत्र इस त्रुटि का पता लगाने के लिए है कि फ्रीटीटीएस लाइब्रेरी के अंदर होता है। आपको बस System.out पर संदेश मिलता है, इसलिए प्रोग्रामेटिक रूप से प्रतिक्रिया करने का कोई अच्छा तरीका नहीं है।

वर्कअराउंड: ऑडियो डिवाइस को तब तक एक से अधिक बार एक्सेस करने का प्रयास करने के लिए फ्रीटीटीएस ऑडियो प्लेयर को कॉन्फ़िगर करें। इस उदाहरण में, ऑडियो डिवाइस को पकड़ने का अवसर याद करने के लिए 0.1 सेकंड की छोटी देरी का उपयोग नहीं किया जाता है; हम 30 सेकंड के लिए कोशिश कर रखना:

System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.openFailDelayMs", "100"); 
System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.totalOpenFailDelayMs", "30000"); 

ऑडियो डिवाइस स्थायी रूप से किसी अन्य प्रोग्राम द्वारा उपयोग किया जाता है, वहाँ निश्चित रूप से पहुंच पाने के लिए कोई रास्ता नहीं है। लिनक्स के तहत, इस आदेश प्रक्रिया है कि वर्तमान में ऑडियो पहना हुआ है की आईडी को प्रदर्शित करेगा, ताकि आप तो हमलावर कार्यक्रम से छुटकारा पाने की कोशिश कर सकते:

/sbin/fuser /dev/dsp 
1

मैं जानता हूँ कि मैं थोड़ा देर से यह पोस्टिंग रहा हूँ, लेकिन यह किसी की मदद कर सकता है। मैंने केविन और मब्रोला दोनों के साथ प्रयास किया, और यह मेरे लिए काम किया। कृपया नीचे दिया गया कोड पाएं।

package com.mani.texttospeech; 

import java.beans.PropertyVetoException; 
import java.util.Locale; 

import javax.speech.AudioException; 
import javax.speech.Central; 
import javax.speech.EngineException; 
import javax.speech.EngineStateError; 
import javax.speech.synthesis.Synthesizer; 
import javax.speech.synthesis.SynthesizerModeDesc; 
import javax.speech.synthesis.Voice; 

/** 
* 
* @author Manindar 
*/ 
public class SpeechUtils { 

    SynthesizerModeDesc desc; 
    Synthesizer synthesizer; 
    Voice voice; 

    public void init(String voiceName) throws EngineException, AudioException, EngineStateError, PropertyVetoException { 
     if (desc == null) { 
      System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
      desc = new SynthesizerModeDesc(Locale.US); 
      Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 
      synthesizer = Central.createSynthesizer(desc); 
      synthesizer.allocate(); 
      synthesizer.resume(); 
      SynthesizerModeDesc smd = (SynthesizerModeDesc) synthesizer.getEngineModeDesc(); 
      Voice[] voices = smd.getVoices(); 
      for (Voice voice1 : voices) { 
       if (voice1.getName().equals(voiceName)) { 
        voice = voice1; 
        break; 
       } 
      } 
      synthesizer.getSynthesizerProperties().setVoice(voice); 
     } 
    } 

    public void terminate() throws EngineException, EngineStateError { 
     synthesizer.deallocate(); 
    } 

    public void doSpeak(String speakText) throws EngineException, AudioException, IllegalArgumentException, InterruptedException { 
     synthesizer.speakPlainText(speakText, null); 
     synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY); 
    } 

    public static void main(String[] args) throws Exception { 
     SpeechUtils su = new SpeechUtils(); 
     su.init("kevin16"); 
//  su.init("kevin"); 
//  su.init("mbrola_us1"); 
//  su.init("mbrola_us2"); 
//  su.init("mbrola_us3"); 
     // high quality 
     su.doSpeak("Hi this is Manindar. Welcome to audio world."); 
     su.terminate(); 
    } 
} 

और अपने pom.xml फाइल करने के लिए नीचे दिए गए निर्भरता जोड़ें।

<dependencies> 
     <dependency> 
      <groupId>net.sf.sociaal</groupId> 
      <artifactId>freetts</artifactId> 
      <version>1.2.2</version> 
     </dependency> 
    </dependencies> 

आशा है कि यह सहायक होगा।

+0

लाइन System.setProperty ("freetts.voices", com.sun.speech.freetts जोड़ना "। en.us.cmu_us_kal.KevinVoiceDirectory "); और फिर मेरा कोड अच्छी तरह से काम करता है, बहुत बहुत धन्यवाद। – VanThaoNguyen

संबंधित मुद्दे