そのため、シフト ボタンを押したままにしておくとリッスンする sphinx-4 プログラムを作成しています。これは、エラーを防止し、シフト ボタンを押している間だけ音声を聞くようにするためです。シフトボタンを放したら、もう一度押し続けるまでプログラムを待機させたい。ctrl-c が押されると、プログラムは完全に終了します。キーリスナーを使用してこれを行っています。
私が直面している問題は、シフト ボタンを押した後にプログラムが聞き取りを開始することですが、離しても聞き取りを停止しません。コードの何が問題なのかわかりません。作成した MKeyListener クラスの内容は次のとおりです。
public class MKeyListener implements KeyListener {
static ConfigurationManager cm;
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println("Please hold down the shift button to have Sphinx listen.");
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode() == KeyEvent.VK_SHIFT)
{
Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
recognizer.allocate();
// start the microphone or exit if the programm if this is not possible
Microphone microphone = (Microphone) cm.lookup("microphone");
if (!microphone.startRecording()) {
System.out.println("Cannot start microphone.");
recognizer.deallocate();
System.exit(1);
}
System.out.println("Say: (Good morning | Hello) ( Bhiksha | Evandro | Paul | Philip | Rita | Will )");
// loop the recognition until the programm exits.
Boolean var = e.isShiftDown();
while (var == true) {
System.out.println("Start speaking. Press Ctrl-C to quit.\n");
Result result = recognizer.recognize();
if (result != null) {
String resultText = result.getBestFinalResultNoFiller();
System.out.println("You said: " + resultText + '\n');
} else {
System.out.println("I can't hear what you said.\n");
}
var = e.isShiftDown();
System.out.println(var);
}
recognizer.deallocate();
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode() == KeyEvent.VK_SHIFT)
{
Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
recognizer.deallocate();
}
これが私が実行している私のメインクラスです:
public class HelloWorld extends MKeyListener implements KeyListener{
public static void main(String[] args) throws Exception {
JTextField textField = new JTextField();
textField.addKeyListener(new MKeyListener());
JFrame jframe = new JFrame();
jframe.add(textField);
jframe.setSize(400, 350);
jframe.setVisible(true);
if (args.length > 0) {
cm = new ConfigurationManager(args[0]);
} else {
cm = new ConfigurationManager(HelloWorld.class.getResource("helloworld.config.xml"));
}
}
ここで何が間違っていますか?