voice icon indicating copy to clipboard operation
voice copied to clipboard

is the project dead?

Open valery-lavrik opened this issue 2 years ago • 9 comments

is the project dead?

valery-lavrik avatar Nov 24 '22 10:11 valery-lavrik

THIS LIB IS DEAD

fukemy avatar Jul 24 '23 06:07 fukemy

What would be a good replacement?

angusryer avatar Jan 05 '24 19:01 angusryer

is there any replacement for this package ? i havent found yet

codding123vbf avatar Feb 15 '24 11:02 codding123vbf

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

valery-lavrik avatar Feb 15 '24 12:02 valery-lavrik

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 ?

codding123vbf avatar Feb 15 '24 12:02 codding123vbf

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());
                                }



valery-lavrik avatar Feb 15 '24 13:02 valery-lavrik

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 avatar Feb 15 '24 13:02 codding123vbf

@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"}})

hemant-bansal-os avatar Apr 30 '24 10:04 hemant-bansal-os

unfortunately it seems like that, sad that there is no alternative ready...

felixmueller-cnnctvstn avatar Jun 07 '24 14:06 felixmueller-cnnctvstn