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
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
Tu dzieje się właściwa praca. Transkrypcja ładuje się jako tabela segmentów z czasami. Możesz:
- Kliknąć dowolną linię, żeby edytować tekst inline.
- Nacisnąć Ctrl+Enter, żeby podzielić segment w miejscu kursora. Aplikacja dopasowuje cięcie do najbliższej granicy słowa i przelicza timestampy.
- Nacisnąć Ctrl+Delete albo Ctrl+Backspace, żeby scalić segment z tym nad nim.
- Wyszukiwać w całej transkrypcji i zaznaczyć wszystkie dopasowania naraz.
- Dodać segmenty do kolejki eksportu, zaznaczając je checkboxami.
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
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
- GUI: PySide6 (Qt6), własny ciemny motyw z pomarańczowymi akcentami
- Transkrypcja: faster-whisper z timestampami na poziomie słów
- Przetwarzanie audio: FFmpeg (automatycznie pobierany na Windowsie)
- Eksport transkrypcji: SRT, VTT, CSV, JSON (z metadanymi)
- Wątki: workery w tle do transkrypcji i cięcia, żeby UI pozostawało responsywne
- Persistencja: ostatnie transkrypcje, stan okna i ustawienia cuttera zapisane w
~/.mamrot/
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.