2013-05-02 29 views
5

Tôi đang làm việc trên một ứng dụng Android sử dụng RecognizerIntent.ACTION_RECOGNIZE_SPEECH ,,, vấn đề của tôi là tôi không biết cách để tạo bộ đệm sẽ ghi lại giọng nói mà người dùng nhập. i đọc rất nhiều trên ngăn xếp tràn, nhưng tôi chỉ không hiểu làm thế nào tôi sẽ bao gồm bộ đệm và dịch vụ nhận dạng cuộc gọi trở lại vào mã của tôi. VÀ LÀM THẾ NÀO S W TÔI CHƠI TRỞ LẠI CHO NỘI DUNG ĐÃ ĐƯỢC TIẾT KIỆM TRONG BUFFER.làm thế nào để xây dựng BufferReceived() để nắm bắt giọng nói bằng cách sử dụng RecognizerIntent?

đây là mã của tôi:

 public class Voice extends Activity implements OnClickListener { 
    byte[] sig = new byte[500000] ; 
    int sigPos = 0 ; 
     ListView lv; 
    static final int check =0; 
    protected static final String TAG = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 



    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


    setContentView(R.layout.voice); 

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
      "com.domain.app"); 

    SpeechRecognizer recognizer = SpeechRecognizer 
      .createSpeechRecognizer(this.getApplicationContext()); 

    RecognitionListener listener = new RecognitionListener() { 

     @Override 
     public void onResults(Bundle results) { 
      ArrayList<String> voiceResults = results 
        .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      if (voiceResults == null) { 
       Log.e(TAG, "No voice results"); 
      } else { 
       Log.d(TAG, "Printing matches: "); 
       for (String match : voiceResults) { 
        Log.d(TAG, match); 
       } 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      Log.d(TAG, "Ready for speech"); 
     } 

     @Override 
     public void onError(int error) { 
      Log.d(TAG, 
        "Error listening for speech: " + error); 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      Log.d(TAG, "Speech starting"); 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      // TODO Auto-generated method stub 
      TextView display=(TextView)findViewById (R.id.Text1); 
        display.setText("True"); 


       System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ; 
       sigPos += buffer.length ; 

     } 

     @Override 
     public void onEndOfSpeech() { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      // TODO Auto-generated method stub 

     } 
    }; 
    recognizer.setRecognitionListener(listener); 
    recognizer.startListening(intent); 




    startActivityForResult(intent,check); 

} 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

} 



} 
+0

Bạn không cần 'startActivityForResult' +' onActivityResult' khi bạn đang sử dụng 'SpeechRecognizer' ... – Kaarel

+0

Vì ICS, onBufferReceived không được gọi nữa.Bạn không thể sử dụng trình nhận dạng giọng nói và nhận âm thanh cùng một lúc. –

Trả lời

3

Android nhận dạng giọng nói API (như cấp API 17) không đưa ra một cách đáng tin cậy để nắm bắt âm thanh.

Bạn có thể sử dụng "bộ đệm nhận được" gọi lại nhưng lưu ý rằng

RecognitionListener nói về onBufferReceived:

More âm thanh đã được nhận. Mục đích của chức năng này là cho phép cung cấp phản hồi cho người dùng về âm thanh đã thu thập. Không có đảm bảo rằng phương thức này sẽ được gọi.

bộ đệm: bộ đệm chứa chuỗi thứ tự lớn 16 bit số nguyên đại diện cho luồng âm thanh một kênh. Tỷ lệ mẫu phụ thuộc vào việc triển khai.

RecognitionService.Callback nói về bufferReceived:

Các dịch vụ nên gọi phương pháp này khi âm thanh đã được nhận. Mục đích của chức năng này là cho phép đưa ra phản hồi cho người dùng liên quan đến âm thanh đã chụp.

bộ đệm: bộ đệm chứa chuỗi thứ tự lớn 16 bit số nguyên đại diện cho luồng âm thanh một kênh. Tỷ lệ mẫu phụ thuộc vào việc triển khai.

Vì vậy, gọi lại này là dành cho thông tin phản hồi liên quan đến âm thanh bắt và không nhất thiết phải là âm thanh bắt chính nó, ví dụ: có thể là một phiên bản thu gọn của nó cho các mục đích trực quan. Ngoài ra, "không có đảm bảo rằng phương pháp này sẽ được gọi là", tức là Tìm kiếm bằng giọng nói của Google có thể cung cấp nó trong phiên bản 1 nhưng sau đó quyết định xóa nó trong phiên bản 2.

Cũng lưu ý rằng phương pháp này có thể được gọi nhiều lần trong quá trình nhận dạng. Tuy nhiên, nó không được ghi lại nếu bộ đệm thể hiện âm thanh được ghi lại hoàn toàn hoặc chỉ đoạn trích từ cuộc gọi cuối cùng. (Tôi cho rằng sau này, nhưng bạn cần phải kiểm tra nó với trình nhận dạng giọng nói của bạn.)

Vì vậy, trong quá trình triển khai, bạn nên sao chép bộ đệm vào một biến toàn cục để được lưu, ví dụ: vào một tệp wav sau khi nhận dạng xong.

+0

ok ,,, nhưng nơi nào tôi đặt bộ đệm void bufferReceived (byte []) trong mã của tôi? @Kaarel –

+0

@HaneenBassam Nhìn vào liên kết thứ 2 trong câu trả lời của tôi, đây là một ví dụ về cách triển khai trình nghe. Trong phần thân của 'bufferReceived', bạn có thể xử lý bộ đệm byte theo bất kỳ cách nào bạn muốn. – Kaarel

+0

hãy @kaarel ,,, nếu bạn có thể xem mã đã chỉnh sửa của tôi ... tôi đã thêm bộ đệm như bạn đã nói –

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