Ceci est un POC démontrant comment deux robots peuvent se parler de manière autonome en utilisant un LLM et TTS. Il utilise Nats Jetsstream pour le routage des messages, Olllama pour générer du texte à l'aide d'un LLM du choix de l'utilisateur et de l'API PlayHT pour la synthèse de la parole TTS.
Important
Ce projet a été construit uniquement à des fins éducatifs et est donc probablement monté avec des bogues, des inefficacités, etc. Vous devriez considérer ce projet comme très expérimental.
Cliquez pour regarder / écouter un exemple de conversation:
séquenchestre
Participants Gotts comme TTS
Participant Gollm comme LLM
participant Gobot
Participant Rustbot
Participant Rustllm comme LLM
Participant Rusttts comme TTS
Gobot - >> + Rustbot: Salut Rustbot!
Rustbot - >> Rustllm: Salut Rustbot!
Rustllm - >> Rusttts: Salut Gobot!
Rustllm - >> Rustbot: Salut Gobot!
Rustbot - >> - Gobot: Salut Gobot!
Activer Gobot
Gobot - >> Gollm: Salut Gobot!
Gollm - >> Gotts: Apprenez-moi sur Rust!
Gollm - >> Gobot: Apprenez-moi sur Rust!
Gobot - >> - Rustbot: Apprenez-moi sur Rust!
Zoom en vue sur l'architecture de haut niveau:
Organigramme TB
sub-graph ""
playht (API Playht)
Olllama (Olllama)
fin
bot <-> olllama
bot <-> playht
bot <-> nats [[nats jetsstream]]
Note
Mermaid n'a pas de prise en charge appropriée pour contrôler la mise en page ou même les légendes du graphique de base Il y a des solutions de contournement terribles, j'ai donc choisi de ne pas les utiliser dans cette lecture, donc le diagramme peut se sentir un peu difficile
Organigramme TB
Olllama {olllama}
playht {playht}
llm ((llm))
TTS ((TTS))
JetWriter ((JetWriter))
JetReader ((JetReader))
ttschunks (ttschunks)
jetchunks (jetchunks)
invites (invites)
ttsdone (ttsdone)
sub-graph nats jetsstream
Allez (allez)
Rouille (rouille)
fin
Aller - 1. -> JetReader
JetWriter - 7. -> Rust
JetReader-- 2. -> Invite
invites - 3. -> llm
llm -> olllama
llm-- 4. -> ttschunks
llm-- 4. -> jetchunks
jetchunks -> JetWriter
ttschunks -> tts
tts-- 5. -> playht
tts-- 6. -> ttsdone
TTSDONE -> JetWriter
jet.Reader reçoit un message publié sur un sujet Jetsstreamjet.Reader envoie ce message au canal promptsllm lit les messages envoyés au canal prompts et les transmet à Olllama pour la génération LLMllm l'envoie aux canaux ttsChunks et jetChunkstts lit le message et envoie le message à l'API PlayHT et diffuse l'audio au périphérique audio par défaut;tts le travailleur avertit jet.Writer via la chaîne ttsDone qu'elle a fait de lecture de l'audiojet.Writer reçoit la notification sur la chaîne ttsDone et publie le message qu'il a reçu sur le canal jetChunks vers un sujet JetsstreamIl y a quelques conditions préalables:
Les deux robots utilisent les NAT comme canal de communication.
Installer
brew tap nats-io/nats-tools
brew install nats nats-serverCourir:
nats-server -jsnix-shell -p nats-server natscli
nats-server -jsTéléchargez-le à partir du site officiel ou consultez l'installation de Nix ci-dessous.
nix-shell -p ollama
Exécutez un modèle que vous décidez d'utiliser
ollama run llama2Si vous utilisez Linux, vous devez installer les bibliothèques suivantes - en supposant que vous souhaitez jouer avec le service de pardayage bot
Note
Ceci est pour Ubuntu Linux, d'autres distributions ont probablement des noms de packages différents
sudo apt install -y --no-install-recommends libasound2-dev pkg-configUne fois que vous avez créé un compte sur PlayHT, vous devez générer des clés API. Voir ici pour plus de détails.
Maintenant, vous devez les exporter via les variables d'environnement suivantes qui sont lues par les bibliothèques clients que nous utilisons (go-playht, playht_rs):
export PLAYHT_SECRET_KEY=XXXX
export PLAYHT_USER_ID=XXXImportant
Une fois que vous avez commencé gobot vous devez l'inviter. gobot lit l'invite de stdin qui lance la conversation: rusbot attend gobot avant qu'il ne réponde!
Commencez le gobot :
go run ./gobot/... Démarrez le rustbot :
cargo run --manifest-path rustbot/Cargo.toml