av 8f7c3a057a удалён вход Telegram, владелец записи стал обязателен в схеме
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка
  входа при старте, секция настроек и зависимость go-telegram-bot-api; из
  конвейера ушла доставка ответа отправителю — исход виден опросом готовности.
  Колонки адресата и значение источника остались в схеме: применённые шаги не
  переписываются
- шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла;
  существующие строки он не проверяет, и это принято сознательно — искать их
  надо запросом до выкладки
- ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ
  распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала
  быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image
  до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
2026-08-15 07:24:35 +03:00
2025-08-14 12:01:29 +03:00

Transcriber Service

Сервис расшифровки аудиозаписей. Вход один — HTTP API.

Возможности

  • Приём аудиофайлов через HTTP API
  • Конвертация в ogg через ffmpeg
  • Распознавание речи через Yandex SpeechKit
  • Отслеживание статуса задач расшифровки
  • Встроенная PocketBase для метаданных, файлов и панели владельца; метрики Prometheus

Технологии

  • Язык: Go 1.26, CGO не нужен
  • Веб-фреймворк: gin-gonic/gin
  • Распознавание: Yandex SpeechKit + Yandex Object Storage (S3)
  • Конвертация: ffmpeg
  • Хранилище, файлы и панель: встроенная PocketBase
  • База данных: SQLite внутри PocketBase (через modernc.org/sqlite, CGO не нужен)
  • Метрики: prometheus/client_golang

Установка и запуск

  1. Клонируйте репозиторий
  2. Установите зависимости:
    go mod tidy
    
  3. Скопируйте образец конфига и заполните его:
    cp config.example.toml config.toml
    
  4. Запустите приложение:
    go run . -c config.toml
    

Сервер запустится на порту из [server] port, по умолчанию 8080. Нужен установленный ffmpeg.

Кого пускают

Приём и опрос закрыты сессией OIDC. Что её выдаёт и чем она предъявляется — docs/security.md, «Что разграничивает доступ»; известные прорехи образца конфига — docs/conventions/config.md.

Деплой

Деплой запускается из pet-project-server:

inv pl -- transcriber

Плейбук сам зовёт task image (контракт роли app_image): образ собирается локально и едет на сервер через docker save/load, реестр не участвует. Локально образ можно собрать и руками — task image даст transcriber:dev.

HTTP API

Семь адресов приложения: POST /api/audio — приём записи, GET /api/status/:id — готовность задачи, GET /auth/login, GET /auth/callback и POST /auth/logout — вход через провайдера (access), GET /metrics — метрики Prometheus с префиксом transcriber_, GET /health — проверка живости. Сверх них тем же портом отдаётся собственная поверхность встроенного хранилища и панель /_/docs/security.md, «Из чего строятся пути и ключи».

Контракт приёма и опроса нормативен и живёт в openspec/specs/intake/spec.md: поля запроса и ответа, коды и условия. Менять его — необратимое действие (CLAUDE.md, «Работа»), и второго описания у него быть не должно.

Состояния задач

Перечень состояний, переходы между ними и число воркеров — docs/database.md, разделы «Коллекции» и «Представление данных»; как сложен конвейер целиком — docs/architecture.md.

Структура проекта

transcriber/
├── main.go                 # Точка входа: конфиг, миграции, сборка зависимостей, запуск
├── internal/
│   ├── entity/             # Модели: задача, файл, результат распознавания
│   ├── contract/           # Интерфейсы адаптеров и репозиториев, типы ошибок
│   ├── config/             # Разбор config.toml
│   ├── metrics/            # Метрики Prometheus
│   ├── service/            # Конвейер расшифровки
│   ├── controller/
│   │   ├── http/           # HTTP-обработчики
│   │   └── worker/         # Фоновые воркеры
│   └── adapter/
│       ├── converter/ffmpeg/    # Конвертация аудио
│       ├── metaviewer/ffmpeg/   # Длительность аудио
│       ├── recognizer/yandex/   # SpeechKit + Object Storage
│       └── repo/pocketbase/     # Репозитории, схема коллекций, правила панели
└── data/                   # Каталог данных: база и файлы записей вместе
    ├── data.db             # База хранилища (создаётся автоматически)
    └── storage/            # Файлы записей в раскладке хранилища

Хранилище

Коллекции хранилища — аудиозапись и её приложения. Поля, ключи, правило времени и идентификаторов, а также механика захвата задачи воркером — docs/database.md. Панель владельца — по адресу /_/ того же порта; пароль от неё задаёт сам владелец по приглашению, которое сервис печатает в журнал при первом запуске.

Разработка

Схему двигают шаги миграций PocketBase на Go — internal/adapter/repo/pocketbase/migrations, файл на шаг. Непринятые шаги накатываются при подъёме хранилища, прежде чем стартуют воркеры и сервер. Применённый шаг не переписывается: изменение — только новым файлом шага.

Проверки перед коммитом — одной командой:

task gate

Что она гоняет, чем краснеет и какой отказ считается объявленным долгом — CLAUDE.md, раздел «Гейт».

S
Description
Telegram bot and API for audio transcribes
Readme
2.6 MiB
Languages
Go 96.6%
Shell 1.4%
TypeScript 1.2%
Dockerfile 0.5%
Vue 0.2%