Làm cách nào để sử dụ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


124

Điều này có thể mà không cần sửa đổi API Android? 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 sửa đổi các API Android. Nhưng nó không nói làm thế nào để sửa đổi. Ai đó có thể cho tôi một số gợi ý về cách làm điều đó? Cảm ơn!


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ư của tôi. Nó là một tài liệu tham khảo tốt cho tôi!


Tôi đã hoàn toàn giải quyết vấn đề này.
Tôi đã lấy mã mẫu có thể sử dụng được từ trang web Trung Quốc này Đâ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 Nhật ký gây phiền nhiễu sau khi gỡ lỗi!


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

1
như Femi đã lưu ý, hãy đảm bảo có <uses-permission android:name="android.permission.RECORD_AUDIO" />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

Câu trả lời:


72

Sử dụng giao diện SpeechRecognizer . Ứng dụng của bạn cần phải có quyền RECORD_AUDIO và sau đó bạn có thể tạo SpeechRecognizer, cung cấp cho nó một RecognitionListener và sau đó gọi startListeningphương thức của nó . Bạn sẽ nhận được cá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 lời nói và khi nó nhận được lời nói và chuyển đổi nó thành văn bản.


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

10
cũng đừng quên phá hủy SpeechRecognier trong phương thức OnDestroy () như đã lưu ý ở đây: stackoverflow.com/a/19931355/2048266 để không gặp has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound herelỗi
nommer

Bạn có thể vui lòng chỉ cho tôi một ví dụ? Ngoài ra, tôi có thể sử dụng cái này trong khi màn hình tắt không?
Ruchir Baronia

7

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


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

Bạn có thể vui lòng chỉ cho tôi một ví dụ? Ngoài ra, tôi có thể sử dụng cái này trong khi màn hình tắt không?
Ruchir Baronia

6

Cảm ơn bạn đã đăng bài này! Tôi thấy hữu ích khi xác định trình 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);
        }
    });     
}

4

Tôi kết thúc việc thực hiện dự án Github để chuyển đổi Văn bản thành lời nói và lời nói thành văn bản mà không có hộp thoại gây phiền nhiễu,

https://github.com/hiteshsahu/Android-TTS-STT/tree/master/app/src/main/java/com/hiteshsahu/stt_tts/translation_engine

 //SPEECH TO TEXT DEMO
    speechToText.setOnClickListener({ view ->

        Snackbar.make(view, "Speak now, App is listening", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()

        TranslatorFactory
                .instance
                .with(TranslatorFactory.TRANSLATORS.SPEECH_TO_TEXT,
                        object : ConversionCallback {
                            override fun onSuccess(result: String) {
                                sttOutput.text = result
                            }

                            override fun onCompletion() {
                            }

                            override fun onErrorOccurred(errorMessage: String) {
                                erroConsole.text = "Speech2Text Error: $errorMessage"
                            }

                        }).initialize("Speak Now !!", this@HomeActivity)

    })


    //TEXT TO SPEECH DEMO
    textToSpeech.setOnClickListener({ view ->

        val stringToSpeak :String = ttsInput.text.toString()

        if (null!=stringToSpeak &&  stringToSpeak.isNotEmpty()) {

            TranslatorFactory
                    .instance
                    .with(TranslatorFactory.TRANSLATORS.TEXT_TO_SPEECH,
                            object : ConversionCallback {
                                override fun onSuccess(result: String) {
                                }

                                override fun onCompletion() {
                                }

                                override fun onErrorOccurred(errorMessage: String) {
                                    erroConsole.text = "Text2Speech Error: $errorMessage"
                                }

                            })
                    .initialize(stringToSpeak, this)

        } else {
            ttsInput.setText("Invalid input")
            Snackbar.make(view, "Please enter some text to speak", Snackbar.LENGTH_LONG).show()
        }

    })

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.