The purpose of this module is to provide access to Android's SpeechRecognizer API for React Native apps.
This module isn't meant to abstract the API. Higher level modules could be written to do that.
The SpeechRecognizer can be used to integrate voice recognition into your app rather than using the default UI.
$ npm install react-native-android-speech-recognizer --save
$ react-native link react-native-android-speech-recognizer
- Open up
android/app/src/main/java/[...]/MainActivity.java
- Add
import de.siteof.rn.androidspeechrecognizer.RNAndroidSpeechRecognizerPackage;
to the imports at the top of the file - Add
new RNAndroidSpeechRecognizerPackage()
to the list returned by thegetPackages()
method
- Append the following lines to
android/settings.gradle
:
include ':react-native-android-speech-recognizer'
project(':react-native-android-speech-recognizer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-speech-recognizer/android')
- Insert the following lines inside the dependencies block in
android/app/build.gradle
:
compile project(':react-native-android-speech-recognizer')
To use this library you will need the RECORD_AUDIO permission.
Insert the following in android/app/src/AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
The API follows Android's SpeechRecognizer and RecognizerIntent
Some changes are necessary due to the way React Native works:
- Methods can only return promises (or nothing) due to being asynchronous
- Types are restricted by the what React Native supports
- Callbacks can't be called multiple times (events can)
import {
SpeechRecognizer,
RecognizerIntent,
RecognitionListener
} from 'react-native-android-speech-recognizer';
const recognise = options => new Promise(async (resolve, reject) => {
const available = await SpeechRecognizer.isRecognitionAvailable();
if (!available) {
reject("not available");
}
const recognizer = await SpeechRecognizer.createSpeechRecognizer();
recognizer.setRecognitionListener({
onError: event => reject("Failed with error code: " + event.error),
onResults: event => {
const recognition = event.results[SpeechRecognizer.RESULTS_RECOGNITION];
const bestRecognition = recognition[0];
resolve(bestRecognition);
}
});
recognizer.startListening(RecognizerIntent.ACTION_RECOGNIZE_SPEECH, {});
});
recognise().then(bestRecognition => {
console.log("recognised:", resultTextToEvent(bestRecognition));
}).catch(error => {
console.log("error:", error);
});
You could also request partial results like so:
recognizer.setRecognitionListener({
// ...
onPartialResults: event => {
const recognition = event.partialResults[SpeechRecognizer.RESULTS_RECOGNITION];
const bestRecognition = recognition[0];
console.log("best recognition so far:", bestRecognition);
}
});
recognizer.startListening(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH, {
[RecognizerIntent.EXTRA_PARTIAL_RESULTS]: true
}
);