forked from hesabix/arc
6 KiB
Executable file
6 KiB
Executable file
پیادهسازی گفتوگوی صوتی (دوطرفه و استریم) برای AI
فازهای اجرایی
| فاز | محتوا | وضعیت |
|---|---|---|
| ۱ — بکاند | پردازش utterance غیرمسدودکننده، availability قبل از ذخیره پیام، رویداد voice_status، ثبت ai_voice_interactions برای بازخورد، بررسی وابستگیها |
✅ |
| ۲ — فرانت | state machine (VoicePhase)، مسدودسازی چت متنی، reconnect با start مجدد، نوار وضعیت |
✅ |
| ۳ — UX / l10n | متنهای ترجمهشده، میکروفون فقط برای شروع، پایان با دکمه قرمز | ✅ |
| ۴ — کیفیت | تستهای کمکی، مستندات، هشدار TTS dummy | ✅ |
| ۵ — وب | AudioWorklet + WS باینری PCM (بدون base64) | ✅ |
| ۶ — فشردهسازی | WebM/Opus با MediaRecorder مرورگر + PyAV محلی | ✅ |
| ۷ — TTS فارسی | Piper ONNX محلی (voice_tts_piper_voice_fa) — سازگار Python 3.12 |
✅ |
همه مراحل STT/VAD/TTS/فشردهسازی روی سرور و مرورگر خودتان اجرا میشوند؛ API ابری صوتی استفاده نمیشود.
Endpoint
- WebSocket:
/ws/ai/voice(بدون query؛api_keyدر URL قرار نگیرد.) - احراز هویت (اولین فریم JSON):
{"type":"auth","api_key":"<کلید_کاربر>"}
- شروع جلسه (پس از
ready):- دسکتاپ/موبایل:
{"type":"start","session_id":123,"input_codec":"pcm","audio_transport":"binary"} - وب (PCM):
input_codec":"pcm",audio_transport":"binary"— فریمهای PCM باینری - وب (فشرده):
input_codec":"webm_opus",audio_transport":"base64"— chunkهایaudio_webmبا Opus داخل WebM
- دسکتاپ/موبایل:
- ورودی صوت: PCM16LE mono 16kHz (فریمهای ~20ms توصیه میشود؛ VAD در سرور buffer میکند)
- خروجی:
- رویدادهای JSON (
transcript_final,voice_status,assistant_text_delta, …) - فریم PCM16LE یا
assistant_audioبا base64 (وب)
- رویدادهای JSON (
رویدادهای وضعیت (voice_status)
| phase | معنی |
|---|---|
listening |
آماده شنیدن کاربر |
thinking |
LLM در حال پردازش |
planning_tools |
برنامهریزی ابزار |
tool_running |
اجرای ابزار (+ label / tool_key) |
writing |
تولید متن |
speaking |
پخش TTS |
تنظیمات (ENV / Settings)
در hesabixAPI/app/core/settings.py:
voice_enabledvoice_*برای VAD/STT/TTSvoice_tts_engine:dummy(آزمایش) یاpiper(تولید، Python 3.12+)voice_tts_piper_voice_fa: شناسه مدل، مثلاًfa_IR-ganji-mediumvoice_tts_piper_models_dir: مسیر ذخیره فایلهای.onnxvoice_tts_model_name/voice_tts_model_path: override اختیاری Pipercoqui: فقط Python <3.12 (legacy)voice_data_collection_enabled+voice_data_collection_dirبرای ذخیره PCM با opt-in
نصب وابستگیها
خودکار (deploy / update)
- deploy.sh: در پرسشها «Install AI voice chat dependencies?» — با
yنصب میشود. - update.sh (
hesabix -update): اگر وابستگیها نصب نباشند، همان سؤال پرسیده میشود. - اسکریپت مشترک:
scripts/ensure_voice_chat.sh(apt libav،pip install -e ".[voice]"،/var/lib/hesabix/voice-data، تنظیمات نمونه در.env)
| متغیر | معنی |
|---|---|
INSTALL_VOICE=Y |
نصب بدون پرسش (با --non-interactive) |
INSTALL_VOICE=N |
رد کردن |
مقدار INSTALL_VOICE در ${APP_ROOT}/.deploy_env ذخیره میشود.
دستی
cd hesabixAPI
sudo apt install -y libavformat-dev libavcodec-dev libavutil-dev libswresample-dev libswscale-dev libavdevice-dev pkg-config
pip install -e ".[voice]"
خطای webrtcvad روی آینه PyPI
پکیج قدیمی webrtcvad برای Python 3.12 wheel ندارد و اغلب روی p.mirror.hesabix.ir نیست. پروژه از webrtcvad-wheels استفاده میکند.
| راهحل | دستور |
|---|---|
| wheel آفلاین | bash scripts/populate_voice_wheels_vendor.sh → rsync به hesabixAPI/vendor/voice_wheels/ |
| آپلود به Nexus | scripts/pypi_voice_packages.txt |
| CPU قدیمی (بدون x86-64-v2) | خودکار: numpy<2 از https://pypi.devneeds.ir/simple/ (VOICE_PIP_FALLBACK_INDEX_URL) |
| PyPI مستقیم | export VOICE_PIP_EXTRA_INDEX_URL=https://pypi.org/simple |
دیتابیس
- جدول
ai_voice_interactions(بازخورد + opt-in صوتی) - Migration:
migrations/versions/20251223_002500_create_ai_voice_interactions.py - بازخورد:
POST /api/v1/ai/voice/interactions/{id}/feedback
کلاینت Flutter
lib/services/voice/voice_chat_controller.dart(io / web)lib/services/voice/voice_phase.dart- UI:
ai_chat_dialog.dart+ai_chat_composer.dart
فایلهای وب
web/hesabix_voice_capture.js— پل ضبط (Worklet یا MediaRecorder)web/voice_capture_processor.js— AudioWorklet PCM16 @ 16kHz
TTS فارسی (محلی — Piper)
# env نمونه
VOICE_TTS_ENGINE=piper
VOICE_TTS_PIPER_VOICE_FA=fa_IR-ganji-medium
VOICE_TTS_PIPER_MODELS_DIR=/var/lib/hesabix/voice-data/piper
مدلهای فارسی Piper: fa_IR-ganji-medium, fa_IR-amir-medium, fa_IR-gyro-medium, …
python3 -m piper.download_voices fa_IR-ganji-medium --download-dir /var/lib/hesabix/voice-data/piper
یا در نصب voice: INSTALL_VOICE=Y bash scripts/ensure_voice_chat.sh (دانلود خودکار).
گامهای بعدی (اختیاری)
- A/B کیفیت TTS از روی
rating - بهینهسازی بیشتر WebM streaming (کاهش latency decode)