-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Тут я собрал несколько своих размышлизмов, которые могут быть кому-то полезны.
Яндекс неправильно опознает язык ролика и из-за этого отказывается делать "живые голоса".
К примеру, если звук в ролике сильно зашумлен, или же персонажи говорят с сильным акцентом, то английский язык может быть распознан как "немецкий", хотя перевод будет корректен (иногда).
Решение простое: перед началом ролика подклейте к нему 5 минут выступлений из британского парламента, чтобы нейронка точно поняла, что там именно английский язык и никакой другой. Используйте в качестве донора чистую поставленную речь.
В принципе, в моих тестах было достаточно даже 2 минуты чистой речи, причем не важно, приклеено оно к началу или концу ролика, но думаю 5 минут речи будет достаточно, чтобы точно не было никаких ошибок.
Одной минуты (в моих тестах) было недостаточно, но возможно длительность определяется процентным соотношением к длине ролика или как-то иначе, так что не знаю, считать ли это 100% правилом.
Контроль тональности речи или пола говорящего. Возможно ли?
Напрямую Яндекс не дает нам вообще никаких инструментов, но это не значит, что ничего сделать нельзя.
К примеру, чтобы контролировать тональность или даже пол говорящего, достаточно изменить его pitch, такая функция есть почти в каждом редакторе аудио, просто поищите что-то вроде pitch shift.
Всеми любимый ffmpeg тоже имеет эту функцию, но требует сборки с rubberband. Если же пересобирать лень, то можно устроить лайфхак с asetrate+atempo, не очень хорошо, зато работает везде.
Понижение частоты, более грубые голоса, мужские голоса становятся женскими:
ffmpeg -i input.wav -af "aresample=48000,asetrate=48000*.7,atempo=1/.7,aresample=48000" -y output.wav
Повышение частоты, более женственные и даже детские голоса, переходящие в мультяшные:
ffmpeg -i input.wav -af "aresample=48000,asetrate=48000*1.2,atempo=1/1.2,aresample=48000" -y output.wav
После конвертации, мы получим изменение тона, которое будет звучать не лучшим образом. Но вот после перевода нейросетью, голоса станут более человечными и приятными.
Ускорение/замедление звука
Если нужно перевести какой-то длинный подкаст, то зачастую его можно ускорить в несколько раз. Такое и человеку будет воспринимать проще, и нейронке работы меньше.
Опять нам поможет ffmpeg и его фильтр atempo. К сожалению, фильтр принимает значения до 2х, но опять же, можно поставить несколько фильтров подряд, чтобы в сумме они давали любое ускорение, к примеру, в 3 раза:
ffmpeg -i input.wav -af "atempo=2,atempo=1.5" -y output.wav
Если же для человека такое неприемлемо, то после перевода скорость можно обратно понизить.
Нейронка понимает ускорение до 3.5-4х раз
Как перевести множество мелких файлов, например, банк речи из игры?
Очевидно, надо склеить эти звуки в один большой файл, длительностью 1-2 часа, чтобы там содержалась вся речь.
Если речь разобрана по персонажам, то лучше склеить каждый банк в отдельный файл, чтобы голоса в банках не перемешивались.
Опять же, желательно речь одного персонажа держать в одном файле, чтобы его голос после перевода не менялся от файла к файлу.
Чтобы фразы не склеивались, между фразами можно добавить секунд 5-10 тишины, или же, еще лучше, фразу-отбивку.
Фраза-отбивка должна содержать одно или несколько законченных предложений, чтобы нейросетка захотела поставить между ними точку или вопросительных знак.
Например, "Дождь уже закончился? Да, уже закончился!".
Чтобы отбить желание нейросети склеивать и это, можно задать разный pitch, чтобы оно идентифицировало это как 2х разных голоса от 2х разных дикторов.
В принципе, чтобы оно много не занимало времени, то можно этот разделитель ускорить. Все равно этот фрагмент нужен для управления нейросетью, а не для результата, а сама нейросетка и так поймет.
В своих экспериментах я ускорял речь до 3.5 раз, нейросетка даже такое способна воспринять, а дальше уже начинает галлюцинировать.
Если делаете отбивку, к примеру, на японском, то проследите, чтобы предложение перевелось именно как вопросительное, а не утвердительное, чтобы нейросеть точно поставила знак препинания и разделила фразы.
Я экспериментировал с 2-3 предложениями и музыкой на фоне. Не знаю что лучше, но точно знаю, что музыка как-то учитывается при укладке текста.
В переведенном тексте можно все равно увидеть, что порой оно склеивает отбивку с основным текстом, но это уже можно легко вычислить по таймкодам: если на месте отбивки нету ожидаемого текста, значит тут произошла склейка и надо это как-то чинить.
И не забывайте подрезать тишину в речевых банках, у нас есть фильтр silenceremove!
Как точно склеить файлы в ffmpeg?
Встроенная клеелка concat достаточно интересная, но может делать разные артефакты на границах склейки, потому она нам не подходит. Происходит это из-за особенностей кодеков и контейнеров, в которые упакован звук.
Но мы можем просто из исходных файлов достать голые семплы звука, на которые не будут налагаться особенности кодеков или контейнеров:
ffmpeg -i source.ogg -ar 48000 -ac 1 -f s16le - > out.pcm
Обратите внимание, что out.pcm может быть немного короче или длиннее, чем оригинальный файл. Это голые семплы, почти как wav, но без заголовка файла.
Если нам надо добавить в файл тишины, то мы можем просто добавить в pcm файл нулей. 1 секунда - это 48000 семплов, помноженные на количество каналов, или 96000 байт нулей для моно-звука (для стерео будет 192000 байт).
Например,
dd if=/dev/zero bs=2 count=48000 of=silence.pcm # делаем файл с тишиной, 1 секунда, 48килогерц, моно
cat out.pcm silence.pcm > sound_and_silence.pcm # просто склеиваем файл
Затем, мы можем собрать файл обратно:
ffmpeg -ar 48000 -ac 1 -f s16le -i sound_and_silcence.pcm -y result.ogg
В принципе, любое редактирование звука лучше делать с несжатыми материалами, но когда избавляешься даже от контейнера wav, то у тебя полный контроль над тем, что происходит внутри.