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