Mamrot: vibe-codowany transkryber i cutter audio

Miałem stertę narracji z nagrań ekranu, które trzeba było pociąć na pojedyncze klipy, po jednym na temat. Każde narzędzie, które znalazłem, albo nie miało GUI, albo oczekiwało ręcznego wpisywania czasu początku i końca. Przewijanie waveformu i zgadywanie granic dla dziesiątek segmentów bardzo szybko przestaje być zabawne. Tak naprawdę chciałem czegoś prostego: przeczytać, co zostało powiedziane, zdecydować, gdzie ciąć, i zostawić narzędziu liczenie timestampów.

Tak powstał Mamrot, bo nawet kiedy ktoś mamrocze, narzędzie nadal próbuje go zrozumieć. Transkrybuje audio Whisprem, daje tekstowy edytor do dzielenia i scalania linii, a potem eksportuje każdy segment jako osobny plik audio.

Workflow w trzech zakładkach

Cały interfejs to tylko trzy zakładki (Transcribe, Editor, Cutter), po jednej na każdy etap pipeline’u.

1. Transcribe

Zakładka Transcribe w Mamrocie pokazująca kolejkę 8 plików, selektory modelu i języka oraz pasek postępu na 34%.

Wrzucasz pliki, wybierasz rozmiar modelu Whisper (od tiny do large-v3), wskazujesz język albo zostawiasz autodetekcję i uruchamiasz proces. Transkrypcja działa w tle, więc możesz wrzucić cały folder do kolejki i odejść od komputera. Wyniki zapisują się jako pliki JSON obok źródłowego audio, więc nie trzeba transkrybować tego samego drugi raz.

Pod spodem działa faster-whisper z timestampami na poziomie słów. Jeśli jest dostępne GPU, używa CUDA; w przeciwnym razie CPU z kwantyzacją int8. Filtrowanie VAD jest domyślnie włączone, żeby pomijać ciszę i poprawić dokładność.

Obsługiwane wejście: MP3, WAV, FLAC, OGG, M4A, AAC, WMA oraz formaty wideo (MP4, MKV, AVI, MOV, WebM), bo FFmpeg automatycznie wyciąga ścieżkę audio.

2. Editor

Zakładka Editor w Mamrocie z wczytaną transkrypcją: 34 segmenty z timestampami, edycja tekstu inline, pasek wyszukiwania i kontrolki kolejki.

Tu dzieje się właściwa praca. Transkrypcja ładuje się jako tabela segmentów z czasami. Możesz:

Dzielenie i scalanie to główna funkcja. Ponieważ Whisper zwraca timestampy dla słów, aplikacja zawsze wie, gdzie każde słowo się zaczyna i kończy. Nie trzeba zgadywać ani wpisywać czasów ręcznie. Czytasz tekst, decydujesz: „to zdanie powinno być osobnym klipem”, naciskasz Ctrl+Enter, a granice są już tam, gdzie trzeba.

Granice nie zawsze są jednak idealne. Timestampy słów z Whispera potrafią lekko się rozjechać, ucinając sylabę albo zostawiając kawałek ciszy. Dlatego każdy segment ma własne kontrolki offsetu, którymi można przesunąć początek albo koniec o kilkaset milisekund przed eksportem.

3. Cutter

Zakładka Cutter w Mamrocie pokazująca 3 segmenty w kolejce wraz z zakresami czasowymi, czasem trwania, etykietami oraz formatem ustawionym na MP3.

Kiedy segmenty są już w kolejce, przechodzisz do zakładki Cutter. Wybierasz format wyjściowy i katalog, a potem klikasz „Cut all”. Każdy segment trafia do osobnego pliku audio.

Formaty wyjściowe: WAV, FLAC, MP3, OGG, AAC (M4A), Opus.

Cutter dodaje niewielki padding wokół każdego cięcia (60 ms przed, 150 ms po), żeby skompensować niedokładność granic słów z Whispera i nie ucinać sylab. W razie potrzeby nadal można dopracować offsety per segment.

Nazwy plików są generowane automatycznie z tekstu transkrypcji, więc dostajesz pliki w stylu if-i-were-to-right-mouse-button.mp3, a nie clip_001.mp3.

Po co vibe-code?

Mogłem to oskryptować: sparsować SRT, przejść pętlą po timestampach, wywołać FFmpeg. Tylko że cały sens polegał na tym, że nie chciałem myśleć timestampami. Chciałem czytać tekst, podejmować decyzje edytorskie wizualnie i pozwolić maszynie policzyć czas.

Vibe-coding z agentem AI sprawił, że dało się to zrobić jako weekendowy projekt. UI jest w PySide6 (Qt6), z własnym ciemnym motywem. Silnik transkrypcji, logika edytora, integracja z FFmpeg: każdy element osobno jest prosty, ale poskładanie tego w dopracowaną desktopową aplikację ze skrótami klawiszowymi, batch processingiem i zapamiętywaniem stanu zajęłoby mi samemu tydzień boilerplate’u.

Architektura w skrócie

Wypróbuj

Pełny kod źródłowy jest na GitHubie: Mamrot.

pip install . i uruchom mamrot. Wymaga Pythona 3.10+ i FFmpeg (na Windowsie aplikacja zaproponuje pobranie FFmpeg automatycznie).


Słuchanie całego audio tylko po to, żeby znaleźć miejsca cięć, to strata czasu. Najpierw robię transkrypcję, potem czytam i dzielę tam, gdzie ma to sens. Liczenie milisekund to zadanie maszyny; moje to tylko zdecydować, gdzie kończy się jeden klip, a zaczyna następny.