Una biblioteca de voz a texto para React Native.
hilo agregar @react-native-voice/voice# ornpm i @react-native-voice/voice --save
Vincular el paquete de iOS
instalación de pod npx
Enlace
Vincular Android manualmente
Vincular iOS manualmente
Complemento previo a la compilación
Uso
Ejemplo
API
Eventos
Permisos
Androide
iOS
Colaboradores
Vincular manual o automáticamente el NativeModule
enlace nativo de reacción @react-native-voice/voice
En android/setting.gradle
... incluya ':@react-native-voice_voice', ':app'project(':@react-native-voice_voice').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-voice/ voz/android')
En android/app/build.gradle
...dependencias {... compilar proyecto(':@react-native-voice_voice') }
En MainApplication.java
importar android.app.Application; importar com.facebook.react.ReactApplication; importar com.facebook.react.ReactPackage; ...importar com.wenkesj.voice.VoicePackage; // <------ ¡Agrega esto!...clase pública MainActivity extiende la actividad implementa ReactApplication { ...@Overrideprotected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList(new MainReactPackage(),new VoicePackage() // <------ ¡Agrega esto!); } }
Arrastre Voice.xcodeproj desde la carpeta @react-native-voice/voice/ios al grupo Bibliotecas en Xcode en su proyecto. Vinculación manual
Haga clic en el archivo de su proyecto principal (el que representa .xcodeproj), seleccione Fases de compilación y arrastre la biblioteca estática, lib.Voice.a, desde la carpeta Bibliotecas/Voice.xcodeproj/Products para vincular binario con bibliotecas.
Este paquete no se puede utilizar en la aplicación "Expo Go" porque requiere código nativo personalizado.
Después de instalar este paquete npm, agregue el complemento de configuración a la matriz de plugins
de su app.json
o app.config.js
:
{ "expo": {"complementos": ["@react-native-voice/voice"] } }
A continuación, reconstruya su aplicación como se describe en la guía "Agregar código nativo personalizado".
El complemento proporciona accesorios para una personalización adicional. Cada vez que cambies los accesorios o complementos, necesitarás reconstruir (y prebuild
) la aplicación nativa. Si no se agregan propiedades adicionales, se utilizarán las predeterminadas.
speechRecognition
( string | false ): establece el mensaje para la clave NSSpeechRecognitionUsageDescription
en el mensaje Info.plist
. Cuando no está definido, se utilizará un mensaje de permiso predeterminado. Cuando es false
, se omitirá el permiso.
microphone
( cadena | falso ): establece el mensaje para la clave NSMicrophoneUsageDescription
en Info.plist
. Cuando no está definido, se utilizará un mensaje de permiso predeterminado. Cuando false
, android.permission.RECORD_AUDIO
no se agregará a AndroidManifest.xml
y se omitirá el permiso de iOS.
{ "complementos": [ [ "@react-native-voice/voz", {"microphonePermission": "PERSONALIZADO: permitir que $(PRODUCT_NAME) acceda al micrófono","speechRecognitionPermission": "PERSONALIZADO: permitir que $(PRODUCT_NAME) reconozca de forma segura el habla del usuario" } ] ] }
Ejemplo completo para Android e iOS.
importar voz desde '@react-native-voice/voice'; importar React, {Componente} desde 'react'; clase VoiceTest extiende Componente { constructor(props) {Voice.onSpeechStart = this.onSpeechStartHandler.bind(this);Voice.onSpeechEnd = this.onSpeechEndHandler.bind(this);Voice.onSpeechResults = this.onSpeechResultsHandler.bind(this); } onStartButtonPress(e){Voice.start('en-US'); } ...}
Acceso estático a la API de voz.
Todos los métodos ahora devuelven una new Promise
para compatibilidad async/await
.
Nombre del método | Descripción | Plataforma |
---|---|---|
Voz.isAvailable() | Comprueba si hay un servicio de reconocimiento de voz disponible en el sistema. | Androide, iOS |
Voice.start (localización) | Comienza a escuchar el habla de una ubicación específica. Devuelve nulo si no se produce ningún error. | Androide, iOS |
Voz.parada() | Deja de escuchar el habla. Devuelve nulo si no se produce ningún error. | Androide, iOS |
Voz.cancelar() | Cancela el reconocimiento de voz. Devuelve nulo si no se produce ningún error. | Android, iOS |
Voz.destruir() | Destruye la instancia actual de SpeechRecognizer. Devuelve nulo si no se produce ningún error. | Androide, iOS |
Voz.removeAllListeners() | Limpia/anula los métodos estáticos Voice anulados. | Androide, iOS |
Voz.isRecognizing() | Devuelve si SpeechRecognizer está reconociendo. | Androide, iOS |
Voice.getSpeechRecognitionServices() | Devuelve una lista de los motores de reconocimiento de voz disponibles en el dispositivo. (Ejemplo: ['com.google.android.googlequicksearchbox'] si Google es el único disponible). | Androide |
Devoluciones de llamada que se invocan cuando se emite un evento nativo.
Nombre del evento | Descripción | Evento | Plataforma |
---|---|---|---|
Voice.onSpeechStart(evento) | Se invoca cuando se llama .start() sin error. | { error: false } | Androide, iOS |
Voice.onSpeechRecognized(evento) | Se invoca cuando se reconoce el habla. | { error: false } | Androide, iOS |
Voice.onSpeechEnd(evento) | Se invoca cuando SpeechRecognizer detiene el reconocimiento. | { error: false } | Androide, iOS |
Voice.onSpeechError(evento) | Se invoca cuando ocurre un error. | { error: Description of error as string } | Androide, iOS |
Voice.onSpeechResults(evento) | Se invoca cuando SpeechRecognizer termina de reconocer. | { value: [..., 'Speech recognized'] } | Androide, iOS |
Voice.onSpeechPartialResults(evento) | Se invoca cuando se calcula cualquier resultado. | { value: [..., 'Partial speech recognized'] } | Androide, iOS |
Voice.onSpeechVolumeChanged(evento) | Se invoca cuando el tono reconocido cambia. | { value: pitch in dB } | Androide |
Posiblemente la parte más importante.
Si bien la aplicación VoiceTest
incluida funciona sin verificaciones ni solicitudes de permisos explícitos, puede ser necesario agregar una solicitud de permiso para RECORD_AUDIO
para algunas configuraciones. Desde Android M (6.0), el usuario debe otorgar permiso en tiempo de ejecución (y no durante la instalación de la aplicación). De forma predeterminada, llamar al método startSpeech
invocará la ventana emergente de permiso RECORD AUDIO
para el usuario. Esto se puede desactivar pasando REQUEST_PERMISSIONS_AUTO: true
en el argumento de opciones.
Si está ejecutando una aplicación expo/expokit expulsada, puede tener problemas con los permisos en Android y obtener el siguiente error host.exp.exponent.MainActivity cannot be cast to com.facebook.react.ReactActivity startSpeech
. Esto se puede resolver solicitando permiso utilizando el paquete expo-permission
antes de iniciar el reconocimiento.
importar {Permisos} de "expo";async componenteDidMount() {const {estado, expira, permisos} = await Permissions.askAsync(Permissions.AUDIO_RECORDING);if (status!== "concedido") {// Permisos no concedidos. No muestre el botón de inicio de grabación porque causará problemas si se presiona.this.setState({showRecordButton: false});} else {this.setState({showRecordButton: true});}}
Notas sobre Android
Incluso después de que todos los permisos sean correctos en Android, hay una última cosa para asegurarse de que esta biblioteca funcione bien en Android. Asegúrese de que el dispositivo tenga el motor de reconocimiento de voz de Google, como com.google.android.googlequicksearchbox
llamando Voice.getSpeechRecognitionServices()
. Dado que los teléfonos Android se pueden configurar con tantas opciones, incluso si un dispositivo tiene el motor Googlequicksearchbox, se puede configurar para utilizar otros servicios. Puede comprobar qué servicio se utiliza para la aplicación Voice Assistive en los siguientes pasos para la mayoría de los teléfonos Android:
Settings > App Management > Default App > Assistive App and Voice Input > Assistive App
El flujo anterior puede variar según los modelos y fabricantes de Android. Para los teléfonos Huawei, existe la posibilidad de que el dispositivo no pueda instalar los servicios de Google.
¿Cómo puedo obtener com.google.android.googlequicksearchbox
en el dispositivo?
Solicite a los usuarios que instalen la aplicación de búsqueda de Google.
Es necesario incluir permisos para NSMicrophoneUsageDescription
y NSSpeechRecognitionUsageDescription
dentro de Info.plist para iOS. Consulte el VoiceTest
incluido para saber cómo manejar estos casos.
<dictar> ... <key>NSMicrophoneUsageDescription</key> <string>Descripción de por qué requiere el uso del micrófono</string> <key>NSSpeechRecognitionUsageDescripción</key> <string>Descripción de por qué necesita el uso del reconocimiento de voz</string> ... </dict>
Consulte la documentación proporcionada por ReactNative para esto: PermisosAndroid
@asafron
@BrendanFDMoore
@brudny
@chitezh
@ifsnow
@jamsch
@misino
@Noitidart
@ohtangza y @hayanmind
@rudiedev6
@tdonia
@wenkesj