polza-stt
Транскрибация длинного аудио через Polza.ai — с терминальным интерфейсом, выбором модели по цене и подсчётом того, сколько это стоило.
Файл режется ffmpeg на куски по 5 минут, все куски уходят в API одновременно (asyncio + httpx, без потоков), результат склеивается в один текстовый файл, временные нарезки удаляются.
Неофициальный клиент. Проект не связан с Polza.ai, нужен свой API-ключ.
Возможности
- Параллельно — все куски в сети одновременно, длинная лекция обрабатывается за время одного куска.
- Выбор файла стрелками — список аудио в каталоге с размерами и длительностью, плюс системный диалог (tkinter, с запасными zenity/kdialog) и ручной ввод пути.
- Выбор модели с ценами — таблица STT-моделей из API: рублей за минуту и сколько выйдет именно этот файл.
- Деньги на виду — оценка до запуска, факт после: сумма из
usageAPI, а если провайдер её не вернул — тариф × фактически отправленная длительность. - Живой прогресс — статус каждого куска, счётчик слов, повторы при сбоях, общий прогресс-бар.
- Ошибка куска не рушит прогон — остальной текст сохраняется, упавшие перечисляются, код возврата 2.
Установка
Нужен ffmpeg в PATH (apt install ffmpeg, brew install ffmpeg, winget install Gyan.FFmpeg).
uv tool install polza-stt # или: pipx install polza-stt
Разовый запуск без установки:
uvx polza-stt
Настройка
При первом запуске утилита спросит только API-ключ и сохранит его в одно постоянное место, не зависящее от текущего каталога:
| ОС | Путь |
|---|---|
| Linux | ~/.config/polza-stt/config.env (или $XDG_CONFIG_HOME) |
| macOS | ~/Library/Application Support/polza-stt/config.env |
| Windows | %APPDATA%\polza-stt\config.env |
Права на файл — 600. Посмотреть путь: polza-stt --config-path. Переопределить глобально: переменная POLZA_STT_CONFIG, разово — флаг --config путь. Если в текущем каталоге лежит готовый ./.env, при первом запуске он автоматически переедет в постоянное хранилище.
Формат простой:
BASE_URL=https://polza.ai/api/v2
TOKEN=ваш_ключ
MODEL=ai-sage/gigaam-v3
BASE_URL подставляется сам (https://polza.ai/api/v2) — менять его нужно, только если Polza сменит адрес или вы работаете через свой прокси; тогда просто поправьте строку в файле.
MODEL заполнять не нужно: строка появляется сама и обновляется на ту модель, которой вы транскрибировали в последний раз. В меню выбора эта модель помечена • и стоит под курсором, так что повторный запуск — это просто два Enter.
Те же значения можно передать переменными окружения BASE_URL / TOKEN / MODEL (или POLZA_BASE_URL и т.д.). Перенастроить: polza-stt --reconfigure.
Использование
polza-stt # выбрать файл и модель в интерфейсе
polza-stt lecture.mp3 # файл задан, модель выбрать в UI
polza-stt lecture.mp3 -y # без вопросов, модель из конфига
polza-stt lecture.mp3 -y --model openai/whisper-large-v3-turbo -o out.txt
Клавиши в меню: ↑/↓ (и j/k) — выбор, Enter — подтвердить, цифры — быстрый прыжок, q/Esc — выход.
Аргументы
| Аргумент | Значение |
|---|---|
audio |
путь к файлу; без него — выбор в интерфейсе |
-o, --output |
куда писать текст (по умолчанию <audio>.txt) |
--chunk |
длина куска в секундах (по умолчанию 300) |
--jobs |
ограничение одновременных запросов (0 — авто, не более 16) |
--language |
ISO-639-1 (ru, en, …) или auto — определить самому (по умолчанию) |
--model |
ID модели, пропускает выбор |
--config |
путь к конфигу (синоним --env) |
--config-path |
показать путь к конфигу и выйти |
--dir |
каталог для выбора файла |
--reconfigure |
перезаписать конфиг |
-y, --yes |
без подтверждения и без выбора модели |
Коды возврата: 0 — успех, 1 — ошибка запуска (нет ffmpeg, нет файла, нет конфига), 2 — часть кусков не транскрибировалась.
Как считается стоимость
Цены берутся из GET {base_url}/models — поле stt_per_minute у моделей с type: stt, в рублях. Оценка до запуска = длительность × тариф. После прогона, если API вернул usage.cost_rub, показывается его сумма («по данным API»), иначе считается по тарифу и фактической длительности отправленных кусков. Если /models недоступен, берётся небольшой встроенный список моделей.
Технические детали
- Куски перекодируются в mono MP3 16 кГц / 64 кбит/с — пятиминутный фрагмент весит ~2.5 МБ и после base64 укладывается в лимит тела запроса (~15 МБ).
- Порядок текста сохраняется по индексу куска независимо от порядка ответов.
- Три попытки на кусок с паузами 2 и 4 секунды.
- Временный каталог удаляется в
finally— промежуточные тексты на диск не пишутся вообще. - Одновременно в полёте держится не более 16 запросов: каждый несёт ~3 МБ base64, и без потолка десятичасовой файл (120 кусков) занял бы под гигабайт памяти. Сами тексты крошечные — 10 часов речи это ~0.5 МБ. Потолок меняется флагом
--jobs. - Нарезки на диске: ~29 МБ на час аудио (моно MP3 64 кбит/с), для 10 часов ~290 МБ во временном каталоге на время работы.
Лицензия
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file polza_stt-0.3.0.tar.gz.
File metadata
- Download URL: polza_stt-0.3.0.tar.gz
- Upload date:
- Size: 19.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b013d73f9177cc0d03a8221e5611e296afb9a1e513528a1ff5d9b2a279f566a
|
|
| MD5 |
c81cd9a0b5ab7f5ff5f652085015e7d6
|
|
| BLAKE2b-256 |
6c18ed51855ec7efdbd44cc1cee90a39da5796d31e26897d4abaeb839ff0e4e4
|
File details
Details for the file polza_stt-0.3.0-py3-none-any.whl.
File metadata
- Download URL: polza_stt-0.3.0-py3-none-any.whl
- Upload date:
- Size: 22.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb3bbd2ad229f1fcf8b49a8d870fe5873ccb6d70bf972c32d9b8241a3054af4a
|
|
| MD5 |
0a8c2934a01db3b3d67976f5f79fefd5
|
|
| BLAKE2b-256 |
dfab0f38fa0ac5d3a70c5de9ba62ca0fa9d373a707a4c89ee8659c3a437bc0bb
|