Инструмент erm автоматически вырезает из аудиозаписей слова-паразиты вроде um, uh и er. Его написал разработчик Дуг Калабризи — друзья, которые записывают подкасты, жаловались, что чистить такие файлы вручную просто мучительно.
Наивный подход не работает. Казалось бы, берёшь Whisper (распознавалка речи от OpenAI), получаешь таймкоды слов, находишь um и режешь отрезки через ffmpeg. Но результат звучит хуже оригинала по трём причинам. Во-первых, Whisper по умолчанию сам выбрасывает паразиты из расшифровки — искать нечего. Во-вторых, разрез посередине волны даёт щелчок. В-третьих, фоновый шум комнаты до и после вырезки не совпадает, и слышен едва заметный перепад.
erm использует faster-whisper (быструю версию той же модели). По умолчанию стоит medium.en, но автор советует large-v3 — он заметно лучше ловит паразитов. Детекция работает в четыре захода. Основной — по расшифровке Whisper, которому явно говорят не вычищать текст. Потом три дополнительных прохода уже смотрят прямо на аудио: ищут паразиты внутри длинных пауз (которые Whisper просто молча выкинул), находят паразитов, приклеенных к соседним словам, и проверяют слишком длинные слова — их хвост может оказаться затянутым uhhhhh.
Каждую точку разреза сдвигают до 60 миллисекунд в ближайший участок с минимальной громкостью, а потом точно на ноль волны. Так исчезают щелчки. Саму склейку делают через crossfade — перекрытие с плавным затуханием. Длина перехода не фиксированная, как обычно советуют (80 мс), а зависит от размера вырезанного куска: короткий uh — короткий переход, долгий гул — длиннее. Ещё erm находит тихий отрезок исходной записи (комнату без речи) и прокладывает его петлёй на фоне всего выхода — перепады шума маскируются одинаковым фоном.
Обработка шумодава вынесена в отдельный режим. Лучший вариант hybrid: детекция ищет паразиты на чистом оригинале, а режется уже деноизированная копия. Есть команда validate, которая проверяет, что выход короче входа на правильную величину, а новая расшифровка не содержит паразитов. erm не трогает слова вроде like, you know, I mean — это не шум, а часть смысла. Повторы и ложные начала тоже оставляет.
Запустить можно одной командой: uvx erm input.wav. Нужны только ffmpeg и ffprobe. Весь код на GitHub. Аудио никуда не уходит, всё локально.