Jarvis GPT: crea tu propia versión de Jarvis de Iron Man usando Python y OpenAI API

Estás leyendo la publicación: Jarvis GPT: crea tu propia versión de Jarvis de Iron Man usando Python y OpenAI API

Foto de Igor Bumba en Unsplash

Chat GPT es un tema candente en este momento y está arrasando en todo el mundo. Su posibilidad de responder de forma similar a la humana es muy apreciada y provoca muchas discusiones sobre el uso futuro de esta herramienta. También hay muchas opiniones, incluida la mía, de que esta solución es extremadamente similar a Jarvis, una supercomputadora/asistente de Tony Stark en la película Iron Man. Cuando era niño, siempre quise crear algo al menos un poco similar a cualquiera de las herramientas de Iron Man. Bueno, no dudé en comprobar si hay alguna API que pueda usar y crear mi propia versión de Jarvis. ¿Quieres ver el resultado? Entonces te animo a que sigas leyendo este post 🙂

API de IA abierta

Afortunadamente, OpenAI tiene alguna API, ¡hurra!
Desafortunadamente, no es gratis, booh…
Afortunadamente, es bastante asequible, ¡hurra! Puede comprobarlo aquí mismo: Enlace de la API de OpenAI Vamos a utilizar la finalización de texto para pasar un texto con probablemente una pregunta o una tarea para resolver. A cambio, deberíamos obtener una respuesta de texto generada por el modelo elegido.

Pero espera… Jarvis habló, ¿verdad?

¡Por supuesto que lo hizo! Esta es toda la diversión de este proyecto que podemos crear una herramienta que se comunicará con nosotros hablando. Vamos a dividirlo en funcionalidades. Esto es lo que necesitamos:

  • Escuche la voz humana y conviértala en texto. El mejor caso sería la solución multilingüe.
  • Comuníquese con la API y lea la respuesta de texto
  • Dilo en voz alta (como lo haría Jarvis) Son 3 sencillos pasos que nos llevarán a crear nuestra propia versión de Jarvis. Es hora de ver el código.

Escuche la voz humana y conviértala en texto

Para hacerlo, utilicé una biblioteca de reconocimiento de voz llamada SpeechRecognition. Este es el módulo que creé para manejar el primer paso.

import speech_recognition as sr r = sr.Recognizer() def speech_to_text(language: str): “””Referencia de idioma: https://gist.github.com/msikma/8912e62ed866778ff8cd””” print(“Hablar ahora”) con sr .Microphone() como fuente: audio_data = r.listen(fuente) print(“Convirtiendo…”) text = r.recognize_google(audio_data, language=language) return text

Solo hay una función que usa las funcionalidades entregadas por la biblioteca. Escucha alguna entrada del micrófono y cada vez que recibe una, los datos se convierten en texto. En este caso, vamos a escuchar el discurso hasta que la persona deje de hablar. Esta es una de las configuraciones que se pueden configurar. También podríamos configurar el micrófono para escuchar durante una cantidad determinada de segundos, pero esto no es lo que queremos. Necesitamos tener la experiencia más humana como si estuviéramos hablando con alguien y luego obtuviéramos una respuesta. Esta biblioteca podría funcionar en línea y fuera de línea. Puede consultar más detalles en la documentación.

Comunicarse con la API

Este es otro módulo de todo el programa. Esta vez se encarga de la comunicación con la API de OpenAI. Dividamos este módulo en partes más pequeñas.

class ChatGPTCommunication: URL = “https://api.openai.com/v1/completions” def __init__(self): self.AUTH_TOKEN = os.getenv(“OPENAI_API_KEY”)

Hay una clase que maneja toda la comunicación. En el fragmento de código anterior, puede notar una referencia simple a la OPENAI_API_KEY variable que se almacena en el .env archivo. No hay magia aquí.

def text_completion(self, text: str): “”” Llame a la API de ChatGPT y devuelva la respuesta como json. Enlace de la API: https://beta.openai.com/docs/api-reference/completions/create “”” openai. api_key = self.AUTH_TOKEN return openai.Completion.create( model=”text-davinci-003″, prompt=text, max_tokens=100, temperatura=0 )

El método anterior presenta una comunicación directa con la API, utilizando la biblioteca openai. Este es el lugar donde podríamos configurar el modelo (por el momento es text-davinci-003 pero hay diversos modelos disponibles. prompt contiene el texto que vamos a generar, es decir, esto es lo que le diremos al programa. max_tokens y la temperatura se explican en la documentación, así que para ser breve, lo explicaré brevemente. La API no es gratuita. Para cada solicitud, “pagamos” algunos tokens. Cuanto más texto haya, más tokens tendremos que pagar. , por lo que max_tokens es una especie de limitación por solicitud de API. La temperatura es un valor entre 0 y 1, donde 0 hará que la API genere una respuesta “bien definida”, mientras que cuanto más cerca de 1, más respuestas creativas podríamos obtener ( con respecto a la documentación). Si está interesado en el precio de la API y la tokenización, aquí hay un enlace a la fuente. Ahora, cuando recibamos una respuesta, hay algunos caracteres especiales que debemos enfrentar. Lo más probable es que aparezcan caracteres de nueva línea. al principio del texto, eso es necesario para deshacerse de esos caracteres especiales para pasar un texto limpio a nuestro módulo de habla que se introducirá en un momento. Por ahora, les mostraré cómo me deshice de los caracteres ‘\n’.

def _remove_first_and_last_newline_characters(self, text: str): while text.startswith(‘\n’): texto = texto[1:]

while texto.termina con(‘\n’): texto = texto[:-1]

return text def _clean_text(self, text: str): “””Devuelve una cadena con los caracteres especiales eliminados.””” clean_text = self._remove_first_and_last_newline_characters(text) clean_text = clean_text.replace(“\n\n”, ‘. ‘ ) texto_limpiado = texto_limpiado.replace(“\n”, ‘. ‘) return texto_limpiado

Esos son dos métodos que simplemente verifican si hay algún carácter ‘\n’ en la respuesta. Eliminamos los que están al principio y al final del texto, mientras que los que están en el medio de la respuesta deben sustituirse con un punto que simbolizará el final de una oración. De esta manera, deberíamos obtener un texto adecuado que sea legible para un módulo de habla.

def ask(self, text: str): “””Envíe un texto a la API de ChatGPT y devuelva la respuesta de texto de AI””” json_response = self.text_completion(text) ai_response = json_response[‘choices’][0][‘text’]

clean_response = self._clean_text(ai_response) devuelve clean_response

El método anterior combina todos los métodos mencionados anteriormente para enviar texto a la API, recibir una respuesta, limpiar esta respuesta y devolver el texto deseado.

Dilo en voz alta

Este módulo contendrá herramientas para hacer que nuestro programa hable. Esperará algún texto que podrá leer en diversos idiomas.

import pyttsx3 class SpeakingPython: AVAILABLE_LANGUAGES = (‘en’, ‘pl’, ‘es’, ‘pt’, ‘it’, ‘fr’) VOICES = { ‘en’: ‘com.apple.speech.lysis.voice. Alex’, ‘pl’: ‘com.apple.speech.síntesis.voice.zosia’, ‘es’: ‘com.apple.speech.síntesis.voice.jorge’, ‘pt’: ‘com.apple.speech. síntesis.voz.joana’, ‘it’: ‘com.apple.speech.síntesis.voz.alice’, ‘fr’: ‘com.apple.speech.síntesis.voz.thomas’ } def __init__(self, idioma= ‘en’): si el idioma no está en self.IDIOMAS_DISPONIBLES: aumentar ValueError(f”¡El idioma dado no es compatible! Tiene que ser uno de:\n {self.IDIOMAS_DISPONIBLES}”) self.language = idioma self.engine = pyttsx3. init() self.motor.setProperty(‘voz’, self.VOCES[language]) self.engine.setProperty(‘rate’, 170) def talk(self, frase: str): “””Haz que tu sistema diga la frase dada””” self.engine.say(frase) self.engine.runAndWait()

Aquí, decidí usar la biblioteca pyttsx3, ya que admite varios idiomas y funcionó bien mientras la probaba localmente. La clase contiene una tupla de idiomas disponibles que puede ajustar utilizando códigos de idioma generales. También puede haber diversas voces para un mismo idioma. También es posible ajustar la velocidad del habla, lo cual es útil porque en algunos idiomas, la velocidad predeterminada de 200 era demasiado rápida y era difícil entender lo que se decía. El método talk() es el principal que hace que tu programa hable.

Ponlo todo junto

Ya viste casi todas las partes necesarias para crear tu versión de Jarvis. Echa un vistazo a un método de la comunicación con API módulo.

def voice_ask(self, language: str): “””Haga una pregunta usando su micrófono y escuche la respuesta del chat gpt””” text = speech_to_text(language) response = self.ask(text) sp = SpeakingPython(language) sp. hablar (respuesta)

Este método combina todas las herramientas mencionadas antes y al final dice la respuesta. Para hacer que la secuencia de comandos sea más útil, utilicé la biblioteca de clics de python para agregar un indicador –lang para determinar el idioma que esperará la secuencia de comandos.

@click.command() @click.option(‘–lang’, default=’en’, type=click.Choice([‘en’,’fr’,’es’,’pl’,’pt’,’it’]), help=’Un idioma que Jarvis esperará’) def ask_jarvis(lang): chat_gpt = ChatGPTCommunication() chat_gpt.voice_ask(lang) if __name__ == ‘__main__’: ask_jarvis()

Además de usar la bandera, el módulo de clic puede establecer valores predeterminados y validar si la bandera dada es la esperada (en este caso, el código de idioma debe estar entre los de la lista). La interfaz de ayuda también lo formatea de una manera bonita para que el usuario pueda entender fácilmente cómo usar el script. Tiene muchas más funcionalidades y te animo a que lo pruebes cada vez que crees algún script de línea de comandos. Puedes ver todo el código en mi repositorio: AQUÍ
También grabé un video para mostrarte cómo funciona realmente.

Conclusión

Eso es todo chicos! Ahora lo has visto todo y puedes crear tu propio Jarvis ❤
Este fue el proyecto en el que pensé durante mucho tiempo, pero solo la llegada de ChatGPT lo hizo realidad.

Espero que se hayan divertido o se diviertan con esta solución. Espero que hayas aprendido algo valioso (presenté 3 bibliotecas para crear Jarvis y te presenté el práctico módulo de “clic”).

Para obtener más contenido interesante como ese, lo animo a que consulte mis otros artículos y le agradecería que me siguiera en Medium. Es posible que desee ver cómo automatizar la generación de facturas como lo describí en mi último artículo.

¡Gracias de nuevo, espero verte pronto aquí y disfruta usando tu Jarvis!

Tabla de Contenido

🔥 Recomendado:  Cómo acceder a Google Bard desde cualquier lugar en 2023