Voice to text on Android in offline mode

2019-02-03 20:33发布

Is there anyway in which I can use the Voice to Text feature of Android in offline mode.

In the given example VoiceRecognition.java, it starts and activity with the intent RecognizerIntent.ACTION_RECOGNIZE_SPEECH.

Does it mean that any other apk needs to be installed before hand for this to work or do I need to write my own application to launch on this intent.

I have been searching for this for a long time but is getting confused...

Here is the code I used..

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

private ListView mList;

/**
 * Called with the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Inflate our UI from its XML layout description.
    setContentView(R.layout.voice_recognition);

    // Get display items for later interaction
    Button speakButton = (Button) findViewById(R.id.btn_speak);

    mList = (ListView) findViewById(R.id.list);

    // Check to see if a recognition activity is present
    PackageManager pm = getPackageManager();
    List<ResolveInfo> activities = pm.queryIntentActivities(
            new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
    if (activities.size() != 0) {
        speakButton.setOnClickListener(this);
    } else {
        speakButton.setEnabled(false);
        speakButton.setText("Recognizer not present");
    }
}

/**
 * Handle the click on the start recognition button.
 */
public void onClick(View v) {
    if (v.getId() == R.id.btn_speak) {
        startVoiceRecognitionActivity();
    }
}

/**
 * Fire an intent to start the speech recognition activity.
 */
private void startVoiceRecognitionActivity() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

/**
 * Handle the results from the recognition activity.
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
        // Fill the list view with the strings the recognizer thought it could have heard
        ArrayList<String> matches = data.getStringArrayListExtra(
                RecognizerIntent.EXTRA_RESULTS);
        mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
                matches));
    }

    super.onActivityResult(requestCode, resultCode, data);
}

On running this code it gives Recognizer not present which means no such activity is present. How to resolve this?

1条回答
Rolldiameter
2楼-- · 2019-02-03 21:00

I think you have two problems. First, yes the recognizer functionality is not available on all devices. Make sure you install and update the latest Google Voice Search for Android. I believe it installs the latest recognizer. See http://www.google.com/mobile/voice-actions/ it may be helpful.

As Dante Jiang said in Converting speech to text, According to this article, Google Voice Search is what you actually need.

The Android SDK makes it easy to integrate speech input directly into your own application—just copy and paste from this sample application to get started. Android is an open platform, so your application can potentially make use of any speech recognition service on the device that's registered to receive a RecognizerIntent. Google's Voice Search application, which is pre-installed on many Android devices, responds to a RecognizerIntent by displaying the "Speak now" dialog and streaming audio to Google's servers—the same servers used when a user taps the microphone button on the search widget or the voice-enabled keyboard. (You can check if Voice Search is installed in Settings ➝ Applications ➝ Manage applications.)

In code, you should check to see if the recognition activity is present. I have the following snippet I've used:

// Check to see if a recognition activity is present
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
        new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() != 0) 
{
    speakButton.setOnClickListener(this);
} 
else 
{
    speakButton.setEnabled(false);
    speakButton.setText(R.string.recognizer_not_present);
}

The second problem is that the Android voice recognition requires Internet connectivity. The recognition is not performed on the device, but rather uses Google web services. So, you must be online. Some info on the web services is available at http://waxy.org/2008/11/deconstructing_google_mobiles_voice_search_on_the_iphone/.

查看更多
登录 后发表回答