package com.voxeo.tropo.util;
import java.util.Properties;
import com.mot.mrcp.MrcpException;
import com.mot.mrcp.ec.ConfidenceMode;
import com.voxeo.sipmethod.mrcp.client.Grammar;
import com.voxeo.sipmethod.mrcp.client.GrammarFactory;
import com.voxeo.sipmethod.mrcp.client.MrcpAsrResult;
import com.voxeo.sipmethod.mrcp.client.MrcpAsrSession;
import com.voxeo.sipmethod.mrcp.client.MrcpSession;
import com.voxeo.sipmethod.mrcp.client.Grammar.InputMode;
import com.voxeo.sipmethod.mrcp.client.MrcpAsrResult.Type;
public class MrcpRTCListener {
public static MrcpRTCListener create(final MrcpAsrSession session, final int timeout) {
return create(session, GrammarFactory.createGrammar("*, #", Grammar.Type.SIMPLE, InputMode.dtmf), timeout);
}
public static MrcpRTCListener create(final MrcpAsrSession session, final Grammar grammar, final int timeout) {
return new MrcpRTCListener(session, grammar, timeout);
}
protected final Grammar _grammar;
protected final int _timeout;
protected final MrcpAsrSession _session;
protected MrcpRTCCallback _callback = null;
protected boolean _isStarted = false;
protected WaitResultThread _waitThread = null;
private MrcpRTCListener(final MrcpAsrSession session, final Grammar grammar, final int timeout) {
_session = session;
_grammar = grammar;
_timeout = timeout;
}
public void setCallback(final MrcpRTCCallback callback) {
_callback = callback;
}
public synchronized boolean isStarted() {
return _isStarted;
}
public synchronized void start() {
if (_waitThread == null) {
_isStarted = true;
_waitThread = new WaitResultThread();
_waitThread.setName(Thread.currentThread().getName() + "-Listener");
_waitThread.start();
}
}
public synchronized void stop() {
if (_waitThread != null) {
_isStarted = false;
_waitThread.close();
_waitThread = null;
}
}
protected Properties buildRecognitionProperties(final int noInputTimeout, final Grammar.InputMode mode) {
final Properties properties = new Properties();
properties.setProperty("recognizer-start-timers", Boolean.toString(false));
// properties.setProperty("dtmf-term-timeout", String.valueOf(0));
// properties.setProperty("dtmf-term-char", "#");
properties.setProperty("No-Input-Timeout", String.valueOf(noInputTimeout));
properties.setProperty("confidence-threshold", String.valueOf(100));
properties.setProperty("sensitivity-level", String.valueOf(50));
properties.setProperty("speed-vs-accuracy", String.valueOf(50));
properties.setProperty("n-best-list-length", String.valueOf(1));
properties.setProperty("Speech-Language", "en-us-prophecy");
String vim = "dtmf voice";
if (mode == InputMode.dtmf) {
vim = "dtmf";
}
else if (mode == InputMode.voice) {
vim = "voice";
}
properties.setProperty("Voxeo-Input-Mode", vim);
return properties;
}
protected class WaitResultThread extends Thread {
public void close() {
try {
if (_session.getState() == MrcpSession.State.CONNECTED) {
_session.stop(new Properties());
}
}
catch (final MrcpException e) {
; //ignore
}
}
@Override
public void run() {
try {
while (_isStarted && _session.getState() == MrcpSession.State.CONNECTED) {
final MrcpAsrResult asrResult = _session.recognize(_grammar, buildRecognitionProperties(_timeout, _grammar
.getInputMode()), _timeout, ConfidenceMode.INPUT);
if (asrResult.getType() == Type.SUCCESS && asrResult.getValue() != null && asrResult.getValue().length() > 0) {
synchronized (this) {
_isStarted = false;
}
if (_callback != null) {
_callback.invoke();
}
}
}
}
catch (final Exception e) {
return;
}
}
}
}