voice
voice copied to clipboard
is the project dead?
is the project dead?
THIS LIB IS DEAD
What would be a good replacement?
is there any replacement for this package ? i havent found yet
If you are only interested in android without ios, then it turned out to be easier for me to write the necessary module in java myself. I can share the script if you are interested
If you are only interested in android without ios, then it turned out to be easier for me to write the necessary module in java myself. I can share the script if you are interested
yes sure pls share with me...and also tell me what are the functionalities have you implemented init ?
to a file AndroidManifest.xml add a line
<uses-permission android:name="android.permission.RECORD_AUDIO" />
to a file MainApplication.java add a line
import com.my_project.SttModule.SttPackage;
...
...
packages.add(new SttPackage());
create a SttModule folder next to the MainApplication.java and put 2 files in this folder:
SttModule.java
package com.my_project.SttModule;
import android.app.Activity;
import android.content.Intent;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import android.content.pm.PackageManager;
import com.facebook.react.bridge.ReactMethod;
import java.util.ArrayList;
import java.util.Locale;
public class SttModule
extends ReactContextBaseJavaModule
implements ActivityEventListener {
final ReactApplicationContext reactContext;
private Promise mVoicepromise;
public SttModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
this.reactContext.addActivityEventListener(this);
}
@Override
public String getName() {
return "SttModule";
}
@ReactMethod
public void startSpeech(String prompt, final Promise promise) {
mVoicepromise = promise;
Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
mVoicepromise.reject("E_ACTIVITY_DOES_NOT_EXIST");
mVoicepromise = null;
return;
}
final Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getPrompt(prompt));
if (intent.resolveActivity(this.reactContext.getPackageManager()) != null) {
try {
this.reactContext.startActivityForResult(intent, 1, null);
} catch (Exception ex) {
mVoicepromise.reject("E_FAILED_TO_SHOW_VOICE: " + ex.getMessage());
mVoicepromise = null;
}
} else {
mVoicepromise.reject(
"Speech Service By Google не установлен. Установите через Google Play"
);
mVoicepromise = null;
}
}
@Override
public void onActivityResult(
Activity activity,
int requestCode,
int resultCode,
Intent data
) {
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
ArrayList<String> result = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS
);
mVoicepromise.resolve(result.get(0));
mVoicepromise = null;
} else {
mVoicepromise.reject("DATA_IS_NULL");
mVoicepromise = null;
}
} else if (resultCode == Activity.RESULT_CANCELED) {
mVoicepromise.reject("RESULT_CANCELED");
mVoicepromise = null;
} else {
mVoicepromise.reject("UNDEFINED CODE: " + Integer.toString(resultCode));
mVoicepromise = null;
}
}
}
public void onNewIntent(Intent intent) {
// no-op
}
private String getPrompt(String prompt) {
if (prompt != null && !prompt.equals("")) {
return prompt;
}
return "Говорите";
}
// https://stackoverflow.com/questions/64672910/speechrecognizer-isrecognitionavailable-always-false-in-android-11
@ReactMethod
public void checkRecAvailable(Promise promise) {
PackageManager pm = this.reactContext.getPackageManager();
Integer intentSize = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0).size();
if (intentSize > 0) {
if (SpeechRecognizer.isRecognitionAvailable(this.reactContext)) {
promise.resolve(true);
} else {
promise.resolve(false);
}
} else {
promise.resolve(false);
}
}
}
SttPackage.java
package com.my_project.SttModule;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SttPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext
) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext
) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new SttModule(reactContext));
return modules;
}
}
Now you can use the function in your js code
export const requestMicrophonePermission = async (title: string, message: string): Promise<boolean> => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
{ title, message, buttonPositive: 'OK' }
);
return granted === PermissionsAndroid.RESULTS.GRANTED;
} catch (err) {
console.warn(err);
}
return false;
};
...
...
...
...
const permission = await requestMicrophonePermission('Нужен доступ к микрофону', 'для записи и распознавания голоса');
if (!permission) {
return Alert.alert('Внимание', 'Нет доступа к микрофону');
}
let speechText = null;
try {
speechText = await SpeechToText();
} catch (err: any) {
if (typeof err === 'string' && err.indexOf('E_VOICE_CANCELLED') !== -1) {
console.log('err', err);
}
return;
}
if (!!speechText?.length) {
onChangeText(speechText.trim());
}
to a file AndroidManifest.xml add a line
<uses-permission android:name="android.permission.RECORD_AUDIO" />
to a file MainApplication.java add a line
import com.my_project.SttModule.SttPackage; ... ... packages.add(new SttPackage());
create a SttModule folder next to the MainApplication.java and put 2 files in this folder:
SttModule.java
package com.my_project.SttModule; import android.app.Activity; import android.content.Intent; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import android.content.pm.PackageManager; import com.facebook.react.bridge.ReactMethod; import java.util.ArrayList; import java.util.Locale; public class SttModule extends ReactContextBaseJavaModule implements ActivityEventListener { final ReactApplicationContext reactContext; private Promise mVoicepromise; public SttModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; this.reactContext.addActivityEventListener(this); } @Override public String getName() { return "SttModule"; } @ReactMethod public void startSpeech(String prompt, final Promise promise) { mVoicepromise = promise; Activity currentActivity = getCurrentActivity(); if (currentActivity == null) { mVoicepromise.reject("E_ACTIVITY_DOES_NOT_EXIST"); mVoicepromise = null; return; } final Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra( RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM ); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getPrompt(prompt)); if (intent.resolveActivity(this.reactContext.getPackageManager()) != null) { try { this.reactContext.startActivityForResult(intent, 1, null); } catch (Exception ex) { mVoicepromise.reject("E_FAILED_TO_SHOW_VOICE: " + ex.getMessage()); mVoicepromise = null; } } else { mVoicepromise.reject( "Speech Service By Google не установлен. Установите через Google Play" ); mVoicepromise = null; } } @Override public void onActivityResult( Activity activity, int requestCode, int resultCode, Intent data ) { if (requestCode == 1) { if (resultCode == Activity.RESULT_OK) { if (data != null) { ArrayList<String> result = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS ); mVoicepromise.resolve(result.get(0)); mVoicepromise = null; } else { mVoicepromise.reject("DATA_IS_NULL"); mVoicepromise = null; } } else if (resultCode == Activity.RESULT_CANCELED) { mVoicepromise.reject("RESULT_CANCELED"); mVoicepromise = null; } else { mVoicepromise.reject("UNDEFINED CODE: " + Integer.toString(resultCode)); mVoicepromise = null; } } } public void onNewIntent(Intent intent) { // no-op } private String getPrompt(String prompt) { if (prompt != null && !prompt.equals("")) { return prompt; } return "Говорите"; } // https://stackoverflow.com/questions/64672910/speechrecognizer-isrecognitionavailable-always-false-in-android-11 @ReactMethod public void checkRecAvailable(Promise promise) { PackageManager pm = this.reactContext.getPackageManager(); Integer intentSize = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0).size(); if (intentSize > 0) { if (SpeechRecognizer.isRecognitionAvailable(this.reactContext)) { promise.resolve(true); } else { promise.resolve(false); } } else { promise.resolve(false); } } }
SttPackage.java
package com.my_project.SttModule; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SttPackage implements ReactPackage { @Override public List<ViewManager> createViewManagers( ReactApplicationContext reactContext ) { return Collections.emptyList(); } @Override public List<NativeModule> createNativeModules( ReactApplicationContext reactContext ) { List<NativeModule> modules = new ArrayList<>(); modules.add(new SttModule(reactContext)); return modules; } }
Now you can use the function in your js code
export const requestMicrophonePermission = async (title: string, message: string): Promise<boolean> => { try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.RECORD_AUDIO, { title, message, buttonPositive: 'OK' } ); return granted === PermissionsAndroid.RESULTS.GRANTED; } catch (err) { console.warn(err); } return false; }; ... ... ... ... const permission = await requestMicrophonePermission('Нужен доступ к микрофону', 'для записи и распознавания голоса'); if (!permission) { return Alert.alert('Внимание', 'Нет доступа к микрофону'); } let speechText = null; try { speechText = await SpeechToText(); } catch (err: any) { if (typeof err === 'string' && err.indexOf('E_VOICE_CANCELLED') !== -1) { console.log('err', err); } return; } if (!!speechText?.length) { onChangeText(speechText.trim()); }
thanks bro <3 i will try it out
@codding123vbf @valery-lavrik is this working fine in android (I am having problems in android with this library , the speech recognizer is automatic shutting off just after 1 second with Error : - {"error": {"message": "5/Client side error"}})
unfortunately it seems like that, sad that there is no alternative ready...