2015-03-18 10 views
7

Sto tentando di eseguire la finestra di dialogo demo di sphinx 4 pre aplha ma fornisce errori.Impossibile accedere al microfono durante l'esecuzione della demo Dialog in sphinx4 5prealpha

Sto creando un'applicazione di sintesi vocale.

ho importato il progetto con Maven e seguito questa guida su stack overflow: https://stackoverflow.com/a/25963020/2653162

L'errore dice sui problemi riguardanti la 16 kHz e il canale di essere mono. Quindi è chiaro riguardo la roba del campionamento. E dice anche del microfono.

ho guardato su come modificare le impostazioni del microfono a 16 kHz e 16 bit, ma non c'è tale opzione in Windows 7

:  Only Options available in win 7

Il fatto è che il HelloWorld e dialogo demo ha funzionato bene in sphinx4 1.06 beta, ma dopo che ho provato l'ultima versione dà seguenti errori:

Exception in thread "main" java.lang.IllegalStateException: javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported. 
    at edu.cmu.sphinx.api.Microphone.<init>(Microphone.java:38) 
    at edu.cmu.sphinx.api.SpeechSourceProvider.getMicrophone(SpeechSourceProvider.java:18) 
    at edu.cmu.sphinx.api.LiveSpeechRecognizer.<init>(LiveSpeechRecognizer.java:34) 
    at edu.cmu.sphinx.demo.dialog.Dialog.main(Dialog.java:145) 
Caused by: javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported. 
    at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513) 
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121) 
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:413) 
    at edu.cmu.sphinx.api.Microphone.<init>(Microphone.java:36) 
    ... 3 more 

riesco a capire cosa fare per risolvere il problema.

+0

@NikolayShmyrev scheda audio è Conexant SmartAudio HD – abc

+0

Ok, mi dispiace, questo è un bug in sphinx4 che riconoscitore non rilascia la risorsa correttamente e Windows Java non consente di aprire il microfono la seconda volta. –

+0

Rilevante problema nel nostro tracker https://sourceforge.net/p/cmusphinx/bugs/412/ –

risposta

1

Come spiegato da Nickolay nel forum forge sorgente (here), la risorsa microfono deve essere rilasciata dal riconoscitore che la sta attualmente utilizzando affinché un altro riconoscitore possa utilizzare il microfono. Mentre l'API viene riparata, ho apportato le seguenti modifiche ad alcune classi dell'API della Sfinge come soluzione temporanea. Questa probabilmente non è la soluzione migliore, supponiamo che finché non verrà proposta una soluzione migliore, funzionerà.


ho creato una classe denominata MicrophoneExtention con lo stesso codice sorgente della classe Microphone, e ha aggiunto i seguenti metodi:

 

    public void closeLine(){ 
     line.close(); 
    } 

Allo stesso modo una classe LiveSpeechRecognizerExtention con il codice sorgente di LiveSpeechRecognizer di classe, e ha fatto le seguenti modifiche:

  • utilizzare la classe MicrohphoneExtention ho definito:
    private final MicroPhoneExtention microphone;
  • all'interno del costruttore,
    microphone =new MicrophoneExtention(16000, 16, true, false);
  • e aggiungere le seguenti modalità:
 
    public void closeRecognitionLine(){ 
     microphone.closeLine(); 
    } 



Infine ho modificato il metodo principale del DialogDemo.

 
    Configuration configuration = new Configuration(); 
    configuration.setAcousticModelPath(ACOUSTIC_MODEL); 
    configuration.setDictionaryPath(DICTIONARY_PATH); 
    configuration.setGrammarPath(GRAMMAR_PATH); 
    configuration.setUseGrammar(true);

configuration.setGrammarName("dialog"); LiveSpeechRecognizerExtention recognizer = new LiveSpeechRecognizerExtention(configuration); Recognizer.startRecognition(true); while (true) { System.out.println("Choose menu item:"); System.out.println("Example: go to the bank account"); System.out.println("Example: exit the program"); System.out.println("Example: weather forecast"); System.out.println("Example: digits\n"); String utterance = recognizer.getResult().getHypothesis(); if (utterance.startsWith("exit")) break; if (utterance.equals("digits")) { recognizer.stopRecognition(); recognizer.closeRecognitionLine(); configuration.setGrammarName("digits.grxml"); recognizer=new LiveSpeechRecognizerExtention(configuration); recognizeDigits(recognizer); recognizer.closeRecognitionLine(); configuration.setGrammarName("dialog"); recognizer=new LiveSpeechRecognizerExtention(configuration); recognizer.startRecognition(true); } if (utterance.equals("bank account")) { recognizer.stopRecognition(); recognizerBankAccount(Recognizer); recognizer.startRecognition(true); } if (utterance.endsWith("weather forecast")) { recognizer.stopRecognition(); recognizer.closeRecognitionLine(); configuration.setUseGrammar(false); configuration.setLanguageModelPath(LANGUAGE_MODEL); recognizer=new LiveSpeechRecognizerExtention(configuration); recognizeWeather(recognizer); recognizer.closeRecognitionLine(); configuration.setUseGrammar(true); configuration.setGrammarName("dialog"); recognizer=new LiveSpeechRecognizerExtention(configuration); recognizer.startRecognition(true); } } Recognizer.stopRecognition();

e, ovviamente, le firme metodo nella DialogDemo mutevoli esigenze ... speranza che questo aiuta ... e su una nota finale, non so se quello che ho fatto è esattamente legale per iniziare. Se sto facendo qualcosa di sbagliato, si prega di essere così gentile da indicare i miei errori: D

+0

Ho seguito le tue modifiche, quando corro ora sto ricevendo questo errore: "java.lang.IllegalStateException: stato previsto PRONTO stato attuale DEALLOCATED \t a edu.cmu.sphinx.recognizer.Recognizer.checkState (Recognizer.java:134 " – Vinod

+0

Non sono sicuro di dove si sia verificato il problema, il mio funziona perfettamente, cosa c'è nello stack delle chiamate? Se sto leggendo questo, quell'eccezione viene generata dal decodificatore del riconoscitore, non dalla linea. –

+0

eccezione nel thread "main" java.lang.IllegalStateException: Previsto stato stato attuale READY deallocato \t a edu.cmu.sphinx.recognizer.Recognizer.checkState (Recognizer.java:134) \t a edu.cmu.sphinx.recognizer .Recognizer.recognize (Recognizer.java: 103) \t a edu.cmu.sphinx.recognizer.Recognizer.recognize (Recognizer.java:122) \t a edu.cmu.sphinx.api.AbstractSpeechRecognizer.getResult (AbstractSpeechRecognizer.java:63) \t a edu .cmu.sphinx.demo.dialog.DialogDemo.main (DialogDemo.java:153) – Vinod

4

Se si modifica SpeechSourceProvider per restituire un riferimento di microfono costante, non tenterà di creare più riferimenti microfono, che è la fonte del problema.

public class SpeechSourceProvider { 
    private static final Microphone mic = new Microphone(16000, 16, true, false); 

    Microphone getMicrophone() { 
     return mic; 
    } 
} 

Il problema qui è che non si desidera più thread tenta di accedere a una singola risorsa, ma per la demo, i sistemi di riconoscimento vengono arrestati e ha iniziato come necessario in modo che essi non sono tutti in competizione per il microfono .

0

La risposta di aetherwalker lavorato per me - in modo più dettagliato ho sovrascritto i seguenti file con i miei implementazioni in cui ho cambiato solo lo SpeechSourceProvider utilizzato:

prima è l'AbstractSpeechRecognizer:

public class MaxAbstractSpeechRecognizer { 
protected final Context context; 
protected final Recognizer recognizer; 

protected ClusteredDensityFileData clusters; 

protected final MaxSpeechSourceProvider speechSourceProvider; 

/** 
* Constructs recognizer object using provided configuration. 
* @param configuration initial configuration 
* @throws IOException if IO went wrong 
*/ 
public MaxAbstractSpeechRecognizer(Configuration configuration) 
    throws IOException 
{ 
    this(new Context(configuration)); 
} 

protected MaxAbstractSpeechRecognizer(Context context) throws IOException { 
    this.context = context; 
    recognizer = context.getInstance(Recognizer.class); 
    speechSourceProvider = new MaxSpeechSourceProvider(); 
} ....................... 

Poi il LiveSpeechRecognizer:

public class MaxLiveSpeechRecognizer extends MaxAbstractSpeechRecognizer { 

private final Microphone microphone; 

/** 
* Constructs new live recognition object. 
* 
* @param configuration common configuration 
* @throws IOException if model IO went wrong 
*/ 
public MaxLiveSpeechRecognizer(Configuration configuration) throws IOException 
{ 
    super(configuration); 
    microphone = speechSourceProvider.getMicrophone(); 
    context.getInstance(StreamDataSource.class) 
     .setInputStream(microphone.getStream()); 
}...................... 

E, ultimo ma non ultimo lo SpeechSourceProvider:

import edu.cmu.sphinx.api.Microphone; 

public class MaxSpeechSourceProvider { 

private static final Microphone mic = new Microphone(16000, 16, true, false); 

Microphone getMicrophone() { 
    return mic; 
} 
} 
Problemi correlati