py_faster_whisper · source snapshot · 16.09.2026

py_faster_whisper: от PCM и файлов до текста

Два способа получить текстЖИВОЙ ГОЛОСPCM через NATSWebRTC CoreВыделить фразуVAD → LinTOВернуть текстpending / phrase_id / textЗАПИСЬ В ФАЙЛЕUpload в WebUIjob_id + настройкиASR и diarizationслова + говорящиеСохранить результаттекст / интервалы / Combine

Основной bridge вызывает внешний LinTO. Локально исполняются VAD, обработка аудио, управление заданиями и diarization sidecars.

SOURCE · src/stt_whisper_to_nats.py · src/webui/file_mode.py · src/model_transport.py

py_faster_whisper · source snapshot · 16.09.2026

Снимок кода, а не отчёт о GPU runtime

Evidence scopeПровереноРезультатЧто остаётся неизвестнымSourcemain 21c85b0Deployed commitTests115 tests · OKРеальные модели / качествоDRS / ingressВладельцы определеныReadiness / доступностьBenchmarkRTF / quality_proxyWER / DER без corpus

Дата исследования — 16.09.2026. Старые незакоммиченные документы и презентация сохранены.

VERIFIED / UNKNOWN · tests · stack/stack.drs · src/webui/bench.py

py_faster_whisper · source snapshot · 16.09.2026

Два входа, общая модельная граница

Границы распознаванияЖИВОЙ ПОТОКWebRTC Coreсоседний репозиторийNATS bridge + VADpy_faster_whisperLinTO HTTPвнешнее распознаваниеФАЙЛЫБраузер WebUImultipart / snapshotFile / staged workernormalize + chunksASR + diarizationwords + speaker intervalsВЛАДЕЛЬЦЫ ПОСТАВКИЭтот репозиторийкод / образы / CPU stackwebrtc-komaroffpublic ingress / modesrag-stackGPU backend; вне аудита

WebUI принадлежит этому проекту, публичные paths — соседнему WebRTC stack. H100 backend не включён в source-аудит.

SOURCE · src/webui/server.py · stack/stack.drs · git.giscloud.ru

py_faster_whisper · source snapshot · 16.09.2026

Точка входа выбирает bridge и WebUI

Модули распознаванияstt_whisper_to_nats_main_asyncПотокSttWhisperToNatsServicewire_packetsilero_onnx_vadPhraseStreamStateФайл / WebUIserver / file_modestaged_jobs / benchFileJobStorediarization_syntaxМодели и transportmodel_transportpyannote / sherpaSortformer sidecarHTTP / CONNECT

python -m src.stt_whisper_to_nats. Если оба флага STREAM_BRIDGE_ENABLED и WEBUI_ENABLED выключены, запуск завершается ошибкой.

SOURCE · src/stt_whisper_to_nats.py · src/webui/server.py

py_faster_whisper · source snapshot · 16.09.2026

Поток: накопить речь, затем распознать

Последовательность live ASRCoreBridgeVADLinTOCore UImetadata + PCMпроверка накопленного звукаspeech boundariespending + phrase_idtemp WAV → multiparttext / errorphrase resultend → flush / remove state

VAD отделяет речь от пауз. Это фразовое распознавание: backend получает временный WAV, а не каждый PCM frame.

SOURCE · src/stt_whisper_to_nats.py · src/utils/silero_onnx_vad.py

py_faster_whisper · source snapshot · 16.09.2026

Один stream должен иметь одного владельца

Масштабирование stream stateСЕЙЧАСWildcard subscriptionобычная NATS подпискаPhraseStreamStateлокальная RAM + lockVAD / pending tasksодин процессОПАСНЫЕ УПРОЩЕНИЯДве plain replicasобе обработают потокСлучайная queue groupкадры разойдутсяНужное свойствоaffinity + порядок frames

Горизонтальное масштабирование нельзя свести к replicas: сначала нужны владение потоком, end/idle cleanup и политика потерь.

SOURCE / INFERRED · src/stt_whisper_to_nats.py · docs.nats.io

py_faster_whisper · source snapshot · 16.09.2026

Семафор не ограничивает принятую работу

Накопление live работыДО СЕМАФОРАПолучить сообщениеcreate_taskВыделить фразуновая задача + WAVОжидающая работапамять / temp filesВ СЕМАФОРЕmax_concurrencydefault 1LinTO requestinferencefinallyудалить временный WAV

Измерять надо не только занятые worker slots, но и очередь, возраст фразы и временные байты при замедленном backend.

SOURCE / INFERRED · src/stt_whisper_to_nats.py

py_faster_whisper · source snapshot · 16.09.2026

Файл: 202 означает запуск, не долговечную очередь

Последовательность file jobБраузерWebUIWorkerASR / diarStoremultipart uploadinput + settingsstart_job; один active job202 + job_idnormalize + chunksASR chunks / diarizationwords + intervalscombined / state → UI events

Worker — asyncio task внутри процесса. Новый start_job отменяет предыдущее активное задание этого worker.

SOURCE · src/webui/server.py · src/stt_whisper_to_nats.py

py_faster_whisper · source snapshot · 16.09.2026

ASR и diarization отвечают на разные вопросы

Соединение слов с говорящимиЧТО СКАЗАНОnormalized.wavffmpegASR chunks300 с; overlap 15 сWordstext + timestampsКТО ГОВОРИЛdiarization inputподготовленное аудиоSidecar inferenceвыбранная модельSpeaker intervalsspeaker + start/endСОВМЕЩЕНИЕWords + intervalsобщая шкала времениattribute_wordsвыбор говорящегоSpeaker turnsтекст по репликам

Без word timestamps точная атрибуция слов говорящим не гарантируется. Размеры chunks — defaults, не измеренный оптимум.

SOURCE · src/webui/file_mode.py · src/diarization.py · src/diarization_syntax.py

py_faster_whisper · source snapshot · 16.09.2026

Staged: Combine уже не вызывает модели

Повторное использование staged artifactsНЕЗАВИСИМЫЕ ДОРОГИЕ РЕЗУЛЬТАТЫPrepareinput / normalized.wavTranscribetranscription.jsonWordsword timestampsВЕТКА ГОВОРЯЩИХПодготовленное аудиоdiarization_input.m4aDiarizediarization.jsonSpeaker intervalsstart / end / speakerЛОКАЛЬНОЕ СОЕДИНЕНИЕWords + intervalsсохранённые artifactsCombineattribute_wordscombined.jsonбез нового inference

Перезапуск Transcribe или Diarize инвалидирует combined artifact. Дорогие результаты остаются доступны для следующего Combine.

SOURCE · src/webui/staged_jobs.py · tests

py_faster_whisper · source snapshot · 16.09.2026

Данные переживают разные события

Владение состояниемОбъектХранилищеСрок / ограничениеPCM / VAD stateRAM bridgeДо phrase / end / shutdownLive WAVTemporary fileУдаление в finallyFile jobКаталог + state.jsonCleanup terminal: 30 секундStaged artifactsКаталог jobДо reset / cleanupActive job / leaseRAM worker / lock serviceНе crash-resumable queue

Каталог job не равен долговечной истории. Обычный terminal job очищается; staged хранит результаты для следующих шагов.

SOURCE · src/webui/file_mode.py · src/stt_whisper_to_nats.py · src/webui/staged_jobs.py

py_faster_whisper · source snapshot · 16.09.2026

Общий lock хранит владельца в памяти

Lock lifecycleОБЫЧНЫЙ ЦИКЛAcquireowner / TTLHeartbeatпродлить leaseReleaseосвободить слотГРАНИЦЫЗанятоHTTP 423TTLdefault 7200 с; min 30 сРестарт lock serviceтекущий owner теряется

Lock координирует доступ, но не хранит очередь заданий. Несколько независимых реплик lock service требуют другого общего состояния.

SOURCE / INFERRED · src/webui/job_lock_server.py · src/webui/job_lock.py

py_faster_whisper · source snapshot · 16.09.2026

Direct и CONNECT сохраняют бинарный контракт

Бинарный транспорт моделейDIRECTCallerготовый ClientSessionmodel_http_sessionпереиспользует sessionModel HTTPmultipart bytesCONFIGURED PROXYCallertarget + proxy configProxyConnectorCONNECT + новая sessionModel HTTPте же multipart bytesОШИБКА PROXYCONNECT failureошибка transportЯвный error pathбез direct fallback

Proxy failure не переключает запрос на direct. Оптимизация pooling допустима только с сохранением target и изоляции credentials.

SOURCE · src/model_transport.py · tests/test_model_transport.py

py_faster_whisper · source snapshot · 16.09.2026

Где происходит настоящий HTTP inference

Дерево вызовов file worker_file_http_handler → start_jobserver.py → FileJobWorkerService_process_jobsrc/stt_whisper_to_nats.pyПодготовка аудиоfile_mode.pyffmpeg / normalizechunks + artifactstranscribe_http_json_post_to_lintomodel_http_sessionHTTP multipart → LinTODiarization + Combinesidecar → intervalsattribute_wordsbuild_speaker_turns

Combine — локальная ветка. Повторять модельный вызов для пересчёта отображения результата не требуется.

SOURCE · src/stt_whisper_to_nats.py · src/webui/file_mode.py · src/model_transport.py

py_faster_whisper · source snapshot · 16.09.2026

Три sidecar — совместимая роль, разные реализации

Diarization backendsSidecarРеализацияПроверять отдельноPyannotePipeline + inference lockДоступ / загрузка / deviceSherpa-ONNXONNX модели + lockФормат / зависимостиSortformerChunking + label alignmentOverlap / длинные записиAdapterDiarizationResultTimestamps / speakers / errors

Совместимый HTTP payload не означает одинаковые качество, память и cold-start. Benchmark должен сохранять параметры моделей.

SOURCE · src/pyannote_diarization_server.py · src/sherpa_onnx_diarization_server.py · src/sortformer_diarization_server.py · src/diarization.py

py_faster_whisper · source snapshot · 16.09.2026

Diagnostics — активная проверка

Что проверяет diagnosticsИНФРАСТРУКТУРАHTTP endpointshealth / reachabilityNATSworkflow / historyTransportinvalid ASR packetМОДЕЛЬНЫЕ SMOKELinTOtranscribe requestDiarizationпробное аудиоLLMпробный запрос

Открытие diagnostics может вызвать работу моделей. В этом исследовании production diagnostics не запускалась.

SOURCE; LIVE НЕ ВЫПОЛНЯЛСЯ · src/webui/diagnostics.py · tests

py_faster_whisper · source snapshot · 16.09.2026

Публичные пути — контракт соседнего stack

Три владельца развёртыванияЭТОТ РЕПОЗИТОРИЙCI / imagesdefault branch deployotlp.drs → stack.drsупорядоченная композицияCPU stackproxy / bridge / 3 sidecarsСОСЕДНИЕ РЕПОЗИТОРИИwebrtc-komaroffпубличные WebUI routesrag-stackH100 / model servicesНЕПРОВЕРЕННЫЙ СЛОЙRunning imagedigest / health ?Model readinesscold / warm ?Live behaviorнового smoke нет

/whisper-trasncription содержит существующую опечатку. Изменение URL потребует совместимости ingress и ссылок.

SOURCE · stack/stack.drs · .gitlab-ci.yml · git.giscloud.ru

py_faster_whisper · source snapshot · 16.09.2026

115 тестов проверяют логику, не распознавание на GPU

Проверки и пробелыПроверено локальноЧто это подтверждаетСледующий слойTransport / healthВыбор connector / ошибкиЖивой CONNECTStaged / snapshotsАртефакты / инвалидацияCrash / storage limitsModes / lockUI contracts / lease logicНесколько процессовHelpers / diagnosticsДетерминированная логикаМодельный corpus

Suite завершился OK; mock-ошибка pyannote и aiohttp warnings не были падением реального backend.

TESTED / UNKNOWN · tests/test_model_transport.py · tests · src/webui/diagnostics.py

py_faster_whisper · source snapshot · 16.09.2026

Масштабировать потоки и файлы нужно по-разному

Две модели выполненияLIVE PCMSession ownershipпорядок framesBounded buffersбайты / idle TTLASR capacitydeadline / backpressureFILE JOBSDurable queuejob identityIndependent workerslease / cancellationArtifact storageатомарность / retention

Это направления развития, не реализованные свойства. Сначала измерить очереди, RTF, отмену и поведение при рестарте.

ПРЕДЛОЖЕНИЕ · src/stt_whisper_to_nats.py · src/webui/file_mode.py

py_faster_whisper · source snapshot · 16.09.2026

Сохранять результаты, управлять сроком их жизни

Критерии следующего шагаЧто сохранитьЧто измеритьЧто потребует измененияASR / diar artifactsRTF + WER / DERРазмеченный corpusLocal CombineInference calls = 0Не менять без причиныBinary transportUpload / handshake timePool без смешения targetsJob / stream identityLoss / queue / restartOwnership + durable jobs

Сильная сторона — повторное использование результатов. Главная граница роста — управление заданиями и потоком, а не выбор новой модели.

ОЦЕНКА / ПЛАН ПРОВЕРКИ · src/webui/staged_jobs.py · src/model_transport.py · src/webui/bench.py

1 / 2

Служебные вложения доступны в исходном архиве.