--- title: Speaker Diarization Service emoji: "πŸŽ™οΈ" colorFrom: blue colorTo: indigo sdk: docker python_version: "3.11" app_file: app.py pinned: false --- # Speaker Diarization Service БСрвис для Π΄ΠΈΠ°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°ΡƒΠ΄ΠΈΠΎ (опрСдСлСния "ΠΊΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΊΠΎΠ³Π΄Π°") с использованиСм pyannote.audio 4.x. ## ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ - **Community вСрсия**: Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ локально Π±Π΅Π· API ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² - **БСсплатно**: НС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ подписки pyannoteAI - **МодСль**: `pyannote/speaker-diarization-community-1` ## Hugging Face Space (Docker) - Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ `SDK`: `Docker` - БСрвис ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ `PORT` ΠΈΠ· окруТСния (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `7860`) - **HF_TOKEN Π½Π΅ трСбуСтся** для community ΠΌΠΎΠ΄Π΅Π»ΠΈ ### Быстрый Ρ‡Π΅ΠΊ-лист дСплоя - Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Space с `SDK = Docker`. - Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ `services/speaker-embeddings` Π² ΠΊΠΎΡ€Π΅Π½ΡŒ Space. - Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Space собрался Π±Π΅Π· ошибок (статус `Running`). - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅ сСрвиса: - `GET /health` Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ `{"status":"healthy", ...}`. - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ основной endpoint: - `POST /api/diarize` с `multipart/form-data` (`file` + ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ `num_speakers`, `min_speakers`, `max_speakers`). ## Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ запуск ### Docker Compose ```bash # Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ .env.example Π² .env (HF_TOKEN Π½Π΅ трСбуСтся для community) cp .env.example .env # Запуск docker-compose up -d # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° curl http://localhost:7860/health ``` ### ΠŸΡ€ΡΠΌΠΎΠΉ запуск ```bash # УстановитС зависимости pip install -r requirements.txt # Запуск (HF_TOKEN Π½Π΅ трСбуСтся) export PORT=7860 python app.py ``` ## Endpoints ### `POST /api/diarize` Диаризация Π°ΡƒΠ΄ΠΈΠΎ Ρ„Π°ΠΉΠ»Π° - ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ "ΠΊΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΊΠΎΠ³Π΄Π°". **ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:** - `file`: Π°ΡƒΠ΄ΠΈΠΎ Ρ„Π°ΠΉΠ» (multipart/form-data, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ) - `num_speakers` (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ количСство спикСров (int) - `min_speakers` (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): минимальноС количСство спикСров (int) - `max_speakers` (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): максимальноС количСство спикСров (int) **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°:** ```json { "success": true, "segments": [ {"start": 0.0, "end": 3.5, "speaker": "SPEAKER_00"}, {"start": 3.7, "end": 7.2, "speaker": "SPEAKER_01"} ], "num_speakers": 2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "total_speech_duration": 10.7, "audio_duration": 12.0, "processing_stats": { "diarization_time": 2.34, "extraction_time": 0.12, "total_time": 2.46, "real_time_factor": 0.21 } } ``` ## Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния БСрвис прСдоставляСт Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх этапов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: ### Π£Ρ€ΠΎΠ²Π½ΠΈ логирования 1. **Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°ΡƒΠ΄ΠΈΠΎ**: врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°ΡƒΠ΄ΠΈΠΎ Ρ„Π°ΠΉΠ»Π° 2. **Диаризация**: врСмя выполнСния основной ΠΌΠΎΠ΄Π΅Π»ΠΈ pyannote 3. **Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ сСгмСнтов**: врСмя парсинга Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² 4. **ΠžΠ±Ρ‰ΠΈΠΉ запрос**: ΠΏΠΎΠ»Π½ΠΎΠ΅ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ HTTP запроса ### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π»ΠΎΠ³ΠΎΠ² ``` 2025-04-08 12:34:56 - speaker-embeddings - INFO - Audio loaded and preprocessed in 0.15s (duration: 30.45s, sample_rate: 16000Hz) 2025-04-08 12:34:56 - speaker-embeddings - INFO - Starting diarization: duration=30.45s, params={'num_speakers': 2} 2025-04-08 12:34:58 - speaker-embeddings - INFO - Diarization processing completed in 2.34s 2025-04-08 12:34:58 - speaker-embeddings - INFO - Segment extraction completed in 0.12s 2025-04-08 12:34:58 - speaker-embeddings - INFO - Diarization completed: 5 segments, 2 speakers, total_speech=28.90s, processing_time=2.34s, extraction_time=0.12s, total_time=2.46s 2025-04-08 12:34:58 - speaker-embeddings - INFO - Total request completed in 2.73s (audio: 30.45s, real_time_factor: 0.09x) ``` ### ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ - **Real-time factor**: ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π°ΡƒΠ΄ΠΈΠΎ (мСньшС 1.0 = быстрСС Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) - **Processing stats** Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ API содСрТит Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π·Π±ΠΈΠ²ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ - ΠŸΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Ρ‚Π°ΠΊΠΆΠ΅ логируСтся врСмя Π΄ΠΎ сбоя ### `GET /health` ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности сСрвиса. **ΠžΡ‚Π²Π΅Ρ‚ для community ΠΌΠΎΠ΄Π΅Π»ΠΈ:** ```json { "status": "healthy", "pyannote_available": true, "requires_hf_token": false, "model": "pyannote/speaker-diarization-community-1" } ``` ### `GET /api/diagnostics` ДиагностичСская информация ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ### `GET /` Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ сСрвисС ΠΈ доступных endpoints. ## Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π’ `giga-am` установитС URL сСрвиса Π΄ΠΈΠ°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ: ```bash SPEAKER_DIARIZATION_URL=http://speaker-embeddings:7860 # ΠΈΠ»ΠΈ для Hugging Face Space: SPEAKER_DIARIZATION_URL=https://.hf.space ``` ΠŸΡ€ΠΈ нСдоступности сСрвиса `giga-am` ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ fallback Π΄ΠΈΠ°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. ## ИспользованиС Π½Π΅-community ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ pyannote (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `pyannote/speaker-diarization-3.1`), установитС `HF_TOKEN`: ```bash export HF_TOKEN=your_token_here export PYANNOTE_DIARIZATION_MODEL=pyannote/speaker-diarization-3.1 ``` ## ВрСбования - Python 3.11+ - pyannote.audio >= 4.0.0 (для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ community ΠΌΠΎΠ΄Π΅Π»ΠΈ) - PyTorch (CPU вСрсия достаточна) - 2GB+ RAM для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ## ЛицСнзия Community модСль распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ коммСрчСскоС использованиС Π±Π΅Π· нСобходимости API ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. ## Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ ΠΈ исслСдования - [pyannote.audio 4.x](https://github.com/pyannote/pyannote-audio) - Speaker diarization toolkit - [PyannoteAI Benchmarks](https://arxiv.org/html/2509.26177v1) - SOTA: 11.2% DER