2011-06-11 60 views
113

Điều này có thể thực hiện mà không sửa đổi các API Android không? Tôi đã tìm thấy một bài viết về điều này. Có một nhận xét rằng tôi nên thực hiện các sửa đổi đối với API Android. Nhưng nó không nói cách sửa đổi. Ai có thể cho tôi một số gợi ý về cách làm điều đó không? Cảm ơn!Làm thế nào tôi có thể sử dụng tính năng nhận dạng giọng nói mà không có hộp thoại gây phiền nhiễu trong điện thoại Android


Tôi đã tìm thấy bài viết này; SpeechRecognizer Nhu cầu của anh ấy gần giống như tôi. Đó là một tài liệu tham khảo tốt cho tôi!


Tôi đã giải quyết xong vấn đề này.
Tôi googled một mẫu mã có thể sử dụng from this China website Đây là mã nguồn của tôi

package voice.recognition.test; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.widget.Button; 
import android.widget.TextView; 
import java.util.ArrayList; 
import android.util.Log; 



public class voiceRecognitionTest extends Activity implements OnClickListener 
{ 

    private TextView mText; 
    private SpeechRecognizer sr; 
    private static final String TAG = "MyStt3Activity"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      Button speakButton = (Button) findViewById(R.id.btn_speak);  
      mText = (TextView) findViewById(R.id.textView1);  
      speakButton.setOnClickListener(this); 
      sr = SpeechRecognizer.createSpeechRecognizer(this);  
      sr.setRecognitionListener(new listener());   
    } 

    class listener implements RecognitionListener   
    { 
      public void onReadyForSpeech(Bundle params) 
      { 
        Log.d(TAG, "onReadyForSpeech"); 
      } 
      public void onBeginningOfSpeech() 
      { 
        Log.d(TAG, "onBeginningOfSpeech"); 
      } 
      public void onRmsChanged(float rmsdB) 
      { 
        Log.d(TAG, "onRmsChanged"); 
      } 
      public void onBufferReceived(byte[] buffer) 
      { 
        Log.d(TAG, "onBufferReceived"); 
      } 
      public void onEndOfSpeech() 
      { 
        Log.d(TAG, "onEndofSpeech"); 
      } 
      public void onError(int error) 
      { 
        Log.d(TAG, "error " + error); 
        mText.setText("error " + error); 
      } 
      public void onResults(Bundle results)     
      { 
        String str = new String(); 
        Log.d(TAG, "onResults " + results); 
        ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
        for (int i = 0; i < data.size(); i++) 
        { 
           Log.d(TAG, "result " + data.get(i)); 
           str += data.get(i); 
        } 
        mText.setText("results: "+String.valueOf(data.size()));   
      } 
      public void onPartialResults(Bundle partialResults) 
      { 
        Log.d(TAG, "onPartialResults"); 
      } 
      public void onEvent(int eventType, Bundle params) 
      { 
        Log.d(TAG, "onEvent " + eventType); 
      } 
    } 
    public void onClick(View v) { 
      if (v.getId() == R.id.btn_speak) 
      { 
       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,"voice.recognition.test"); 

       intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5); 
        sr.startListening(intent); 
        Log.i("111111","11111111"); 
      } 
    } 
} 

Hãy chắc chắn để xóa các Logs gây phiền nhiễu sau khi gỡ lỗi!

+1

Chắc chắn có thể làm, như tôi đã thấy các ứng dụng khác làm điều đó (Giọng nói vô cùng) nhưng đối với cách, tôi không có một đầu mối.Tôi tưởng tượng bạn có thể bắt đầu bằng cách tải về nguồn Android và kiểm tra trong api nơi giọng nói, và sau đó thử nghiệm mở rộng ... – Eric

+1

như được ghi nhận bởi Femi, hãy chắc chắn để có '' trong tệp AndroidManifest.xml của bạn nếu không SpeechRecognizer sẽ không nhận bất kỳ âm thanh nào – nommer

Trả lời

63

Sử dụng giao diện SpeechRecognizer. Ứng dụng của bạn cần có quyền RECORD_AUDIO và sau đó bạn có thể tạo SpeechRecognizer, cung cấp cho nó RecognitionListener và sau đó gọi phương thức startListening của nó. Bạn sẽ nhận được cuộc gọi lại cho người nghe khi trình nhận dạng giọng nói sẵn sàng bắt đầu nghe cho lời nói và khi nhận được lời nói và chuyển đổi nó thành văn bản.

+0

Cảm ơn lời khuyên của bạn. Tôi sẽ thử ngay bây giờ – Jim31837

+9

cũng đừng quên tiêu diệt SpeechRecognier trong phương thức OnDestroy() như đã lưu ý ở đây: http://stackoverflow.com/a/19931355/2048266 để không nhận được 'đã bị rò rỉ ServiceConnection android.speech.SpeechRecognizer $ Connection @ 414f0e40 ban đầu bị ràng buộc ở đây' lỗi – nommer

+0

Bạn có thể cho tôi xem một ví dụ không? Ngoài ra, tôi có thể sử dụng điều này trong khi màn hình tắt không? –

6

GAST có lớp trừu tượng tiện dụng mà bạn có thể sử dụng để sử dụng lớp SpeechRecognizer với rất ít mã mới. Ngoài ra, còn có một ví dụ về chạy dịch vụ nền SpeechRecognizer dưới dạng thisthis

+0

Bạn có thể hướng dẫn tôi cách cài đặt chúng vào MainActivity không? Điều này có nghĩa là "* Sử dụng {@link Intent} s để bắt đầu và dừng nó?" Cảm ơn rất nhiều – Dante

+0

Bạn có thể cho tôi xem một ví dụ không? Ngoài ra, tôi có thể sử dụng điều này trong khi màn hình tắt không? –

4

Cảm ơn bạn đã đăng bài này! Tôi tìm thấy nó hữu ích để xác định người nghe onclick trong onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mText = (TextView) findViewById(R.id.textView1);  
    MyRecognitionListener listener = new MyRecognitionListener(); 
    sr = SpeechRecognizer.createSpeechRecognizer(this);  
    sr.setRecognitionListener(listener); 

    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
       Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
       intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); 
       intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); 
       intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test"); 
       sr.startListening(intent); 
     } 
    });  
} 
3

tôi ahve cố gắng để lưu trữ tất cả học tập của tôi từ TTS và STT trong this Github Repo. Nếu bạn thích một lớp lót thì bạn có thể sử dụng dự án của tôi.

Nó sử dụng mô hình Nhà máy để chuyển đổi Speech to Text ở trên đường mà không gây phiền nhiễu thoại

SpeechToText (STT).

TranslatorFactory.getInstance().getTranslator(TranslatorFactory.TRANSLATOR_TYPE.SPEECH_TO_TEXT, HomeActivity.this) 
            .initialize("Hello There", HomeActivity.this); 

Output: -

enter image description here

TextToSpeech (TTS)

TranslatorFactory.getInstance().getTranslator(TranslatorFactory.TRANSLATOR_TYPE.TEXT_TO_SPEECH, HomeActivity.this) 
               .initialize((null != message && !message ? message : "Invalid Input"), HomeActivity.this); 

Output: -

enter image description here

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