Android speech Recognition App Without Pop Up
Solution 1
AndroidManifest.xml
Add the following permission:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
class members
private SpeechRecognizer mSpeechRecognizer;
private Intent mSpeechRecognizerIntent;
private boolean mIslistening;
In onCreate
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
.........
.........
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
this.getPackageName());
SpeechRecognitionListener listener = new SpeechRecognitionListener();
mSpeechRecognizer.setRecognitionListener(listener);
}
in your button listener just use this code
if (!mIsListening)
{
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
In onDestroy
if (mSpeechRecognizer != null)
{
mSpeechRecognizer.destroy();
}
Inside your activity create the inner class
protected class SpeechRecognitionListener implements RecognitionListener
{
@Override
public void onBeginningOfSpeech()
{
//Log.d(TAG, "onBeginingOfSpeech");
}
@Override
public void onBufferReceived(byte[] buffer)
{
}
@Override
public void onEndOfSpeech()
{
//Log.d(TAG, "onEndOfSpeech");
}
@Override
public void onError(int error)
{
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
//Log.d(TAG, "error = " + error);
}
@Override
public void onEvent(int eventType, Bundle params)
{
}
@Override
public void onPartialResults(Bundle partialResults)
{
}
@Override
public void onReadyForSpeech(Bundle params)
{
Log.d(TAG, "onReadyForSpeech"); //$NON-NLS-1$
}
@Override
public void onResults(Bundle results)
{
//Log.d(TAG, "onResults"); //$NON-NLS-1$
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
// matches are the return values of speech recognition engine
// Use these values for whatever you wish to do
}
@Override
public void onRmsChanged(float rmsdB)
{
}
}
EDIT 2015-02-07: Incorporated code from the answers to this question by ZakiMak and Born To Win into the code in this answer to make this one more complete.
Solution 2
It's been a long time since the post. Still for those who are looking, the above code provided by Hoan is almost complete, but there is an important line missing. Both in question and answer and I am not sure how it could work without that.
You need to create the SpeechRecognitionListener and set it as a listener for the SpeechRecognizer. Also it has to be done before we make a call to startListening() method of the SpeechRecognizer.
SpeechRecognitionListener listener = new SpeechRecognitionListener(); mSpeechRecognizer.setRecognitionListener(listener);
Then you also need to remove the listener from the onError event.
Solution 3
Don't Forget to add permission of following:-
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Liam Shalon
Updated on July 09, 2022Comments
-
Liam Shalon almost 2 years
I'm currently looking into getting a career with JAVA and have decided to start by building an app. I have this code right here that I am using to trigger Speech Recognition.
public class MainActivity extends Activity implements OnClickListener{ private static final int VR_REQUEST = 999; private ListView wordList; private final String LOG_TAG = "SpeechRepeatActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button speechBtn = (Button) findViewById(R.id.speech_btn); wordList = (ListView) findViewById (R.id.word_list); PackageManager packManager= getPackageManager(); List<ResolveInfo> intActivities = packManager.queryIntentActivities (new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (intActivities.size() !=0){ speechBtn.setOnClickListener(this); } else { speechBtn.setEnabled(false); Toast.makeText(this,"Oops - Speech Recognition Not Supported!", Toast.LENGTH_LONG).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClick(View v){ if (v.getId() == R.id.speech_btn) { listenToSpeech(); } } private void listenToSpeech() { //start the speech recognition intent passing required data Intent listenIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //indicate package listenIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); //message to display while listening listenIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a word!"); //set speech model listenIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //specify number of results to retrieve listenIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10); //start listening startActivityForResult(listenIntent, VR_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //check speech recognition result if (requestCode == VR_REQUEST && resultCode == RESULT_OK) { //store the returned word list as an ArrayList ArrayList<String> suggestedWords = data. getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); //set the retrieved list to display in the ListView //using an ArrayAdapter wordList.setAdapter(new ArrayAdapter<String> (this, R.layout.word, suggestedWords)); } //this detects which one the user clicks wordList.setOnItemClickListener(new OnItemClickListener(){ //click listener for items within list public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //cast the TextView wordView = (TextView) //retrive the chosen word String wordChosen= (String) wordView. //output for debugging Log.v(LOG_TAG, "chosen:" +wordChosen); }}); super.onActivityResult(requestCode, resultCode, data); } }
In this app the user presses a button and gets displayed with the Google Voice Input screen where you can click a button (it actually goes automatically) and you can speak, it will stop and it will display it. I don't want that window to pop up at all though. Instead just let the user click the button and be able to speak and let the app stop and display the text automatically (it already does that).
PLEASE! I understand that there are already answers on the form showing how to do this, in fact a user name JEEZ posted some code right here.
I don't know if I understood where to put this in my project file. I AM A NOOB! If anyone could help clarify this I would GREATLY appreciate your help.
Here is my code:
package com.example.speechrecognizertest; import android.os.Bundle; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.speech.RecognitionListener; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import android.widget.TextView; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private static final int VR_REQUEST = 999; public static final String TAG = null; private ListView wordList; private final String LOG_TAG = "SpeechRepeatActivity"; private SpeechRecognizer mSpeechRecognizer; private Intent mSpeechRecognizerIntent; private boolean mIslistening; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button speechBtn = (Button) findViewById(R.id.speech_btn); wordList = (ListView) findViewById(R.id.word_list); PackageManager packManager = getPackageManager(); List<ResolveInfo> intActivities = packManager.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); if (!mIslistening) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); } else { speechBtn.setEnabled(false); Toast.makeText(this, "Oops - Speech Recognition Not Supported!", Toast.LENGTH_LONG).show(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } protected class SpeechRecognitionListener implements RecognitionListener { @Override public void onBeginningOfSpeech() { //Log.d(TAG, "onBeginingOfSpeech"); } @Override public void onBufferReceived(byte[] buffer) { } @Override public void onEndOfSpeech() { //Log.d(TAG, "onEndOfSpeech"); } @Override public void onError(int error) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); //Log.d(TAG, "error = " + error); } @Override public void onEvent(int eventType, Bundle params) { } @Override public void onPartialResults(Bundle partialResults) { } @Override public void onReadyForSpeech(Bundle params) { Log.d(TAG, "OnReadyForSpeech"); //$NON-NLS-1$ } @Override public void onResults(Bundle results) { //Log.d(TAG, "onResults"); //$NON-NLS-1$ ArrayList<String> suggestedWords = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); // matches are the return values of speech recognition engine // Use these values for whatever you wish to do wordList.setAdapter(new ArrayAdapter<String>(this, R.layout.word, suggestedWords)); } @Override public void onRmsChanged(float rmsdB) { } }
-
Hoan Nguyen about 11 yearsThe above goes to your MainActivity
-
Jister13 almost 10 yearsWhen I call mSpeechRecognizer.startListening(mSpeechRecognizerIntent); nothing happens, it never says that it is ready for speech...
-
Ethan about 9 yearsI am having an issue here. At the end I convert the array list into a string and set that String to a TextView... the issue is that no text is actually displayed. Any ideas as to how this can happen?
-
Hoan Nguyen about 9 yearsDoes the logcat show the string that you set to a TextView?
-
Admin almost 7 yearsOn Android 6+ the permission RECORD_AUDIO is one of dangerous ones which means you need to ask user to confirm it to actually acquire it. When you're developing your app and using ADB to debug, you might not be prompted to approve the "dangerous" Record Audio (Microphone) permission, so on the device you need to manually open up the app in Settings and grant the permission.