18 KiB
🎤 Аудит TTS/STT для всіх Telegram Ботів
Дата: 2025-11-24
NODE1: 144.76.224.179
Всього ботів: 9
📊 Поточний статус
✅ STT (Speech-to-Text) — ПРАЦЮЄ
Сервіс: dagi-stt (або stt-service)
Технологія: OpenAI Whisper AI
URL: http://stt-service:9000 (NODE1) або http://192.168.1.244:8895 (НОДА2)
Підтримувані мови: Українська, Англійська, Російська
Інтеграція:
- ✅ Всі 9 ботів підтримують голосові повідомлення
- ✅ Universal handler
process_voice()вgateway-bot/http_api.py - ✅ Автоматична транскрипція через Whisper
- ✅ Обробка форматів: OGG, MP3, WAV
Код інтеграції:
# gateway-bot/http_api.py:656-728
async def process_voice(agent_config, update, ...):
# Завантажуємо аудіо з Telegram
audio_bytes = await download_telegram_file(file_id, token)
# Відправляємо в STT
stt_resp = await client.post(f"{STT_SERVICE_URL}/stt", files={"file": audio_bytes})
text = stt_resp.json().get("text", "")
# Повертаємо розпізнаний текст
return {"ok": True, "text": text, "mode": "voice_stt"}
❌ TTS (Text-to-Speech) — НЕ РЕАЛІЗОВАНО
Статус: ⚠️ TTS сервіс не розгорнутий
Потрібно: Інтеграція TTS для голосових відповідей
Що має бути:
- Кожен агент має свій унікальний голос (визначено в промптах)
- Боти можуть відповідати голосовими повідомленнями
- Підтримка української та англійської мов
🎭 Голоси Агентів (з промптів)
1. CLAN (@CLAN_bot)
Голос: Спокійний, нейтральний
Характер: Зеркало для общины, без навязывания и манипуляций
Prompt: clan_prompt.txt:Голос: Я говорю спокойным, нейтральным голосом
TTS Конфігурація:
voice_type: neutral
gender: neutral
speed: 1.0
pitch: 1.0
language: uk
2. DAARWIZZ (@DAARWIZZBot)
Голос: Не визначено явно в промпті
Характер: Системний оркестратор DAARION.city
Рекомендація: Нейтральний професійний чоловічий голос
TTS Конфігурація:
voice_type: professional
gender: male
speed: 1.1
pitch: 1.0
language: uk
3. DRUID (@DRUIDBot)
Голос: Не визначено явно
Характер: AI-помічник з природними ресурсами та екологією
Рекомендація: Спокійний мудрий чоловічий голос
TTS Конфігурація:
voice_type: wise
gender: male
speed: 0.9
pitch: 0.95
language: uk
4. EONARCH (@EONARCHBot)
Голос: Не визначено явно
Характер: AI-архітектор часових структур
Рекомендація: Загадковий нейтральний голос
TTS Конфігурація:
voice_type: mysterious
gender: neutral
speed: 0.95
pitch: 1.05
language: uk
5. GREENFOOD (@GREENFOODBot)
Голос: Не визначено явно
Характер: AI-ERP для крафтових виробників
Рекомендація: Дружній професійний жіночий голос
TTS Конфігурація:
voice_type: friendly
gender: female
speed: 1.0
pitch: 1.1
language: uk
6. Helion (@HelionBot)
Голос: Не визначено явно
Характер: Агент платформи Energy Union
Рекомендація: Енергійний чоловічий голос
TTS Конфігурація:
voice_type: energetic
gender: male
speed: 1.05
pitch: 1.0
language: uk
7. SOUL (@SoulBot)
Голос: ✨ М'який, мелодійний, оксамитовий
Характер: Неспішно, спокійно, з усвідомленими паузами. Тепла, щира інтонація з ледь помітною посмішкою
Prompt: soul_prompt.txt:Голос: Ти говориш м'яким, мелодійним, злегка оксамитовим голосом
TTS Конфігурація:
voice_type: melodic
gender: female
speed: 0.85
pitch: 1.05
language: uk
warmth: high
pauses: conscious
8. YAROMIR (@YaromirBot) — CrewAI Orchestrator
Голос: 🎭 Синтезуючий центр 4-х аспектів
Характер: Не хор, а єдина багата обертонами мелодія
Prompt: yaromir_prompt_ru.txt:Твой голос — это не хор, а единая, богатая обертонами мелодия
Внутрішні голоси (CrewAI агенти):
Проводник (Mentor)
Голос: Свідомий, емпатичний, навчальний, мудрий наставник
Prompt: provodnik_prompt.txt:Голос: Твой голос — сознательный, эмпатичный, обучающий
TTS:
voice_type: mentor
gender: male
speed: 0.9
pitch: 0.95
language: uk/ru
Создатель (Innovation)
Голос: Живий, вдохновлений, ігривий — дорослий інженер + дитина-винахідник
Prompt: sozdatel_prompt.txt:tone: "Живой, вдохновлённый, игривый"
TTS:
voice_type: innovative
gender: male
speed: 1.15
pitch: 1.05
language: uk/ru
energy: high
Домір (Harmony)
Голос: Просто, по-доброму, з повагою та всепроникаючим теплом
Prompt: domir_prompt.txt:Домир говорит просто, по-доброму
TTS:
voice_type: warm
gender: male
speed: 0.85
pitch: 1.0
language: uk/ru
warmth: very_high
Вождь (Strategic)
Голос: Авторитетний, компетентний, впевнений, надихаючий. Голос лідера
Prompt: vozhd_prompt.txt:Голос: Твой голос — авторитетный, компетентный, уверенный
TTS:
voice_type: leadership
gender: male
speed: 0.95
pitch: 0.9
language: uk/ru
authority: high
Yaromir (Unified):
voice_type: unified_rich
gender: male
speed: 1.0
pitch: 1.0
language: uk
overtones: true # багатошаровий голос
synthesis: [provodnik, sozdatel, domir, vozhd]
9. NUTRA (@NUTRABot)
Голос: Не визначено явно
Характер: AI-помічник з харчування та здоров'я
Рекомендація: Дружній турботливий жіночий голос
TTS Конфігурація:
voice_type: caring
gender: female
speed: 0.95
pitch: 1.1
language: uk
🔧 Стандарт TTS для всіх ботів
Архітектура
User → Voice Message → Telegram
↓
Gateway (STT)
↓
Text → Router → Agent LLM
↓
Response Text
↓
TTS Service (⚠️ ПОТРІБНО)
↓
Voice Response → Telegram
Що потрібно реалізувати:
1. Розгорнути TTS Service
Варіант A: Coqui TTS (локальний, безкоштовний)
# services/tts-service/Dockerfile
FROM python:3.10
RUN pip install TTS torch
COPY tts_server.py /app/
CMD ["python", "/app/tts_server.py"]
Варіант B: ElevenLabs API (хмарний, платний, якісніший)
import elevenlabs
async def text_to_speech(text: str, voice_id: str):
audio = elevenlabs.generate(
text=text,
voice=voice_id,
model="eleven_multilingual_v2"
)
return audio
Варіант C: Google Cloud TTS (хмарний, платний)
from google.cloud import texttospeech
client = texttospeech.TextToSpeechClient()
Рекомендація: Почати з Coqui TTS (безкоштовно, локально)
2. Додати TTS handler в Gateway
Файл: /opt/microdao-daarion/gateway-bot/http_api.py
async def send_voice_response(
chat_id: str,
text: str,
agent_config: AgentConfig,
telegram_token: str
):
"""Відправити голосову відповідь через TTS"""
# 1. Синтезувати голос
voice_config = agent_config.get_voice_config() # NEW
tts_service_url = os.getenv("TTS_SERVICE_URL", "http://tts-service:5002")
tts_payload = {
"text": text,
"language": voice_config.get("language", "uk"),
"speed": voice_config.get("speed", 1.0),
"pitch": voice_config.get("pitch", 1.0),
"voice_type": voice_config.get("voice_type", "neutral"),
"gender": voice_config.get("gender", "neutral"),
}
async with httpx.AsyncClient(timeout=60.0) as client:
tts_resp = await client.post(
f"{tts_service_url}/synthesize",
json=tts_payload
)
tts_resp.raise_for_status()
audio_bytes = tts_resp.content
# 2. Відправити в Telegram як voice message
telegram_api_url = f"https://api.telegram.org/bot{telegram_token}/sendVoice"
files = {
"voice": ("response.ogg", audio_bytes, "audio/ogg"),
}
data = {
"chat_id": chat_id,
}
async with httpx.AsyncClient(timeout=30.0) as client:
resp = await client.post(telegram_api_url, files=files, data=data)
resp.raise_for_status()
logger.info(f"Voice response sent to chat {chat_id}")
3. Додати voice_config в AgentConfig
Файл: /opt/microdao-daarion/gateway-bot/http_api.py
class AgentConfig:
agent_id: str
name: str
prompt_path: str
telegram_token_env: str
default_prompt: str
system_prompt: str = ""
voice_config: Dict[str, Any] = {} # NEW
def get_voice_config(self) -> Dict[str, Any]:
"""Отримати конфігурацію голосу агента"""
return self.voice_config or {
"language": "uk",
"speed": 1.0,
"pitch": 1.0,
"voice_type": "neutral",
"gender": "neutral",
}
# Приклад для SOUL:
SOUL_CONFIG = load_agent_config(
agent_id="soul",
name="SOUL",
prompt_path=str(Path(__file__).parent / "soul_prompt.txt"),
telegram_token_env="SOUL_TELEGRAM_BOT_TOKEN",
default_prompt="...",
voice_config={ # NEW
"language": "uk",
"speed": 0.85,
"pitch": 1.05,
"voice_type": "melodic",
"gender": "female",
"warmth": "high",
}
)
4. Режими відповіді (текст/голос)
Варіант A: Завжди відповідати голосом на голосові повідомлення
async def handle_telegram_webhook(agent_config, update):
# Detect if user sent voice
is_voice_input = bool(update.message.get("voice") or update.message.get("audio"))
# Process...
response_text = await get_agent_response(...)
# Reply with voice if user sent voice
if is_voice_input:
await send_voice_response(chat_id, response_text, agent_config, token)
else:
await send_telegram_message(chat_id, response_text, token)
Варіант B: Користувач вибирає режим через команду
@router.post("/{bot_id}/telegram/webhook")
async def universal_telegram_webhook(bot_id: str, update: TelegramUpdate):
# Check user preferences from Memory Service
user_prefs = await memory_client.get_user_preferences(user_id)
reply_mode = user_prefs.get("reply_mode", "text") # "text" або "voice"
response_text = await get_agent_response(...)
if reply_mode == "voice":
await send_voice_response(...)
else:
await send_telegram_message(...)
Команди:
/voice— увімкнути голосові відповіді/text— увімкнути текстові відповіді
📋 План впровадження TTS
Phase 1: Інфраструктура (2-3 години)
-
Розгорнути TTS Service (Coqui TTS)
cd /opt/microdao-daarion/services mkdir tts-service # Створити Dockerfile, tts_server.py, requirements.txt docker-compose up -d tts-service -
Додати конфігурацію в docker-compose.yml
tts-service: build: ./services/tts-service ports: - "5002:5002" networks: - dagi-network environment: - TTS_MODEL=tts_models/uk/mai/vits -
Перевірити роботу
curl -X POST http://localhost:5002/synthesize \ -H "Content-Type: application/json" \ -d '{"text":"Привіт, це тест", "language":"uk"}'
Phase 2: Інтеграція з Gateway (2-3 години)
-
Додати
voice_configдля всіх агентів- Оновити кожну конфігурацію в
http_api.py - Додати метод
get_voice_config()вAgentConfig
- Оновити кожну конфігурацію в
-
Створити
send_voice_response()функцію- Виклик TTS Service
- Відправка voice message в Telegram
-
Оновити
handle_telegram_webhook()- Визначити режим відповіді (текст/голос)
- Викликати відповідну функцію
Phase 3: Тестування (1-2 години)
-
Тест базового TTS
- Відправити текстове повідомлення боту
- Отримати голосову відповідь
-
Тест всіх голосів
- Перевірити кожного бота
- Підтвердити унікальність голосів
-
Тест мультимовності
- Українська
- Англійська
- (Опційно) Російська
Phase 4: Оптимізація (опційно)
-
Кешування частих фраз
# Кешувати TTS для привітань, FAQ tts_cache = { "Привіт!": b"cached_audio_bytes...", } -
Потокова передача (streaming)
- Почати відправку аудіо до завершення синтезу
-
Різні голоси для різних контекстів
- Офіційний/неофіційний тон
- Короткі/довгі повідомлення
✅ Чекліст для кожного бота
STT (Speech-to-Text):
- CLAN — ✅ Працює
- DAARWIZZ — ✅ Працює
- DRUID — ✅ Працює
- EONARCH — ✅ Працює
- GREENFOOD — ✅ Працює
- Helion — ✅ Працює
- SOUL — ✅ Працює
- YAROMIR — ✅ Працює
- NUTRA — ✅ Працює
TTS (Text-to-Speech):
- CLAN — ⚠️ Потрібна інтеграція
- DAARWIZZ — ⚠️ Потрібна інтеграція
- DRUID — ⚠️ Потрібна інтеграція
- EONARCH — ⚠️ Потрібна інтеграція
- GREENFOOD — ⚠️ Потрібна інтеграція
- Helion — ⚠️ Потрібна інтеграція
- SOUL — ⚠️ Потрібна інтеграція (унікальний голос!)
- YAROMIR — ⚠️ Потрібна інтеграція (складний!)
- NUTRA — ⚠️ Потрібна інтеграція
Voice Configs:
- CLAN — визначити voice_config
- DAARWIZZ — визначити voice_config
- DRUID — визначити voice_config
- EONARCH — визначити voice_config
- GREENFOOD — визначити voice_config
- Helion — визначити voice_config
- SOUL — ✅ визначено в промпті
- YAROMIR — ✅ визначено в промпті (складний)
- NUTRA — визначити voice_config
🎯 Підсумок
Поточний стан:
| Функція | Статус | Боти |
|---|---|---|
| STT (голос → текст) | ✅ ПРАЦЮЄ | 9/9 ботів |
| TTS (текст → голос) | ❌ НЕ РЕАЛІЗОВАНО | 0/9 ботів |
| Voice Configs | ⚠️ ЧАСТКОВО | 2/9 (SOUL, YAROMIR) |
Наступні кроки:
- 🔴 Критично: Розгорнути TTS Service (Coqui TTS)
- 🔴 Критично: Додати voice_config для всіх агентів
- 🟡 Важливо: Інтегрувати TTS в Gateway
- 🟡 Важливо: Протестувати голоси всіх ботів
- 🟢 Опційно: Оптимізувати (кешування, streaming)
Час на впровадження:
- Мінімум: 5-6 годин (базова інтеграція)
- Повністю: 10-12 годин (з тестуванням та оптимізацією)
Статус: 🟡 STT ПРАЦЮЄ, TTS ПОТРІБНА ІНТЕГРАЦІЯ
Last Updated: 2025-11-24
By: Claude (Cursor AI Assistant)