Java Google Now服务在我的应用程序中
我被一个服务和谷歌TTS阻止了。。嗯,我希望一个服务在bg中启动,当我说“ok google”或我选择的任何东西时,启动文本识别的意图。我创建了服务,但现在。。。我该怎么办?我卡住了。这是服务:Java Google Now服务在我的应用程序中,java,android,speech-recognition,google-now,google-text-to-speech,Java,Android,Speech Recognition,Google Now,Google Text To Speech,我被一个服务和谷歌TTS阻止了。。嗯,我希望一个服务在bg中启动,当我说“ok google”或我选择的任何东西时,启动文本识别的意图。我创建了服务,但现在。。。我该怎么办?我卡住了。这是服务: public class GnowService extends Service { protected static AudioManager mAudioManager; protected SpeechRecognizer mSpeechRecognizer; prote
public class GnowService extends Service
{
protected static AudioManager mAudioManager;
protected SpeechRecognizer mSpeechRecognizer;
protected Intent mSpeechRecognizerIntent;
protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));
protected boolean mIsListening;
protected volatile boolean mIsCountDownOn;
private static boolean mIsStreamSolo;
static final int MSG_RECOGNIZER_START_LISTENING = 1;
static final int MSG_RECOGNIZER_CANCEL = 2;
@Override
public void onCreate()
{
super.onCreate();
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
this.getPackageName());
}
protected static class IncomingHandler extends Handler
{
private WeakReference<GnowService> mtarget;
IncomingHandler(GnowService target)
{
mtarget = new WeakReference<GnowService>(target);
}
@Override
public void handleMessage(Message msg)
{
final GnowService target = mtarget.get();
switch (msg.what)
{
case MSG_RECOGNIZER_START_LISTENING:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
// turn off beep sound
if (!mIsStreamSolo)
{
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true);
mIsStreamSolo = true;
}
}
if (!target.mIsListening)
{
target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
target.mIsListening = true;
//Log.d(TAG, "message start listening"); //$NON-NLS-1$
}
break;
case MSG_RECOGNIZER_CANCEL:
if (mIsStreamSolo)
{
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, false);
mIsStreamSolo = false;
}
target.mSpeechRecognizer.cancel();
target.mIsListening = false;
//Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$
break;
}
}
}
// Count down timer for Jelly Bean work around
protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000)
{
@Override
public void onTick(long millisUntilFinished)
{
// TODO Auto-generated method stub
}
@Override
public void onFinish()
{
mIsCountDownOn = false;
Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL);
try
{
mServerMessenger.send(message);
message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
mServerMessenger.send(message);
}
catch (RemoteException e)
{
}
}
};
@Override
public void onDestroy()
{
super.onDestroy();
if (mIsCountDownOn)
{
mNoSpeechCountDown.cancel();
}
if (mSpeechRecognizer != null)
{
mSpeechRecognizer.destroy();
}
}
protected class SpeechRecognitionListener implements RecognitionListener
{
@Override
public void onBeginningOfSpeech()
{
// speech input will be processed, so there is no need for count down anymore
if (mIsCountDownOn)
{
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}
//Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$
}
@Override
public void onBufferReceived(byte[] buffer)
{
}
@Override
public void onEndOfSpeech()
{
//Log.d(TAG, "onEndOfSpeech"); //$NON-NLS-1$
}
@Override
public void onError(int error)
{
if (mIsCountDownOn)
{
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}
mIsListening = false;
Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
try
{
mServerMessenger.send(message);
}
catch (RemoteException e)
{
}
//Log.d(TAG, "error = " + error); //$NON-NLS-1$
}
@Override
public void onEvent(int eventType, Bundle params)
{
}
@Override
public void onPartialResults(Bundle partialResults)
{
}
@Override
public void onReadyForSpeech(Bundle params)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
mIsCountDownOn = true;
mNoSpeechCountDown.start();
}
Log.d("", "onReadyForSpeech"); //$NON-NLS-1$
}
@Override
public void onResults(Bundle results)
{
//Log.d(TAG, "onResults"); //$NON-NLS-1$
}
@Override
public void onRmsChanged(float rmsdB)
{
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
在我的主要活动中,我创建了广播接收器
private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent();
serviceIntent.setAction("com.dd.speech.GnowService");
context.startService(serviceIntent);
}
};
首先。。到目前为止是正确的吗?还是我错了?然后,其他几点我不知道我是否理解,我是否能够做到。您有这方面的代码示例吗?在我的回答中,建议识别器始终倾听的解决方案。在说出关键词之前,它什么也做不了。假设应用程序在用户说“开始结束游戏”之前不做任何事情,而在用户说“停止结束游戏”时又不做任何事情
请注意,电池寿命会大大缩短,有时会缩短一半。在“开始-结束游戏”被识别之前(比如“OK Google”现在适用于Google),您的想法是否会阻止语音进入互联网(Google服务器)?如果没有,那么在现有的安卓版本中有可能做到这一点吗?谢谢+1。然后你需要使用Sphinx或离线语音识别器,这只能从Jelly Bean up获得。谢谢Hoan。PocketSphinx是否适用于2.2以上的所有Android版本?如果是这样的话,您可能指的是仅从JellyBean up提供的其他“脱机语音识别器”。对吗?您是否有一个特定的离线识别器?(即,你能推荐一个吗?)JellyBean提供的离线服务是Google语音识别器。但是,您必须关闭internet连接。所以我认为口袋狮身人面像是你的选择。
private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent();
serviceIntent.setAction("com.dd.speech.GnowService");
context.startService(serviceIntent);
}
};