Voz a texto sin conexión sin ningún cuadro de diálogo emergente en Android

En este método, vamos a implementar una funcionalidad de voz a texto fuera de línea en nuestro proyecto. Puede funcionar tanto en línea como fuera de línea. Cuando no hay conectividad a Internet, utilizará el modelo de idioma prealmacenado de nuestro dispositivo móvil, por lo que no lo reconoció con mucha claridad, pero dio buenos resultados. Cuando está en línea reconoce todas las palabras correctamente.

Nota: El método fuera de línea no funcionará en aquellos dispositivos cuya versión de API sea inferior a 23.

Implementación paso a paso

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione como lenguaje de programación.

Paso 2: Agregar permiso

Para acceder al micrófono del dispositivo móvil, debemos agregar el permiso RECORD_AUDIO en nuestro archivo AndroidManifest.xml como se muestra a continuación:

<usos-permiso android:name=”android.permission.RECORD_AUDIO”/>

Paso 3: Modificar el archivo colors.xml

Agregue debajo de las líneas en el archivo colors.xml .

<color name=”mic_enabled_color”>#0E87E7</color>

<color name=”mic_disabled_color”>#6D6A6A</color>

Paso 4: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">
  
    <TextView
        android:id="@+id/speak_output_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="20dp"
        android:text="Output Text Here..."
        android:textAlignment="center"
        android:textSize="25sp" />
  
    <ImageView
        android:id="@+id/mic_speak_iv"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginTop="20dp"
        android:src="@drawable/ic_mic"
        app:tint="@color/mic_disabled_color" />
  
</LinearLayout>

Interfaz de usuario de salida:

Paso 5: trabajar con el archivo MainActivity.kt

Vaya al archivo MainActivity.kt y consulte el siguiente código. 

Comprobación del permiso de audio:

Para comenzar, primero debemos permitir que la aplicación acceda al permiso del micrófono. Esta función verificará si la aplicación puede acceder al permiso del micrófono o no. Si no se otorga el permiso, se abrirá la configuración directamente y desde allí el usuario puede permitir el permiso del micrófono manualmente. Esta voz a texto sin conexión no es compatible con versiones de API inferiores, es decir, inferiores a 23, por lo que aquí primero verificamos la versión de API móvil mediante Build.VERSION.SDK_INT, y aquí Build.VERSION_CODES.M devolverá el valor constante de M ie , 23. Reemplace el nombre del paquete del código con el nombre de su paquete (puede encontrar el nombre de su paquete en el archivo AndroidManifest.xml )

Kotlin

private fun checkAudioPermission() {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  // M = 23
            if(ContextCompat.checkSelfPermission(this, "android.permission.RECORD_AUDIO") != PackageManager.PERMISSION_GRANTED) {
                // this will open settings which asks for permission
                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.programmingtech.offlinespeechtotext"))
                startActivity(intent)
                Toast.makeText(this, "Allow Microphone Permission", Toast.LENGTH_SHORT).show()
            }
      }
}

La función que maneja voz a texto:

Esta es la función principal de nuestro proyecto que maneja el habla. Primero tenemos que crear un objeto de la clase SpeechRecognizer del Contexto actual , es decir, esto (si estamos usando Fragmentos , AlertDialog , etc., allí podemos reemplazarlo con contexto ). Luego, debemos crear una intención y adjuntar EXTRA_LANGUAGE_MODEL y LANGUAGE_MODEL_FREE_FORM a la intención. En el método setRecognitionListener() tenemos que anular todas las funciones necesarias como se muestra a continuación. Para obtener el resultado del habla, tenemos que usar onResults()método y almacenar la salida de la lista de arrays del paquete. El elemento en el primer índice dará la salida del discurso. También podemos usar funciones útiles como onBeginningOfSpeech() que se ejecuta primero antes de comenzar a escuchar y onEndOfSpeech() que se ejecuta después del resultado.

Kotlin

private fun startSpeechToText() {
        val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)
        val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        speechRecognizerIntent.putExtra(
            RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        )
        speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
  
        speechRecognizer.setRecognitionListener(object : RecognitionListener {
            override fun onReadyForSpeech(bundle: Bundle?) {}
            override fun onBeginningOfSpeech() {}
            override fun onRmsChanged(v: Float) {}
            override fun onBufferReceived(bytes: ByteArray?) {}
            override fun onEndOfSpeech() {}
            override fun onError(i: Int) {}
  
            override fun onResults(bundle: Bundle) {
                val result = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
                if (result != null) {
                    // result[0] will give the output of speech
                }
            }            
            override fun onPartialResults(bundle: Bundle) {}
            override fun onEvent(i: Int, bundle: Bundle?) {}
        })      
        // starts listening ...
        speechRecognizer.startListening(speechRecognizerIntent) 
}

MainActivity.kt

Kotlin

import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.speech.RecognitionListener
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import java.util.*
  
class MainActivity : AppCompatActivity() {
      
    private lateinit var micIV: ImageView
    private lateinit var outputTV: TextView
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        micIV = findViewById(R.id.mic_speak_iv)
        outputTV = findViewById(R.id.speak_output_tv)
  
        micIV.setOnClickListener {
            checkAudioPermission()
            // changing the color of mic icon, which 
            // indicates that it is currently listening
            micIV.setColorFilter(ContextCompat.getColor(this, R.color.mic_enabled_color)) // #FF0E87E7
            startSpeechToText()
        }
    }
  
    private fun startSpeechToText() {
        val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)
        val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        speechRecognizerIntent.putExtra(
                RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        )
        speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
  
        speechRecognizer.setRecognitionListener(object : RecognitionListener {
            override fun onReadyForSpeech(bundle: Bundle?) {}
            override fun onBeginningOfSpeech() {}
            override fun onRmsChanged(v: Float) {}
            override fun onBufferReceived(bytes: ByteArray?) {}
            override fun onEndOfSpeech() {
                // changing the color of our mic icon to
                // gray to indicate it is not listening
                micIV.setColorFilter(ContextCompat.getColor(applicationContext, R.color.mic_disabled_color)) // #FF6D6A6A
            }
  
            override fun onError(i: Int) {}
  
            override fun onResults(bundle: Bundle) {
                val result = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
                if (result != null) {
                    // attaching the output 
                    // to our textview
                    outputTV.text = result[0] 
                }
            }
  
            override fun onPartialResults(bundle: Bundle) {}
            override fun onEvent(i: Int, bundle: Bundle?) {}
  
        })
        speechRecognizer.startListening(speechRecognizerIntent)
    }
  
    private fun checkAudioPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  // M = 23
            if (ContextCompat.checkSelfPermission(this, "android.permission.RECORD_AUDIO") != PackageManager.PERMISSION_GRANTED) {
                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.programmingtech.offlinespeechtotext"))
                startActivity(intent)
                Toast.makeText(this, "Allow Microphone Permission", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Salida: ejecutar en dispositivo físico

Publicación traducida automáticamente

Artículo escrito por roshank9419 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *