Skip to content

Трюки и лайфхаки (не является проблемой) #12

@LudmilaPetrovna

Description

@LudmilaPetrovna

Тут я собрал несколько своих размышлизмов, которые могут быть кому-то полезны.

Яндекс неправильно опознает язык ролика и из-за этого отказывается делать "живые голоса".

К примеру, если звук в ролике сильно зашумлен, или же персонажи говорят с сильным акцентом, то английский язык может быть распознан как "немецкий", хотя перевод будет корректен (иногда).
Решение простое: перед началом ролика подклейте к нему 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, то у тебя полный контроль над тем, что происходит внутри.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions