Это POC, демонстрирующий, как два бота могут автономно «говорить» друг с другом, используя LLM и TTS. Он использует Nats JetStream для маршрутизации сообщений, Ollama для создания текста, используя LLM по выбору пользователя и API PlayHT для синтеза речи TTS.
Важный
Этот проект был построен исключительно для образовательных целей и, следовательно, оправдывается ошибками, неэффективностью и т. Д. Вы должны считать этот проект очень экспериментальным.
Нажмите, чтобы посмотреть/послушать образец разговора:
секвенированная
Участник Готтс как TTS
Участник Голлм как LLM
Участник Гобот
Участник Rustbot
Участник Rustllm как LLM
Участник Rusttts как TTS
Gobot->>+rustbot: привет rustbot!
Rustbot->> rustllm: привет rustbot!
Rustllm->> Rusttts: Привет, гобот!
Rustllm->> Rustbot: Привет, гобо!
Rustbot->>-Гобот: Привет, гобо!
активировать гобот
Гобот->> Голлм: Привет, гобо!
Голлм->> Готтс: научить меня ржавчине!
Голлм->> Гобот: научить меня ржавчине!
Gobot->>-Rustbot: научите меня ржавчине!
Увеличенный в виду архитектуру высокого уровня:
Блок -схема ТБ
подграф ""
Playht (playht api)
Оллама (Оллама)
конец
Бот <-> Оллама
Bot <--> playht
Bot <--> nats [[nats jetstream]]
Примечание
Русалка не обладает надлежащей поддержкой для контроля макета или даже базовых легенд о графике.
Блок -схема ТБ
Оллама {Оллама}
playht {playht}
LLM ((LLM))
TTS ((TTS))
JetWhart ((JetWhart))
JetReader ((JetReader))
Ttschunks (ttschunks)
jetchunks (jetchunks)
Подсказки (подсказки)
TTSDone (TTSDone)
Подграф Nats JetStream
Иди (иди)
Ржавчина (ржавчина)
конец
Go-1.-> JetReader
JetWhart-7.-> Rust
JetReader-- 2.-> подсказки
Подсказки-3.-> llm
LLM-> Оллама
llm-- 4.-> Ttschunks
llm-- 4.-> jetchunks
Jetchunks-> JetWart
Ttschunks-> TTS
TTS-- 5.-> Playht
TTS-- 6.-> TTSDone
TTSDone-> JetWart
jet.Reader получает сообщение, опубликованное по предмету JetStreamjet.Reader отправляет это сообщение на канал promptsllm читает сообщения, отправленные на канал prompts , и направляет их в Ollama для LLM Generationllm отправляет его как каналам ttsChunks и jetChunkstts читает сообщение и отправляет сообщение в API PlayHT и передает аудио на аудиоустройство по умолчанию;tts Worker уведомляет jet.Writer через канал ttsDone , что он закончил воспроизводить Audiojet.Writer получает уведомление на канале ttsDone и публикует сообщение, которое оно получило на канале jetChunks по предмету JetStreamЕсть несколько предпосылок:
Оба бота используют NATS в качестве своего канала связи.
Установить
brew tap nats-io/nats-tools
brew install nats nats-serverБегать:
nats-server -jsnix-shell -p nats-server natscli
nats-server -jsЗагрузите его с официального сайта или посмотрите установку NIX ниже.
nix-shell -p ollama
Запустите модель, которую вы решите использовать
ollama run llama2Если вы работаете на Linux, вам нужно установить следующие библиотеки-при условии, что вы хотите играть с сервисом бота
Примечание
Это для Ubuntu Linux, другие дистрибуции, вероятно, имеют разные названия пакетов
sudo apt install -y --no-install-recommends libasound2-dev pkg-configПосле того, как вы создали учетную запись на PlayHT, вам нужно генерировать клавиши API. Смотрите здесь для более подробной информации.
Теперь вам нужно экспортировать их через следующие переменные среды, которые читаются клиентскими библиотеками, которые мы используем (Go-playht, playht_rs):
export PLAYHT_SECRET_KEY=XXXX
export PLAYHT_USER_ID=XXXВажный
После того, как вы начали gobot вам понадобится его, чтобы вызвать его. gobot читает подсказку от stdin , в котором рассказывается о разговоре: rusbot ждет gobot , прежде чем он ответит!
Начните gobot :
go run ./gobot/... Начните rustbot :
cargo run --manifest-path rustbot/Cargo.toml