En este tutorial vamos a crear una App Android asistente de voz usando la API de ChatGPT.
Vamos a preguntarle por texto o por voz y nos va a responder con texto o con audio.
Primero armaremos la invocación a la API de OpenAI, enviando una pregunta y capturando la respuesta.
Luego mostraremos el chat en pantalla, o sea, ingresamos la pregunta por un input de texto, el caso más simple, y mostramos la respuesta en un cuadro de texto.
Después haremos que la pregunta se puede ingresar mediante la voz y que la respuesta del chat sea por voz, por audio.
Vamos al sitio de OpenAI: https://openai.com/
Este sistema trabaja con modelos:

Cada modelo tiene distintas características, para este tutorial vamos a ir al grupo GPT-3.5, particularmente el gpt-3.5-turbo, que hace las tareas con muy buena calidad y es recomendado por la plataforma.

Vamos a usar es el endpoint /v1/chat/completions, soportado por el modelo gpt-3.5-turbo.

Vamos a ingresar al sitio y generar la API KEY, que nos va a identificar ante el sistema al invocar la API.
El uso de la API tiene un costo, pero dan crédito de prueba.

Buscamos el servicio /v1/chat/completions:

Como input obligatorios tiene los parámetros model y messages.
Tiene varios como optativos, entre ellos la temperatura, un parámetro importante porque va variando las respuestas del modelo, de más determinístico a más aleatorio (o sea, que tanto “inventa”).
Creamos un proyecto vacío en Android Studio, MiChatGPT, voy a usar Java con version Android 7.0, pero puede ser cualquiera.

Hay que hacer un request a la url de la API, así que vamos a incluir en el build.gradle la librería Volley, que nos permite hacer peticiones.

Creamos una clase Config para guardar la API KEY que obtuvimos.
Ojo!!!!! lo ideal es que no quede adentro de la App, porque es fácilmente accesible para cualquiera que sepa hacerle ingeniería inversa a un apk, lo que da lugar a que alguien más la puede usar y nos lo cobran a nosotros. Lo mejor sería hacer el request a un servidor nuestro, que guarde la API KEY, traslade el request a OpenAI, y retorne la respuesta.

La invocación al servicio la encapsulamos en una clase, Gpt3Api. Colocamos la URL del servicio y creamos una cola de requests para la conexión.

Debemos enviar un json con este formato:

Se puede modelar con un JsonObject, que incluya los campos modelo gpt-3.5-turbo, temperatura opcional y message, que es un JsonArray, que contiene un JsonObject de rol, user y content, con la pregunta.
También agregamos el header authorization bearer y un timeout de 60 segundos, porque a veces tarda en responder.

Esta es la response a procesar:

Aquí hay que ir al campo choices[0], porque es un array,
y obtenemos message, que es un object. De message tomamos el campo content,

En el archivo colors.xml agregamos dos colores que vamos a usar en el activity_main.xml, simplemente para dejar más linda la pantalla:

Definimos la estructura con un linearlayout vertical y un scroll, otro
linearlayout para ir agregando pregunta y respuesta, el input de la pregunta y el botón. Finalmente agrego un progress bar. Así se ve en pantalla:

Así quedaría el código:

En la ActivityMain.java definimos los atributos, los inicializamos:

Le damos funcionalidad al botón, en el evento onClick invocamos el método generateText, que hace el envío a ChatGPT. También agrega la pregunta al layout para que se vea en pantalla y al obtener el resultado hace lo mismo con la respuesta.

Ya tenemos la base funcionando:

Ahora incorporamos las mejoras, ingresar la pregunta mediante la voz y convertir la respuesta en audio.
RecognizerIntent es propio de Android, abre un servicio de Google para la captura de voz, es muy simple pero sirve.
Primero agregamos el permiso andriod.permission.RECORD_AUDIO en el AndroidManifest.xml

Creamos la clase SpeechRecognizer para encapsular esta funcionalidad.

Definimos como atributo una Activity, la que captura y procesa el audio, y un SpeechRecognizer.Listener, una interfaz que se va a invocar una vez procesado el audio (cuando se convierte en texto), ahí es donde vamos a invocar a la API de ChatGPT con la pregunta.
Agregamos el botón en el activity_main.xml

Dentro de la MainActivity debemos implementar la interfaz SpeechRecognizer.Listener y sobreescribir el método onSpeechRecognizer. Creamos un método callChatGpt para invocar al chat, para no repetir código, ya que se va a usar dentro del botón que envía la pregunta (si la ingresa como texto) y del método del listener, si la ingresa como audio.

Dentro del nuevo botón invocamos Start del SpeechRecognizer para que inicie la captura de audio, el resto queda igual:

Para convertir texto (la respuesta que nos da la API de ChatGPT) a voz, vamos a usar el TextToSpeech de Android. Acá también hay que implementar un listener en la MainActivity, TextToSpeech.OnInitListener.
Cuando viene la respuesta del chat la convertimos en audio (de acuerdo a la versión de Android hay un método que está deprecado).

Finalmente agrego un checkbox para indicar si quiero que responda con audio o solo con texto, pero eso lo podés ver en el código completo.
Lo podés encontrar en: https://github.com/unsimpledev/MiChatGPT/tree/main
Un proyecto muy simple que muestra cómo usar la API de ChatGPT para armar un asistente, que mejoramos mediante el uso de las propias herramientas que trae Android, para convertir Voz a Texto y Texto a Voz.