Как приложение понимает, кто говорит? Внутри автоматической озвучки по ролям
Чтобы дать каждому персонажу книги свой голос, сначала нужно ответить на вопрос, который звучит пустяково, но им не является: кто произносит эту реплику? Живой читатель отвечает на него, не замечая. Программу приходится учить, и именно это обучение здесь самое интересное. На нём и держится автоматическая озвучка по ролям. Поэтому стоит разобрать его подробнее.
Лёгкие случаи, и почему они усыпляют
Часть диалога прямо говорит, кто произносит реплику.
Холмс произнёс: «Вы, я вижу, побывали в Афганистане.»
Пометка тут же: глагол речи и имя рядом с цитатой. Простая программа найдёт кавычки, поищет поблизости «сказал» плюс имя собственное и в большинстве случаев угадает верно. Если бы каждая строка выглядела так, задачу решили бы за один вечер.
Но они выглядят иначе.
Где начинается трудное
Настоящая проза полна диалогов, которые прячут своего говорящего, и каждый способ спрятать представляет отдельную задачу.
Реплики без пометки. Как только разговор пошёл, авторы перестают помечать реплики: от читателя ждут, что он сам ведёт счёт.
«Вы побывали в Афганистане.» «Как, чёрт возьми, вы это узнали?» «Неважно. Вопрос в высшей степени важный.»
Три строки, ни одного имени. Чтобы их назначить, нужно отслеживать, что говорят двое и что они чередуются, и вести эту нить, пока что-нибудь её не оборвёт. Ошибись в счёте один раз, и каждая следующая строка перекинется не на того.
Пометки-местоимения. «Сказал он» и «спросила она» приписывают реплику человеку, которого предложение не называет. Нужно знать, кто такой «он» прямо сейчас, а это значит отслеживать, кого упомянули последним и кто вообще в комнате.
Действия вместо пометок. Часто глагола речи нет вовсе, только действие рядом с репликой.
Холмс откинулся назад и сложил пальцы домиком. «Это задача на три трубки.»
Здесь нет ни одного глагола речи. Человек делает вывод, что говорит Холмс, потому что действует именно он. Программе приходится делать тот же скачок.
Назвать состав вообще. Прежде чем приписать реплику Холмсу, нужно знать, что Холмс существует, и что «Шерлок», «мистер Холмс», «Холмс» и, в повествовании его друга, «он» могут быть одним человеком. Собрать всё это из текста, без заранее готового состава, само по себе отдельный шаг.
А ещё бывает по-настоящему неоднозначное. Повествование от первого лица, письма, процитированные внутри истории, толпа, где пятеро говорят разом, реплика, которую автор нарочно оставил неясной. Иногда честный ответ в том, что и внимательный живой читатель бы запнулся.
Как развивались подходы
Ранние попытки строились на правилах: ищи реплики, ищи рядом «сказал X», в крайнем случае отступай к чередованию говорящих. Работало быстро и ломалось ровно там, где проза становится интересной. Потом пришли статистические модели, обученные на размеченных книгах. С контекстом они справлялись лучше, но всё ещё опирались на поверхностные шаблоны.
Недавно изменилось вот что: большие языковые модели читают отрывок больше похоже на человека. Получив кусок книги, способная модель удерживает сцену в уме: кто присутствует, кто говорил последним, чьё действие стоит рядом с репликой. Всё это она использует, чтобы приписать строку, включая строки без пометок. Это не волшебство и не идеал, но это большой шаг дальше сопоставления «сказал» с ближайшим именем.
Что BookNPC с этим делает
BookNPC прогоняет этот разбор по книге страница за страницей. Он вычисляет состав, разрешает псевдонимы и приписывает каждую строку, включая цепочки без пометок. Потом назначает свой отдельный голос рассказчику и каждому персонажу. Это тот самый разовый шаг, стоящий за озвучкой книги по ролям, и именно поэтому у неё есть небольшая стоимость: работа идёт при разборе книги, а не при воспроизведении.
Поскольку ни одна система атрибуции не безупречна на трудной прозе, приложение оставляет управление тебе. Во время воспроизведения текущая реплика подсвечена цветом своего говорящего, а его имя указано под страницей: видно, кого приложение считает говорящим. Весь список ролей прямо тут, и можно заменить любой голос. Если оно ошиблось на хитром обмене репликами, промах виден и исправим, а не скрыт где-то внутри.
Почему это трудная часть, и ценная
Записать голоса несложно: это лёгкая половина аудиокниги с озвучкой по ролям. Дорогая, требующая мастерства половина всегда была в режиссуре: решить, кто произносит каждую реплику и как. Автоматическая атрибуция говорящего и есть эта режиссура, только выполненная программой. И она уже достаточно хороша, чтобы собрать труппу из любой книги, что ты принёс, а не из горстки, которую студия выбрала для записи.
Вот механика под функцией, которая снаружи звучит просто как «у каждого персонажа свой голос». Хочешь увидеть, как это работает: озвучь по ролям книгу с плотными диалогами в BookNPC и смотри, как по ходу чтения появляются имена говорящих. Гид «Озвучка по ролям против одного рассказчика» разбирает, что это меняет в самом прослушивании.