Este é um POC que demonstra como dois bots podem "falar" de forma autônoma usando um LLM e TTS. Ele usa o Nats JetStream para roteamento de mensagens, Ollama para gerar texto usando um LLM da API da escolha do usuário e do PlayHT para a síntese de fala TTS.
Importante
Este projeto foi construído puramente para fins educacionais e, portanto, é provavelmente montado com bugs, ineficiências, etc. Você deve considerar esse projeto como altamente experimental.
Clique para assistir/ouvir uma amostra de conversa:
Sequenciadoiagram
Participante Gotts como TTS
Participante Gollm como LLM
Gobot do participante
Rustbot do participante
Participante Rustllm como LLM
Participante Rusttts como TTS
GOBOT->>+rustbot: oi rustbot!
RustBot->> Rustllm: oi rustbot!
Rustllm->> Rusttts: Oi GOBOT!
Rustllm->> Rustbot: Oi Gobot!
RustBot->>-GOBOT: Oi GOBOT!
Ative Gobot
GOBOT->> GOLLM: Oi GOBOT!
Gollm->> GOTTS: Ensine-me sobre ferrugem!
Gollm->> GOBOT: Ensine-me sobre ferrugem!
GOBOT->>-RustBot: Ensine-me sobre ferrugem!
Em zoom em vista sobre a arquitetura de alto nível:
FLOWCHART TB
subgraff ""
Playht (Playht API)
Ollama (Ollama)
fim
Bot <-> ollama
bot <-> playht
BOT <-> Nats [[Nats JetStream]]
Observação
A sereia não tem suporte adequado para controlar o layout ou mesmo as legendas básicas do gráfico, existem algumas soluções terríveis, então eu optei por não usá -las neste leitura, portanto, o diagrama pode parecer um pouco difícil
FLOWCHART TB
ollama {ollama}
playht {playht}
LLM ((LLM))
TTS ((TTS))
Jetwriter ((Jetwriter))
JetReader ((JetReader))
ttschunks (ttschunks)
Jetchunks (Jetchunks)
Prompts (prompts)
ttsdone (ttsdone)
SUBGRAPH NATS JetStream
Vá (vá)
Ferrugem (ferrugem)
fim
Vá-- 1.-> JetReader
Jetwriter-- 7.-> ferrugem
JetReader-- 2.-> Promotos
Prompts-- 3.-> llm
LLM-> Ollama
llm-- 4.-> Ttschunks
LLM-- 4.-> Jetchunks
Jetchunks-> Jetwriter
ttschunks-> tts
TTS-- 5.-> Playht
TTS-- 6.-> TtsDone
ttsdone-> jetwriter
jet.Reader recebe uma mensagem publicada em um assunto de jettreamjet.Reader envia esta mensagem para o canal promptsllm lê as mensagens enviadas para o canal prompts e as encaminha para o Ollama para a geração LLMllm envia para os canais ttsChunks e jetChunkstts Worker lê a mensagem e envia a mensagem para reproduzir a API e transmite o áudio para o dispositivo de áudio padrão;tts Worker notifica jet.Writer via ttsDone Channel que está pronto para jogar áudiojet.Writer recebe a notificação no canal ttsDone e publica a mensagem que recebeu no canal jetChunks para um assunto do JetStreamExistem alguns pré -requisitos:
Ambos os bots usam o NATS como seu canal de comunicação.
Instalar
brew tap nats-io/nats-tools
brew install nats nats-serverCorrer:
nats-server -jsnix-shell -p nats-server natscli
nats-server -jsFaça o download do site oficial ou veja a instalação do nix abaixo.
nix-shell -p ollama
Execute um modelo que você decide usar
ollama run llama2Se você estiver em execução no Linux, precisa instalar as seguintes bibliotecas-supondo que você queira brincar com o serviço de língua bot
Observação
Isto é para o Ubuntu Linux, outras distros provavelmente têm nomes de pacotes diferentes
sudo apt install -y --no-install-recommends libasound2-dev pkg-configDepois de criar uma conta no Playht, você precisa gerar teclas de API. Veja aqui para mais detalhes.
Agora, você precisa exportá-los através das seguintes variáveis de ambiente que são lidas pelas bibliotecas de clientes que usamos (go-playht, playht_rs):
export PLAYHT_SECRET_KEY=XXXX
export PLAYHT_USER_ID=XXXImportante
Depois de começar gobot , você precisa solicitá -lo. gobot lê o prompt de stdin , que inicia a conversa: rusbot espera por gobot antes de responder!
Comece o gobot :
go run ./gobot/... Comece o rustbot :
cargo run --manifest-path rustbot/Cargo.toml