Files
microdao-daarion/site/testing/voice_chat_test/index.html

1022 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://IvanTytar.github.io/microdao-daarion/testing/voice_chat_test/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Тестування голосового чату (STT) через Telegram - DAARION Documentation</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.66ac8b77.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#stt-telegram" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="DAARION Documentation" class="md-header__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
DAARION Documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Тестування голосового чату (STT) через Telegram
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="DAARION Documentation" class="md-nav__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
DAARION Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../public/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/architecture-overview/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/daiS_daos_overview/" class="md-nav__link">
<span class="md-ellipsis">
DAIS & DAOS
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Internal
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Internal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/infra/INFRA_AUTOMATION_PACK_V1/" class="md-nav__link">
<span class="md-ellipsis">
Infra Automation Pack v1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/monitoring_overview/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/nodes_registry_v0/" class="md-nav__link">
<span class="md-ellipsis">
Nodes Registry v0
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Specs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Specs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/specs/matrix_presence_aggregator/" class="md-nav__link">
<span class="md-ellipsis">
Matrix Presence Aggregator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/city_map_spec/" class="md-nav__link">
<span class="md-ellipsis">
City Map Spec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/node_join_protocol_draft/" class="md-nav__link">
<span class="md-ellipsis">
Node Join Protocol (Draft)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
🎤 Що тестуємо?
</span>
</a>
<nav class="md-nav" aria-label="🎤 Що тестуємо?">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-speech-to-text-stt" class="md-nav__link">
<span class="md-ellipsis">
1. Speech-to-Text (STT)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-telegram" class="md-nav__link">
<span class="md-ellipsis">
2. Інтеграція з Telegram
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
✅ Передумови
</span>
</a>
<nav class="md-nav" aria-label="✅ Передумови">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-stt" class="md-nav__link">
<span class="md-ellipsis">
1. Перевірка STT сервісу
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-telegram-gateway" class="md-nav__link">
<span class="md-ellipsis">
2. Перевірка Telegram Gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-local-telegram-bot-api" class="md-nav__link">
<span class="md-ellipsis">
3. Перевірка Local Telegram Bot API
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
🧪 План тестування
</span>
</a>
<nav class="md-nav" aria-label="🧪 План тестування">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#test-case-1" class="md-nav__link">
<span class="md-ellipsis">
Test Case 1: Базова транскрипція
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#test-case-2" class="md-nav__link">
<span class="md-ellipsis">
Test Case 2: Довге голосове повідомлення
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#test-case-3" class="md-nav__link">
<span class="md-ellipsis">
Test Case 3: Різні мови
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#test-case-4" class="md-nav__link">
<span class="md-ellipsis">
Test Case 4: Фонові шуми
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
🐛 Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="🐛 Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
Проблема 1: Бот не відповідає на голосові
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-stt" class="md-nav__link">
<span class="md-ellipsis">
Проблема 2: STT повертає порожній текст
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-30" class="md-nav__link">
<span class="md-ellipsis">
Проблема 3: Повільна транскрипція (&gt; 30 сек)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#metrics-stt" class="md-nav__link">
<span class="md-ellipsis">
📊 Metrics для STT
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
✅ Критерії успіху
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
🚀 Наступні кроки
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="stt-telegram">Тестування голосового чату (STT) через Telegram<a class="headerlink" href="#stt-telegram" title="Permanent link">&para;</a></h1>
<p><strong>Дата</strong>: 2025-11-18<br />
<strong>Сервер</strong>: 144.76.224.179<br />
<strong>Боти</strong>: DAARWIZZ, Helion, GREENFOOD</p>
<hr />
<h2 id="_1">🎤 Що тестуємо?<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<h3 id="1-speech-to-text-stt">1. Speech-to-Text (STT)<a class="headerlink" href="#1-speech-to-text-stt" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Сервіс</strong>: <code>dagi-stt</code> (порт 9000)</li>
<li><strong>Модель</strong>: Whisper (faster-whisper)</li>
<li><strong>Призначення</strong>: Транскрипція голосових повідомлень з Telegram</li>
</ul>
<h3 id="2-telegram">2. Інтеграція з Telegram<a class="headerlink" href="#2-telegram" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Gateway</strong>: <code>telegram-gateway</code> (Long Polling)</li>
<li><strong>Endpoint</strong>: <code>/stt</code> на dagi-stt</li>
<li><strong>Флоу</strong>: </li>
<li>Користувач надсилає голосове повідомлення</li>
<li>Telegram Gateway отримує <code>voice</code> або <code>audio</code> або <code>video_note</code></li>
<li>Завантажує аудіо через Local Telegram Bot API</li>
<li>Відправляє на <code>/stt</code> (dagi-stt)</li>
<li>Отримує текст</li>
<li>Відправляє текст в DAGI Router (як звичайне текстове повідомлення)</li>
<li>Повертає відповідь користувачу</li>
</ul>
<hr />
<h2 id="_2">✅ Передумови<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<h3 id="1-stt">1. Перевірка STT сервісу<a class="headerlink" href="#1-stt" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="c1"># Перевірка статусу</span>
docker<span class="w"> </span>ps<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>dagi-stt
<span class="c1"># Тест health endpoint (якщо є)</span>
curl<span class="w"> </span>http://localhost:9000/health
<span class="c1"># Логи</span>
docker<span class="w"> </span>logs<span class="w"> </span>--tail<span class="w"> </span><span class="m">50</span><span class="w"> </span>dagi-stt
</code></pre></div>
<p><strong>Очікуваний вивід</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="n">INFO</span><span class="o">:</span><span class="w"> </span><span class="n">Started</span><span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="n">process</span><span class="w"> </span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
<span class="n">INFO</span><span class="o">:</span><span class="w"> </span><span class="n">Waiting</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">application</span><span class="w"> </span><span class="n">startup</span><span class="o">.</span>
<span class="n">INFO</span><span class="o">:</span><span class="w"> </span><span class="n">Application</span><span class="w"> </span><span class="n">startup</span><span class="w"> </span><span class="n">complete</span><span class="o">.</span>
<span class="n">INFO</span><span class="o">:</span><span class="w"> </span><span class="n">Uvicorn</span><span class="w"> </span><span class="n">running</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">http</span><span class="o">://</span><span class="mf">0.0</span><span class="o">.</span><span class="mf">0.0</span><span class="o">:</span><span class="mi">9000</span>
</code></pre></div>
<h3 id="2-telegram-gateway">2. Перевірка Telegram Gateway<a class="headerlink" href="#2-telegram-gateway" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="c1"># Статус</span>
docker<span class="w"> </span>ps<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>telegram-gateway
<span class="c1"># Логи (перевірка polling)</span>
docker<span class="w"> </span>logs<span class="w"> </span>--tail<span class="w"> </span><span class="m">50</span><span class="w"> </span>telegram-gateway<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s1">&#39;(daarwizz|helion|greenfood|polling)&#39;</span>
</code></pre></div>
<p><strong>Очікуваний вивід</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">telegram_listener</span><span class="o">:</span><span class="err">🤖</span><span class="w"> </span><span class="n">Creating</span><span class="w"> </span><span class="n">bot</span><span class="o">:</span><span class="w"> </span><span class="mi">8323412397</span><span class="o">:</span><span class="n">AAFxa</span><span class="o">...</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">aiogram</span><span class="o">.</span><span class="na">dispatcher</span><span class="o">:</span><span class="n">Run</span><span class="w"> </span><span class="n">polling</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bot</span><span class="w"> </span><span class="err">@</span><span class="n">DAARWIZZBot</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="mi">8323412397</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">aiogram</span><span class="o">.</span><span class="na">dispatcher</span><span class="o">:</span><span class="n">Run</span><span class="w"> </span><span class="n">polling</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bot</span><span class="w"> </span><span class="err">@</span><span class="n">energyunionBot</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="mi">8112062582</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">aiogram</span><span class="o">.</span><span class="na">dispatcher</span><span class="o">:</span><span class="n">Run</span><span class="w"> </span><span class="n">polling</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bot</span><span class="w"> </span><span class="err">@</span><span class="n">greenfoodliveBot</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="mi">7495165343</span>
</code></pre></div>
<h3 id="3-local-telegram-bot-api">3. Перевірка Local Telegram Bot API<a class="headerlink" href="#3-local-telegram-bot-api" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="c1"># Статус</span>
docker<span class="w"> </span>ps<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>telegram-bot-api
<span class="c1"># Тест</span>
curl<span class="w"> </span>http://localhost:8081/bot&lt;TOKEN&gt;/getMe
</code></pre></div>
<hr />
<h2 id="_3">🧪 План тестування<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2>
<h3 id="test-case-1">Test Case 1: Базова транскрипція<a class="headerlink" href="#test-case-1" title="Permanent link">&para;</a></h3>
<p><strong>Кроки</strong>:
1. Відкрити Telegram
2. Знайти бота <code>@DAARWIZZBot</code> (або <code>@energyunionBot</code>, <code>@greenfoodliveBot</code>)
3. Відправити голосове повідомлення (українською/англійською)
4. Дочекатися відповіді</p>
<p><strong>Очікуваний результат</strong>:
- Бот повинен відповісти текстом (підтвердження транскрипції)
- Час відповіді &lt; 10 секунд</p>
<p><strong>Лог:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">telegram_listener</span><span class="o">:</span><span class="err">📨</span><span class="w"> </span><span class="n">Received</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">chat</span><span class="o">=&lt;</span><span class="n">CHAT_ID</span><span class="o">&gt;</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">telegram_listener</span><span class="o">:</span><span class="err">📤</span><span class="w"> </span><span class="n">Publishing</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">NATS</span><span class="o">:</span><span class="w"> </span><span class="n">agent</span><span class="o">.</span><span class="na">telegram</span><span class="o">.</span><span class="na">update</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">router_handler</span><span class="o">:</span><span class="err">📬</span><span class="w"> </span><span class="n">NATS</span><span class="w"> </span><span class="n">event</span><span class="o">:</span><span class="w"> </span><span class="n">agent</span><span class="o">.</span><span class="na">telegram</span><span class="o">.</span><span class="na">update</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">router_handler</span><span class="o">:</span><span class="err">🔊</span><span class="w"> </span><span class="n">Voice</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="n">detected</span><span class="o">,</span><span class="w"> </span><span class="n">calling</span><span class="w"> </span><span class="n">STT</span><span class="o">...</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">router_handler</span><span class="o">:</span><span class="err">📝</span><span class="w"> </span><span class="n">Transcribed</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;Хочу дізнатися про MicroDAO&quot;</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">router_handler</span><span class="o">:</span><span class="err">📤</span><span class="w"> </span><span class="n">Sending</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">Router</span><span class="o">:</span><span class="w"> </span><span class="n">mode</span><span class="o">=</span><span class="n">chat</span><span class="o">,</span><span class="w"> </span><span class="n">message</span><span class="o">=</span><span class="s2">&quot;Хочу дізнатися про MicroDAO&quot;</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">router_handler</span><span class="o">:</span><span class="err"></span><span class="w"> </span><span class="n">Response</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">Router</span>
<span class="n">INFO</span><span class="o">:</span><span class="n">app</span><span class="o">.</span><span class="na">telegram_listener</span><span class="o">:</span><span class="err">📤</span><span class="w"> </span><span class="n">Sending</span><span class="w"> </span><span class="n">response</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">chat</span><span class="o">=&lt;</span><span class="n">CHAT_ID</span><span class="o">&gt;</span>
</code></pre></div>
<hr />
<h3 id="test-case-2">Test Case 2: Довге голосове повідомлення<a class="headerlink" href="#test-case-2" title="Permanent link">&para;</a></h3>
<p><strong>Кроки</strong>:
1. Надіслати голосове повідомлення &gt; 30 секунд
2. Дочекатися транскрипції</p>
<p><strong>Очікуваний результат</strong>:
- Успішна транскрипція
- Час відповіді &lt; 20 секунд</p>
<hr />
<h3 id="test-case-3">Test Case 3: Різні мови<a class="headerlink" href="#test-case-3" title="Permanent link">&para;</a></h3>
<p><strong>Кроки</strong>:
1. Надіслати українською: "Привіт, як справи?"
2. Надіслати англійською: "Hello, how are you?"
3. Надіслати російською: "Привет, как дела?"</p>
<p><strong>Очікуваний результат</strong>:
- Всі мови коректно розпізнаються
- Whisper підтримує мультимовність</p>
<hr />
<h3 id="test-case-4">Test Case 4: Фонові шуми<a class="headerlink" href="#test-case-4" title="Permanent link">&para;</a></h3>
<p><strong>Кроки</strong>:
1. Надіслати голосове з фоновим шумом (музика, вулиця)
2. Перевірити якість транскрипції</p>
<p><strong>Очікуваний результат</strong>:
- Транскрипція працює, але може містити помилки
- Бот відповідає на основі розпізнаного тексту</p>
<hr />
<h2 id="troubleshooting">🐛 Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="1">Проблема 1: Бот не відповідає на голосові<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p><strong>Діагностика</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># 1. Перевірити логи telegram-gateway</span>
docker<span class="w"> </span>logs<span class="w"> </span>--tail<span class="w"> </span><span class="m">100</span><span class="w"> </span>telegram-gateway<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s1">&#39;(voice|audio|video_note|STT)&#39;</span>
<span class="c1"># 2. Перевірити логи dagi-stt</span>
docker<span class="w"> </span>logs<span class="w"> </span>--tail<span class="w"> </span><span class="m">100</span><span class="w"> </span>dagi-stt<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s1">&#39;(POST|/stt|transcrib)&#39;</span>
<span class="c1"># 3. Перевірити доступність STT</span>
curl<span class="w"> </span>http://localhost:9000/health
</code></pre></div>
<p><strong>Можливі причини</strong>:
- STT сервіс не запущено
- Telegram Gateway не викликає STT
- Помилка завантаження аудіо з Telegram
- Моделі Whisper не завантажені</p>
<p><strong>Рішення</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Перезапустити STT</span>
docker<span class="w"> </span>restart<span class="w"> </span>dagi-stt
<span class="c1"># Перевірити моделі</span>
docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>dagi-stt<span class="w"> </span>ls<span class="w"> </span>-lh<span class="w"> </span>/weights/<span class="w"> </span><span class="c1"># або інший шлях до моделей</span>
</code></pre></div>
<hr />
<h3 id="2-stt">Проблема 2: STT повертає порожній текст<a class="headerlink" href="#2-stt" title="Permanent link">&para;</a></h3>
<p><strong>Діагностика</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Перевірити формат аудіо</span>
docker<span class="w"> </span>logs<span class="w"> </span>dagi-stt<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-i<span class="w"> </span><span class="s1">&#39;format\\|codec\\|error&#39;</span>
</code></pre></div>
<p><strong>Можливі причини</strong>:
- Неправильний формат аудіо (OGG, MP3, WAV)
- Занадто короткий файл (&lt; 1 сек)
- Пошкоджений файл</p>
<p><strong>Рішення</strong>:
- Telegram зазвичай надсилає OGG/Opus - Whisper має підтримувати
- Перевірити конвертацію на стороні STT сервісу</p>
<hr />
<h3 id="3-30">Проблема 3: Повільна транскрипція (&gt; 30 сек)<a class="headerlink" href="#3-30" title="Permanent link">&para;</a></h3>
<p><strong>Діагностика</strong>:</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Перевірити CPU/RAM</span>
docker<span class="w"> </span>stats<span class="w"> </span>dagi-stt
<span class="c1"># Перевірити модель Whisper</span>
docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>dagi-stt<span class="w"> </span>env<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>WHISPER
</code></pre></div>
<p><strong>Можливі причини</strong>:
- Велика модель (large/large-v2) на CPU
- Недостатньо RAM
- Інші процеси навантажують сервер</p>
<p><strong>Рішення</strong>:
- Використовувати <code>tiny</code> або <code>base</code> модель для швидкості
- Додати GPU (NVIDIA) для прискорення
- Збільшити ресурси контейнера</p>
<hr />
<h2 id="metrics-stt">📊 Metrics для STT<a class="headerlink" href="#metrics-stt" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="c1"># Кількість STT запитів</span>
<span class="kr">rate</span><span class="o">(</span><span class="nv">stt_requests_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span>
<span class="c1"># Час транскрипції (p95)</span>
<span class="kr">histogram_quantile</span><span class="o">(</span><span class="mf">0.95</span><span class="p">,</span><span class="w"> </span><span class="kr">rate</span><span class="o">(</span><span class="nv">stt_duration_seconds_bucket</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span>
<span class="c1"># Кількість помилок</span>
<span class="kr">rate</span><span class="o">(</span><span class="nv">stt_errors_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span>
</code></pre></div>
<hr />
<h2 id="_4">✅ Критерії успіху<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h2>
<ol>
<li>✅ STT сервіс працює (<code>docker ps | grep dagi-stt</code>)</li>
<li>✅ Telegram Gateway отримує голосові повідомлення (логи)</li>
<li>✅ Бот коректно транскрибує українську та англійську</li>
<li>✅ Час відповіді &lt; 10 секунд для коротких повідомлень (&lt; 10 сек аудіо)</li>
<li>✅ Бот відповідає на основі транскрибованого тексту</li>
</ol>
<hr />
<h2 id="_5">🚀 Наступні кроки<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h2>
<ol>
<li>Додати підтримку інших форматів (MP3, WAV)</li>
<li>Оптимізувати модель Whisper (smaller model або GPU)</li>
<li>Додати кешування для повторних фраз</li>
<li>Інтеграція з TTS для повної voice-to-voice взаємодії</li>
</ol>
<hr />
<p><em>Тест створено: 2025-11-18</em></p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.instant", "content.code.copy"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.3220b9d7.min.js"></script>
</body>
</html>