Transcribe service
Видео или среща на входа, протокол с търсене на изхода и цена за всяко пускане
- Роля
- Сам, ръководя агенти
- Статус
- В процес
- Код
- Частно хранилище
- Технологии
- PythonFastAPIReactTypeScriptffmpegSQLiteOpenRouter

В числа
4
резултата от едно пускане: транскрипция, хронология на екрана, снимки на екрана и един протокол от срещата
~90мин
най-дългите записи, върху които е доработван до надеждност, на три езика, включително български
1
място в кода, през което минава всяка заявка към модел, с ротация на ключовете от общ набор
2
режима на таксуване, личен или фирмен, обявявани за всяка задача и без стойност по подразбиране
Проблемът
Решенията се вземат на срещи, демонстрации и записи на екрана, а транскрипцията сама по себе си губи какво се е виждало на екрана. Запис, в който не мога да търся, няма да го използвам. Трябваше ми протокол, който мога да проверя: кой какво е казал, кога и какво е било показано в същия момент.
Подходът
Идеята е един процес, който превръща всяко видео или среща в един протокол. Звукът става транскрипция с разпознаване на говорещите. Видеото се реже на сегменти, всеки сегмент отива при модел, който съставя хронология на случилото се на екрана, а снимките на важните моменти се правят, чистят от повторения и се описват с помощта на транскрипцията около тях. Накрая обединяване слива всичко в протокол от срещата. Първо го направих като skill, който Claude и Codex можеха да пускат, и го доработвах върху записи до около 90 минути на три езика, включително български. После му направих обвивка, локална услуга с регистър на задачите, и запазих командния ред.

Как работи
Паралелни етапи, едно обединяване
Транскрипцията и приемането на видеото тръгват заедно. Всеки видеоклип отива към модела веднага щом ffmpeg го отреже, а снимките на екрана за един сегмент се избират веднага щом са готови събитията му. Едно обединяване в края, което чака всички етапи и може да се пусне пак, сглобява протокола.
Снимки на екрана само за важните моменти
Снимките се избират от събитията в хронологията, правят се и се сравняват с общ за всички сегменти набор от хешове, така че повтарящите се кадри се свиват до една снимка. Настройките за разстояние между снимките държат цената на дългия запис ниска.
Кой говори
Файл със списък на участниците казва кой говори и на какви езици. Папка с по една снимка на човек позволява на процеса да назовава хората пред камерата. Видеото от камера и записите на екрана се обработват различно.
Едно място за заявките и хранилище без ключове
Всички заявки към модели минават през една функция към OpenRouter, която събира API ключовете в общ набор, сменя ключа при отговори 402 и 429 и изважда ключ от употреба при 401 и 403. Тест прочита изходния код и потвърждава, че в хранилището не стои нито един ключ.
Сметка за всяко пускане
Всяка задача трябва да обяви режим на таксуване, личен или фирмен, и няма стойност по подразбиране. Режимът определя кои ключове може да ползва пускането и надделява над файла с настройки на средата, а регистърът записва колко е струвало всяко пускане.
Пропуските се запълват
Неуспелите прозорци на транскрипцията, видеосегменти и снимки се опитват отново в края на етапа си. Повторният опит използва наново добрите части и прави отново само неуспелите, така че една неуспешна заявка не налага повторна обработка на целия запис.

Какво избрах и какво отпадна
Избрах
Режим на таксуване, обявен за всяка задача
Пред
Стойност по подразбиране от файла с настройки на средата
Режимът се вижда на задачата и случайна настройка на средата не може да го замени.
Резултатът
Ползвам го всеки ден. Услугата има лиценз, ръководство за участие и набор от тестове, който покрива паралелните етапи, средата за таксуване и проверката, че в кода няма ключове. Дефект при уеднаквяването на говорещите, довел до загуба на 776 етикета в две пускания, беше още отворен във версията като skill, от която израсна услугата. Записите, върху които е проверен, са на клиенти и екипи, затова не показвам нито един.
Какво следва
Да го пусна върху нов набор от записи и да потвърдя, че дефектът с говорещите е изчезнал.