2009-11-09 6 views
6

안드로이드에서 텍스트 API에 연설을 사용하고 싶지만 대화 상자에서 속도를 늦추고 싶지는 않습니다. 그것들없이 기능을 사용할 수 있습니까?대화 상자를 표시하지 않고 안드로이드의 음성 인식을 사용할 수 있습니까?

+0

가능한 중복 [내가 짜증나는 대화하지 않고 음성 인식을 사용할 수있는 방법 안드로이드 폰에서 ] (http://stackoverflow.com/questions/6316937/how-can-i-use-speech-recognition-without-the-annoying-dialog-in-android-phones) –

답변

-1

음성 인식에 대한 제

The Intent 대화 상자를 표시하고 그것을 보여주는 해제하는 옵션은 없습니다.

음성 인식 기능을 사용하려면 인식을 위해 소리를 Google에 업로드 할 수 있도록 인터넷에 연결되어 있어야합니다.

+0

Google API는 어떻습니까 ?? 오디오를 텍스트로 변환하는 웹 서비스로 존재합니까? 그렇다면 안드로이드의 의도는 무엇입니까 ?? – mobibob

+1

http://stackoverflow.com/a/10200568/679180 – srf

+0

나는 인터넷에 연결하는 것이 잘못되었다고 확신한다. Wi-Fi를 내 기기에서 껐다가 Wi-Fi 모드로 전환 했는데도 여전히 작동했습니다. RecognitionIntent에 FREE_FORM을 사용하면 인터넷이 필요하지 않습니다. – FateNuller

20

예 가능 :

API의 SpeechRecognizer 클래스를 사용할 수 있습니다. API에 따라 필요에 따라 주 스레드에서 사용되는지, 클래스가 RecognitionListener를 구현하는지 확인하십시오.

private SpeechRecognizer speech; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    speech = SpeechRecognizer.createSpeechRecognizer(this); 
    speech.setRecognitionListener(this); 

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
     this.getPackageName()); 

    speech.startListening(intent); 
} 

@Override 
public void onBeginningOfSpeech() 
{ 
} 

@Override 
public void onBufferReceived(byte[] arg0) 
{ 
} 

@Override 
public void onEndOfSpeech() 
{ 
} 

@Override 
public void onError(int e) 
{ 
} 

@Override 
public void onEvent(int arg0, Bundle arg1) 
{ 
} 

@Override 
public void onPartialResults(Bundle arg0) 
{ 
} 

@Override 
public void onReadyForSpeech(Bundle arg0) 
{ 
} 

@Override 
public void onResults(Bundle data) 
{ 
    ArrayList<String> matches = data.getStringArrayList(
     SpeechRecognizer.RESULTS_RECOGNITION); 

    // Do something useful with the matches =) 
    // ... 
} 

@Override 
public void onRmsChanged(float arg0) 
{ 
} 
+0

음성을 처음부터 인식하고, 음성을 계속 인식하는 방법 .... –

+0

@PradeepSodhi 그걸 pradeep에서 찾아 냈어? 저에게 알려주세요! –

+0

onCreate 메서드 대신 클래스에 SpeechRecognizer 및 SpeechRecognizer를 제공하도록 정의한 경우 speech.startListening (...)을 다시 호출 할 수 있습니다. (나는 더 이상 연설을 사용하지 않으므로 추측 일뿐입니다.) – Knots

7

이 코드

import java.util.ArrayList; 

import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

public class VoiceRecognitionActivity extends Activity implements RecognitionListener { 

    private TextView returnedText; 
    private ToggleButton toggleButton; 
    private ProgressBar progressBar; 
    private SpeechRecognizer speech = null; 
    private Intent recognizerIntent; 
    private String LOG_TAG = "VoiceRecognitionActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_voice_recognition); 
     returnedText = (TextView) findViewById(R.id.textView1); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     toggleButton = (ToggleButton) findViewById(R.id.toggleButton1); 

     progressBar.setVisibility(View.INVISIBLE); 
     speech = SpeechRecognizer.createSpeechRecognizer(this); 
     speech.setRecognitionListener(this); 
     recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,"en"); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName()); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); 

     toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       if (isChecked) { 
        progressBar.setVisibility(View.VISIBLE); 
        progressBar.setIndeterminate(true); 
        speech.startListening(recognizerIntent); 
       } else { 
        progressBar.setIndeterminate(false); 
        progressBar.setVisibility(View.INVISIBLE); 
        speech.stopListening(); 
       } 
      } 
     }); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (speech != null) { 
      speech.destroy(); 
      Log.i(LOG_TAG, "destroy"); 
     } 

    } 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.i(LOG_TAG, "onBeginningOfSpeech"); 
     progressBar.setIndeterminate(false); 
     progressBar.setMax(10); 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     Log.i(LOG_TAG, "onBufferReceived: " + buffer); 
    } 

    @Override 
    public void onEndOfSpeech() { 
     Log.i(LOG_TAG, "onEndOfSpeech"); 
     progressBar.setIndeterminate(true); 
     toggleButton.setChecked(false); 
    } 

    @Override 
    public void onError(int errorCode) { 
     String errorMessage = getErrorText(errorCode); 
     Log.d(LOG_TAG, "FAILED " + errorMessage); 
     returnedText.setText(errorMessage); 
     toggleButton.setChecked(false); 
    } 

    @Override 
    public void onEvent(int arg0, Bundle arg1) { 
     Log.i(LOG_TAG, "onEvent"); 
    } 

    @Override 
    public void onPartialResults(Bundle arg0) { 
     Log.i(LOG_TAG, "onPartialResults"); 
    } 

    @Override 
    public void onReadyForSpeech(Bundle arg0) { 
     Log.i(LOG_TAG, "onReadyForSpeech"); 
    } 

    @Override 
    public void onResults(Bundle results) { 
     Log.i(LOG_TAG, "onResults"); 
     ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     String text = ""; 
     for (String result : matches) 
      text += result + "\n"; 

     returnedText.setText(text); 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) { 
     Log.i(LOG_TAG, "onRmsChanged: " + rmsdB); 
     progressBar.setProgress((int) rmsdB); 
    } 

    public static String getErrorText(int errorCode) { 
     String message; 
     switch (errorCode) { 
     case SpeechRecognizer.ERROR_AUDIO: 
      message = "Audio recording error"; 
      break; 
     case SpeechRecognizer.ERROR_CLIENT: 
      message = "Client side error"; 
      break; 
     case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: 
      message = "Insufficient permissions"; 
      break; 
     case SpeechRecognizer.ERROR_NETWORK: 
      message = "Network error"; 
      break; 
     case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: 
      message = "Network timeout"; 
      break; 
     case SpeechRecognizer.ERROR_NO_MATCH: 
      message = "No match"; 
      break; 
     case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: 
      message = "RecognitionService busy"; 
      break; 
     case SpeechRecognizer.ERROR_SERVER: 
      message = "error from server"; 
      break; 
     case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: 
      message = "No speech input"; 
      break; 
     default: 
      message = "Didn't understand, please try again."; 
      break; 
     } 
     return message; 
    } 

} 

activity_voice_recognition.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:src="@drawable/ic_launcher" /> 

    <ProgressBar 
     android:id="@+id/progressBar1" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/toggleButton1" 
     android:layout_marginTop="28dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/progressBar1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="47dp" /> 

    <ToggleButton 
     android:id="@+id/toggleButton1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="26dp" 
     android:text="ToggleButton" /> 

</RelativeLayout> 

에게 AndroidManifest.xml을 시도

<manifest 
xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.rakesh.voicerecognitionexample" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".VoiceRecognitionActivity" 
      android:label="@string/title_activity_voice_recognition" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
관련 문제