> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/android-sdk/componentes-modulos/captura-de-voz.md).

# Captura de voz - VoiceID

## Introducción <a href="#id-1-introduccion" id="id-1-introduccion"></a>

La captura facial se realiza con el ***Voice Component***.

Este componente se encarga de realizar la captura de voz del usuario y la posterior extracción de las plantillas correspondientes. Sus principales procesos son:

* Gestión interna del micrófono y permisos.
* Entrada de cierto número de frases para posteriormente leer cada una en un paso.
* Análisis de los silencios.
* Análisis del progreso.
* Asistente en los procesos de captura.
* Generación de las plantillas con las características de la voz y puntuaciones.

En el apartado de [Lanzamiento simplificado](/sdks/sdk-mobile/android-sdk/inicializacion/lanzamiento-simplificado.md) se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.

## Dependencia <a href="#id-2-dependencia" id="id-2-dependencia"></a>

La dependencia específica del componente es:

```
implementation "com.facephi.androidsdk:voice_component:$version"
```

## Controladores disponibles <a href="#id-3-controladores-disponibles" id="id-3-controladores-disponibles"></a>

<table data-header-hidden><thead><tr><th width="193.87109375"></th><th></th></tr></thead><tbody><tr><td><strong>Controlador</strong></td><td><strong>Descripción</strong></td></tr><tr><td>VoiceController</td><td>Controlador principal de captura de voz</td></tr></tbody></table>

\
Lanzamiento simplificado
------------------------

Una vez iniciado el SDK y creada una nueva operación se podrá lanzar el componente. Se podrá hacer uso de cualquiera de sus controladores para ejecutar su funcionalidad.

Lanzamiento de la captura:

```kotlin
val response = SDKController.launch(
    VoiceController(VoiceConfigurationData(...))
)
when (response) {
    is SdkResult.Error -> Napier.d("ERROR - ${response.error.name}")
    is SdkResult.Success -> response.data
}
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto *VoiceConfigurationData* que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```kotlin
VoiceConfigurationData(
  phrases = arrayOf(
            "Tu nombre complet y tu dirección",
            "Tu número de documento con letra",
        )
)
```

Se puede editar el listado de frases que se van a mostrar al usuario.

## Recepción del resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

El lanzamiento devolverá la información en formato SdkResult. Pudiendo diferenciarse entre un lanzamiento correcto y uno incorrecto:

```
when (response) {
    is SdkResult.Error -> Napier.d("ERROR - ${response.error}")
    is SdkResult.Success -> response.data
}
```

### Recepción de errores <a href="#id-61-recepcion-de-errores" id="id-61-recepcion-de-errores"></a>

Los errores se devolverán como un objeto 'VoiceError'.

Listado de errores:

* VOC\_ACTIVITY\_RESULT\_MSG\_ERROR: El resultado de la actividad es incorrecto
* VOC\_APPLICATION\_CONTEXT\_ERROR: El contexto de aplicación necesario es nulo
* VOC\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso
* VOC\_CANCEL\_LAUNCH: Se ha hecho una cancelación general del SDK
* VOC\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta
* VOC\_EMPTY\_LICENSE: El String de licencia está vacío
* VOC\_FETCH\_DATA\_ERROR: Error en la recogida del resultado
* VOC\_FLOW\_ERROR: Error en el proceso de flow
* VOC\_INITIALIZATION\_ERROR: Error de inicialización
* VOC\_INTERNAL\_LICENSE\_ERROR: Error interno relacionado con la licencia
* VOC\_MANAGER\_NOT\_INITIALIZED: Los managers son nulos
* VOC\_NO\_DATA\_ERROR: Los datos de entrada son nulos
* VOC\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso
* VOC\_PERMISSION\_DENIED: El usuario ha rechazado los permisos
* VOC\_TIMEOUT: Timeout en el proceso

### Recepción del resultado correcto - *data* <a href="#id-62-recepcion-del-resultado-correcto-data" id="id-62-recepcion-del-resultado-correcto-data"></a>

En la parte de SdkResult.Success - *data*, dispondremos de la clase *VoiceResult*.

Los campos devueltos en el resultado son los siguientes:

**audios**

Contiene un listado de audios capturados en formato ByteArray.

**tokenizedAudios**

Contiene el listado de audios capturados en formato tokenizado de Facephi.

***

## Información avanzada <a href="#id-7-informacion-avanzada" id="id-7-informacion-avanzada"></a>

Este apartado amplía la información del componente.

### Configuración avanzada del componente <a href="#id-71-configuracion-avanzada-del-componente" id="id-71-configuracion-avanzada-del-componente"></a>

Para lanzar el componente actual, se deberá crear un objeto *VoiceConfigurationData* que será la configuración del controlador del componente.

A continuación se detallan todos los campos que forman parte de esta clase.

* `phrases`: Indica la/las frases necesarias para capturar..
* `vibrationEnabled`: Indica la activación de la vibración cuando el widget termine satisfactoriamente.
* `showTutorial`: Indica si el componente activa la pantalla de tutorial. En esta vista se explica de forma intuitiva cómo se realiza la captura.
* `extractionTimeout`: Establece el tiempo máximo que se puede realizar la captura.
* `showDiagnostic`: Mostrar pantallas de diagnóstico al final del proceso.
* `enableQualityCheck`: Activa o desactiva la comprobación de calidad del audio. Se recomienda tenerla siempre activa.
* `showPreviousTip`: Muestra una pantalla previa al lanzamiento de la captura con información sobre el proceso a realizar y un botón para el lanzamiento.

***

## Personalización del componente <a href="#id-8-personalizacion-del-componente" id="id-8-personalizacion-del-componente"></a>

Aparte de los cambios que se pueden realizar a nivel de SDK (los cuales se explican en el documento de [Personalización del SDK](/sdks/sdk-mobile/android-sdk/personalizacion.md)), este componente en concreto permite la modificación de su interfaz.

### Textos <a href="#id-81-textos" id="id-81-textos"></a>

Los textos pueden personalizarse añadiendo un fichero XML de recursos en la aplicación cliente y sobrescribiendo los valores por defecto.

```kotlin
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Previous Tip -->
    <string name="voice_widget_tip_message">Speak clearly and loudly.<br/><br/>Make sure you are in a quiet environment.</string>
    <string name="voice_widget_tip_message_alt">Speak clearly and loudly. Make sure you are in a quiet environment.</string>
    <string name="voice_widget_tip_title">Speech recognition</string>
    <string name="voice_widget_tip_button">Continue</string>
    <string name="voice_widget_tip_anim_alt">Animation in which a person appears holding the phone in front of their face and speaking directly to it. Before you begin, if you are using a screen reader, use headphones.</string>
    <!-- Process -->
    <string name="voice_widget_success_message">Recorded recording</string>
    <string name="voice_widget_speech_message">Speak clearly and close to the microphone</string>
    <string name="voice_widget_speech_more_message">Keep talking</string>
    <string name="voice_widget_speech_empty_message" translatable="false"></string>
    <string name="voice_widget_read_message">Say out loud:</string>
    <string name="voice_widget_speech_noisy_message">There is too much background noise, try to go to a quiet environment</string>
    <string name="voice_widget_success_records_message">successful recordings</string>
    <string name="voice_widget_phrase_generic_error_message">Please repeat the phrase.</string>
    <string name="voice_widget_phrase_long_silence_message">Speak for 2 seconds or more.</string>
    <string name="voice_widget_phrase_long_reverberation_message">Too much echo. Try a different environment.</string>
    <string name="voice_widget_quality_check_error_message">Audio quality is insufficient.</string>
    <string name="voice_widget_multiple_speakers_error_message">Background voices detected. Make sure you are in a quiet environment.</string>
    <!-- Diagnostic -->
    <string name="voice_widget_timeout_title">Time exceeded</string>
    <string name="voice_widget_timeout_desc">We were unable to identify you. Please try again.</string>
    <string name="voice_widget_internal_error_title">There was a technical problem</string>
    <string name="voice_widget_internal_error_desc">We apologize. The capture could not be made</string>
    <string name="voice_widget_exit_alert_accept">Accept</string>
    <string name="voice_widget_exit_alert_cancel">Cancel</string>
    <string name="voice_widget_exit_alert_question">Are you sure you want to finish the process?</string>
    <string name="voice_widget_back_button_alt">Back</string>
    <string name="voice_widget_close_button_alt">Close</string>
    <string name="voice_widget_logo_alt">Logo</string>

</resources>

```

```
                                                                                    |
```

### Animaciones <a href="#id-82-animaciones" id="id-82-animaciones"></a>

Si se desea modificar las animaciones (lottie) de la SDK habría que incluir las animaciones con el mismo nombre en la carpeta res/raw/ de la aplicación.

```
voice_anim_enroll_ko.json
voice_anim_enroll_ok.json
voice_anim_enroll_progress.json
voice_anim_intro.json
```

### Vistas externas <a href="#id-83-vistas-externas" id="id-83-vistas-externas"></a>

Es posible modificar completamente las pantallas del componente manteniendo su funcionalidad y navegación. Para ello deben implementarse los interfaces siguientes:

Pantalla de tip previo:

```kotlin

interface IVoicePreviousTipView {
    @Composable
    fun Content(
        onContinue: () -> Unit,
        onClose: () -> Unit
    )
}

```

Pantalla de diagnóstico de error:

```kotlin

interface IVoiceErrorDiagnosticView {
    @Composable
    fun Content(
        error: VoiceError,
        onRetry: () -> Unit,
        onClose: () -> Unit,
    )
}

```

Pantallas de captura:

```kotlin

interface IVoiceEnrollRecordingView {
    @Composable
    fun Content(
        phrase: String,
        numberRecordedPhrases: Int,
        numberTotalPhrases: Int,
        voiceAmplitude: Float,
        recordingProgress: Int,
        onClose: () -> Unit,
    )
}

```

```kotlin

interface IVoiceEnrollSuccessView {
    @Composable
    fun Content(
        phrase: String,
        numberRecordedPhrases: Int,
        numberTotalPhrases: Int,
        onClose: () -> Unit,
    )
}

```

```kotlin

interface IVoiceEnrollErrorView {
    @Composable
    fun Content(
        phrase: String,
        numberRecordedPhrases: Int,
        numberTotalPhrases: Int,
        onClose: () -> Unit,
    )
}

```

Una vez creadas las clases que implementan los interfaces, en el lanzamiento del componente se podrá añadir el parámetro "customViews" para que se utilicen en el SDK.

<br>
