Tutoriales - Asistente de Voz con ChatGPT API

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.

El paso a paso

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.

Accedemos a la API de ChatGPT

Vamos al sitio de OpenAI: https://openai.com/

Este sistema trabaja con modelos:

api de chatgpt

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.

api de chatgpt

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

api de chatgpt

Generamos la API KEY

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.

api de chatgpt

Buscamos el servicio /v1/chat/completions:

api de chatgpt

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”).

Codificando!

Creamos un proyecto vacío en Android Studio, MiChatGPT, voy a usar Java con version Android 7.0, pero puede ser cualquiera.

api de chatgpt

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.

api de chatgpt

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.

api de chatgpt

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.

api de chatgpt

Debemos enviar un json con este formato:

api de chatgpt

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. 

api de chatgpt

Esta es la response a procesar:

api de chatgpt

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,

api de chatgpt

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:

api de chatgpt

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:

api de chatgpt

Así quedaría el código:

api de chatgpt

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

api de chatgpt

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.

api de chatgpt

Ya tenemos la base funcionando:

api de chatgpt

Ahora incorporamos las mejoras, ingresar la pregunta mediante la voz y convertir la respuesta en audio.

Ingresar pregunta por voz – RecognizerIntent

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 

api de chatgpt

Creamos la clase SpeechRecognizer para encapsular esta funcionalidad.

api de chatgpt

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

api de chatgpt

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.

api de chatgpt

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

api de chatgpt

Texto a Voz – TextToSpeech

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).

api de chatgpt

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.

El código completo

Lo podés encontrar en: https://github.com/unsimpledev/MiChatGPT/tree/main

Conclusiones

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.