/*
Jaivox version 0.3 December 2012
Copyright 2010-2012 by Bits and Pixels, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* sphinxTest creates a SphinxServer. It also uses Sphinx as a library
* to recognize spoken questions.
* This version (sphinxBatchTest) uses precorded audio instead
* of requiring the user to speak into a microphone.
*/
import java.io.*;
import java.net.URL;
import java.util.TreeMap;
import javax.sound.sampled.*;
import edu.cmu.sphinx.frontend.util.AudioFileDataSource;
import edu.cmu.sphinx.recognizer.Recognizer;
import edu.cmu.sphinx.result.Result;
import edu.cmu.sphinx.util.props.ConfigurationManager;
import com.jaivox.recognizer.sphinx.*;
import com.jaivox.util.*;
public class sphinxBatchTest extends Thread {
static int port = 2000;
static int waitTime = 1000; // one second
static String stub = "../../../audio/";
static String work1 =
"send sphinx_0 {action: interpret, from: sphinx, to: inter, message: ";
static String connect1 = "connect localhost 3000";
static String who1 = "send sphinx_0 {action: JviaWho, from: sphinx, to: inter, message: Jviawho}";
static String query = "send sphinx_0 {action: interpret, from: sphinx, to: inter, message: \"what is the fastest route\"}";
static String config = "batch.xml";
static String questions [] = {
"03", // are roads busy
"02", // do the roads get congested at this time
"05", // do you think elmwood avenue is slow
"06", // do you think old mill road is fast
"10", // is avenue o the quickest highway
"14", // what are the fast roads
"28", // any other fast roads
"31", // are highways stop and go
"32", // do you think elmwood avenue is stop and go
};
static void processSpeech (SphinxServer server) {
try {
BufferedReader in = new BufferedReader (
new FileReader ("road.txt"));
TreeMap <String, String> original =
new TreeMap <String, String> ();
String line;
while ((line = in.readLine ()) != null) {
int pos = line.indexOf ("\t");
if (pos == -1) continue;
String tag = line.substring (1, pos);
String val = line.substring (pos+1);
original.put (tag, val);
}
in.close ();
ConfigurationManager cm = new ConfigurationManager (
sphinxBatchTest.class.getResource (config));
// allocate the recognizer
Log.info ("Loading...");
Recognizer recognizer = (Recognizer) cm.lookup ("recognizer");
recognizer.allocate ();
for (int i=0; i<questions.length; i++) {
StringBuffer sb = new StringBuffer ();
sb.append (stub);
sb.append ("road");
sb.append (questions [i]);
sb.append (".wav");
String filename = new String (sb);
System.out.println (filename);
// URL audioURL = batchTest.class.getResource (filename);
URL audioURL = new File (filename).toURI ().toURL ();
AudioFileDataSource dataSource = (AudioFileDataSource) cm.lookup ("audioFileDataSource");
dataSource.setAudioFile (audioURL, null);
Result result;
while ((result = recognizer.recognize ()) != null) {
String resultText = result.getBestResultNoFiller ();
String orig = original.get (questions [i]);
System.out.println ("Original : "+orig);
System.out.println ("Recognized: " + resultText);
String message = work1 + "\"" + resultText + "\"}";
server.execute (message);
}
try {
Thread.sleep (4000);
play (filename);
play ("../festival/wave.wav");
} catch (Exception e) {
e.printStackTrace ();
break;
}
}
in.close ();
} catch (Exception e) {
e.printStackTrace ();
}
}
static void play (String filename) {
try {
File f = new File (filename);
AudioInputStream as = AudioSystem.getAudioInputStream (f);
AudioFormat format = as.getFormat ();
DataLine.Info info = new DataLine.Info (Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine (info);
clip.open (as);
clip.start ();
while (!clip.isRunning())
Thread.sleep(10);
while (clip.isRunning())
Thread.sleep(10);
clip.close();
Thread.sleep (1000);
}
catch (Exception e) {
e.printStackTrace ();
}
}
public static void main (String args []) {
SphinxServer Recognizer;
Log log = new Log ();
log.setLevelByName ("warning");
try {
Recognizer = new SphinxServer ("sphinx", 2000);
BufferedReader in = new BufferedReader (
new InputStreamReader (System.in));
Log.info ("Waiting to connect to inter");
boolean connected = false;
int waiting = 0;
while (!connected && waiting < 1000) {
sleep (waitTime);
String result = Recognizer.executeReply (connect1);
if (result.startsWith ("OK:")) {
connected = true;
break;
}
else {
waiting++;
System.out.println ("Waiting ... "+waiting);
continue;
}
}
if (!connected) {
Log.severe ("Waiting for too long, terminating ...");
return;
}
else {
Log.info ("Connected to inter");
Log.info ("Waiting to establish who credentials");
}
sleep (waitTime * 4);
boolean established = false;
waiting = 0;
while (!established && waiting < 100) {
sleep (waitTime);
String result = Recognizer.executeReply (who1);
if (result.startsWith ("OK:")) {
established = true;
break;
}
else {
waiting++;
Log.info ("Establishing credentials ... "+waiting);
continue;
}
}
if (!established) {
Log.severe ("Establishing did not work, terminating ...");
return;
}
else {
Log.info ("Established credentials with inter");
Log.info ("Processing recognition results");
}
sleep (waitTime * 4);
// test query even if speech recognition is not working
Recognizer.executeReply (query);
sleep (waitTime * 4);
// loop in SpeechInput
processSpeech (Recognizer);
System.out.println ("Terminating ...");
System.exit (1);
}
catch (Exception e) {
e.printStackTrace ();
}
}
}