Tôi đã tạo một dịch vụ nhận dạng giọng nói đơn giản: cho mục đích này tôi đã tạo một lớp con của android.speech.RecognitionService
và tôi đã tạo một hoạt động để bắt đầu và dừng dịch vụ này.Cách đăng ký dịch vụ nhận dạng giọng nói tùy chỉnh?
Dịch vụ nhận dạng giọng nói tùy chỉnh của tôi trivially sử dụng trình nhận dạng giọng nói mặc định, vì mục tiêu của tôi chỉ đơn giản là hiểu cách các lớp RecognitionService
và RecognitionService.Callback
hoạt động.
public class SimpleVoiceService extends RecognitionService {
private SpeechRecognizer m_EngineSR;
@Override
public void onCreate() {
super.onCreate();
Log.i("SimpleVoiceService", "Service started");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("SimpleVoiceService", "Service stopped");
}
@Override
protected void onCancel(Callback listener) {
m_EngineSR.cancel();
}
@Override
protected void onStartListening(Intent recognizerIntent, Callback listener) {
m_EngineSR.setRecognitionListener(new VoiceResultsListener(listener));
m_EngineSR.startListening(recognizerIntent);
}
@Override
protected void onStopListening(Callback listener) {
m_EngineSR.stopListening();
}
/**
*
*/
private class VoiceResultsListener implements RecognitionListener {
private Callback m_UserSpecifiedListener;
/**
*
* @param userSpecifiedListener
*/
public VoiceResultsListener(Callback userSpecifiedListener) {
m_UserSpecifiedListener = userSpecifiedListener;
}
@Override
public void onBeginningOfSpeech() {
try {
m_UserSpecifiedListener.beginningOfSpeech();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onBufferReceived(byte[] buffer) {
try {
m_UserSpecifiedListener.bufferReceived(buffer);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onEndOfSpeech() {
try {
m_UserSpecifiedListener.endOfSpeech();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onError(int error) {
try {
m_UserSpecifiedListener.error(error);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onEvent(int eventType, Bundle params) { ; }
@Override
public void onPartialResults(Bundle partialResults) {
try {
m_UserSpecifiedListener.partialResults(partialResults);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onReadyForSpeech(Bundle params) {
try {
m_UserSpecifiedListener.readyForSpeech(params);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onResults(Bundle results) {
try {
m_UserSpecifiedListener.results(results);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onRmsChanged(float rmsdB) {
try {
m_UserSpecifiedListener.rmsChanged(rmsdB);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
Tôi bắt đầu và ngừng dịch vụ bằng hoạt động sau.
public class VoiceServiceStarterActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button startButton = new Button(this);
startButton.setText("Start the service");
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { startVoiceService(); }
});
Button stopButton = new Button(this);
stopButton.setText("Stop the service");
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { stopVoiceService(); }
});
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(startButton);
layout.addView(stopButton);
setContentView(layout);
}
private void startVoiceService() {
startService(new Intent(this, SimpleVoiceService.class));
}
private void stopVoiceService() {
stopService(new Intent(this, SimpleVoiceService.class));
}
}
Cuối cùng tôi đã khai báo dịch vụ của mình trên AndroidManifest.xml
(xem mẫu VoiceRecognition trong thư mục Android SDK).
<service android:name="SimpleVoiceService"
android:label="@string/service_name" >
<intent-filter>
<action android:name="android.speech.RecognitionService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
Sau đó, tôi cài đặt ứng dụng này trên thiết bị Android và tôi bắt đầu nó: - khi tôi bắt đầu dịch vụ, nó bắt đầu đúng cách; - khi tôi dừng nó, nó dừng lại đúng cách.
Nhưng nếu tôi khởi chạy mã sau trong một hoạt động khác, thì activities
List
chỉ chứa một phần tử, là trình nhận dạng giọng nói mặc định.
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
Tại sao trình nhận dạng giọng nói của tôi không được trả lại trong số những người hiện diện trong hệ thống?
Điều này cho phép chúng tôi ghi đè 'Google Now' mặc định RecognitionService? Ý tôi là, tôi có thể móc dịch vụ nhận dạng mở rộng của riêng mình cho google bây giờ không? –
Đã onStartListening của bạn Bắt đầu làm việc khi bạn bắt đầu dịch vụ SimpleVoiceSearch? @ enzom83 –