2012-04-03 29 views
7

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 RecognitionServiceRecognitionService.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ì activitiesList 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?

+1

Đ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? –

+1

Đã onStartListening của bạn Bắt đầu làm việc khi bạn bắt đầu dịch vụ SimpleVoiceSearch? @ enzom83 –

Trả lời

7

Nếu bạn muốn queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) nhặt hoạt động của bạn (VoiceServiceStarterActivity) sau đó bạn phải khai báo trong Manifest của ứng dụng của bạn mà hoạt động này xử lý RecognizerIntent.ACTION_RECOGNIZE_SPEECH, như thế này

<activity android:name="VoiceServiceStarterActivity"> 
    <intent-filter> 
    <action android:name="android.speech.action.RECOGNIZE_SPEECH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    ... 
</activity> 

Đối với mã cụ thể hơn có một cái nhìn tại dự án Kõnele (source code) mà chủ yếu là một thực hiện mã nguồn mở của các giao diện thông qua đó nhận dạng giọng nói được cung cấp trên Android, tức là nó bao gồm:

  • ACTION_RECOGNIZE_ PHÁT BIỂU
  • ACTION_WEB_SEARCH
  • RecognitionService

và sử dụng mã nguồn mở máy chủ nhận dạng giọng nói.

+1

Tôi không hiểu tại sao tôi nên tạo một hoạt động mới. Hiện tại tôi có một hoạt động ('VoiceDemoActivity') xử lý trình nhận dạng giọng nói mặc định thông qua một đối tượng' SpeechRecognizer'. Để sử dụng dịch vụ nhận dạng giọng nói tùy chỉnh, tôi phải tạo một đối tượng 'SpeechRecognizer' mới xác định đối tượng' ComponentName' trong phương thức 'createSpeechRecognizer': Tôi giả sử rằng' ComponentName' này nên tham chiếu đến dịch vụ nhận dạng giọng nói tùy chỉnh, vì vậy Tôi đã tạo một lớp 'RecognitionService' mới.Tại sao tôi cần triển khai một hoạt động khác có thể xử lý ý định 'ACTION_RECOGNIZE_SPEECH'? – enzom83

+2

Tôi đã cải thiện câu trả lời của mình một chút, có thể nó đã làm cho nó rõ ràng hơn một chút. – Kaarel

+0

@Kaarel Tôi thực sự thích những gì bạn đã làm trong Kõnele (mặc dù tôi không biết tiếng Estonia). Tôi đã tải xuống mã nguồn từ github để tìm hiểu ví dụ về cách triển khai (chỉ có bằng tiếng Anh) của riêng tôi nhưng nó sẽ không được xây dựng ra khỏi hộp và bản thân ứng dụng đã phát hành (tải xuống từ Google Play) bị kẹt trong * "Phiên âm. .. "*. Tôi có thể tìm hiểu thêm về cấu trúc mã của bạn (3 gói khác nhau) và * tại sao * nó được triển khai theo cách của nó? Cảm ơn! – ripopenid

0

Có, bạn cần phải sử dụng createSpeechRecognizer (bối cảnh Bối cảnh, ComponentName serviceComponent)

Các vấn đề liên quan