Este es un POC que demuestra cómo dos bots pueden "hablar" de forma autónoma entre sí utilizando un LLM y TTS. Utiliza NATS JETSTREAM para el enrutamiento de mensajes, Ollama para generar texto utilizando una LLM de la elección del usuario y la API PlayHT para TTS Synthesis.
Importante
Este proyecto se construyó puramente con fines educativos y, por lo tanto, probablemente esté montado con errores, ineficiencias, etc. Debe considerar que este proyecto es muy experimental.
Haga clic para ver/escuchar una conversación de muestra:
secuencediagram
Participante Gotts como TTS
Participante Gollm como LLM
Participante Gobot
Participante Rustbot
Participante Rustllm como LLM
Rusttts participante como TTS
Gobot->>+Rustbot: ¡Hola Rustbot!
Rustbot->> Rustllm: ¡Hola Rustbot!
Rustllm->> Rusttts: ¡Hola Gobot!
Rustllm->> Rustbot: ¡Hola Gobot!
Rustbot->>-Gobot: ¡Hola Gobot!
Activar Gobot
Gobot->> Gollm: ¡Hola Gobot!
Gollm->> Gotts: ¡Enséñame sobre Rust!
Gollm->> Gobot: ¡Enséñame sobre Rust!
Gobot->>-Rustbot: ¡Enséñame sobre Rust!
Zoom en la vista de la arquitectura de alto nivel:
TB de diagrama de flujo
subgraph ""
Playht (Playht API)
Ollama (Ollama)
fin
Bot <-> Ollama
bot <-> Playht
bot <-> nats [[nats jetstream]]
Nota
Mermaid no tiene un soporte adecuado para controlar el diseño o incluso las leyendas de gráficos básicos. Hay algunas soluciones terribles, por lo que he optado por no usarlos en este readme, por lo tanto, el diagrama puede sentirse un poco difícil de manejar
TB de diagrama de flujo
Ollama {Ollama}
Playht {Playht}
LLM ((LLM))
TTS ((TTS))
JetWriter ((JetWriter))
JetReader ((JetReader))
ttschunks (ttschunks)
Jetchunks (Jetchunks)
indicaciones (indicaciones)
ttsdone (ttsdone)
Subgraph Nats Jetstream
Ir (ir)
Óxido (óxido)
fin
Ir-- 1.-> JetReader
JetWriter-- 7.-> Rust
JetReader-- 2.-> indicaciones
indicaciones-3.-> llm
LLM-> Ollama
llm- 4.-> ttschunks
llm- 4.-> jetchunks
Jetchunks-> JetWriter
ttschunks-> tts
TTS-- 5.-> Playht
TTS-- 6.-> ttsdone
ttsdone-> jetwriter
jet.Reader recibe un mensaje publicado en un sujeto JetStreamjet.Reader envía este mensaje al canal promptsllm Worker lee los mensajes enviados al canal de prompts y los reenvía a Ollama para la generación de LLMllm la envía a los canales ttsChunks y jetChunkstts Worker lee el mensaje y envía el mensaje a PlayHT API y transmite el audio al dispositivo de audio predeterminado;tts notifica jet.Writer a través del canal ttsDone que ha terminado reproduciendo audiojet.Writer recibe la notificación en el canal ttsDone y publica el mensaje que recibió en el canal jetChunks a un sujeto JetStreamHay algunos requisitos previos:
Ambos bots usan NAT como su canal de comunicación.
Instalar
brew tap nats-io/nats-tools
brew install nats nats-serverCorrer:
nats-server -jsnix-shell -p nats-server natscli
nats-server -jsDescárguelo desde el sitio oficial o vea la instalación de Nix a continuación.
nix-shell -p ollama
Ejecute un modelo que decida usar
ollama run llama2Si se ejecuta en Linux, debe instalar las siguientes bibliotecas, suponiendo que desee jugar con el servicio de habla BOT
Nota
Esto es para Ubuntu Linux, otras distribuciones tienen diferentes nombres de paquetes.
sudo apt install -y --no-install-recommends libasound2-dev pkg-configUna vez que haya creado una cuenta en Playht, necesita generar claves API. Vea aquí para más detalles.
Ahora, debe exportarlas a través de las siguientes variables de entorno que leen las bibliotecas de clientes que utilizamos (GO-Playht, PlayHT_RS):
export PLAYHT_SECRET_KEY=XXXX
export PLAYHT_USER_ID=XXXImportante
Una vez que hayas comenzado gobot , debes indicarlo. gobot lee un mensaje de inmediato de stdin que inicia la conversación: rusbot espera a gobot antes de que responda!
Comienza el gobot :
go run ./gobot/... Comience el rustbot :
cargo run --manifest-path rustbot/Cargo.toml