Запись

Голос, который прочитал целую книгу: звуковой спутник третьей статьи

Синтезированный голос прочитал роман целиком — 16 глав, 1 час 58 минут, медиана 2,15 % ошибок по буквам на главу. Ломался при этом не голос, а всё, что вокруг него: склейка предложений, обрезка вдохов, одна буква. Здесь это можно услышать — до и после.

◆ TTS◆ аудио

Третья статья серии вышла на ana-yurt.com, и она про голос — про синтез речи, когда компьютер читает текст вслух. Синтезированный голос прочитал целую книгу: роман Шамиля Алядина «Merdiven», шестнадцать глав, 1 час 58 минут звучания. Эта страница — звуковой спутник статьи: здесь можно послушать то, о чём там рассказано словами.

Почему книга, а не несколько удачных фраз? Четырнадцать проверочных фраз ничего не говорят о том, как голос ведёт себя десять минут подряд: не уплывает ли тембр к концу главы, что машина делает с диалогами, с именами, с репликами в одно-два слова, как она дышит. В отрывке на пятнадцать секунд этого не слышно. В книге слышно всё.

Вердикт получился неожиданным. Голос держался: тембр от первой минуты до последней почти не менялся, темп был ровным. Ломалось не в самой модели, а в подготовке текста и звука вокруг неё — в том, как склеиваются короткие предложения, как обрезаются вдохи, как одна буква переписывается в другую. Эту часть я писал сам, и это была хорошая новость: её можно исправить, не переобучая модель. Ниже эти места можно послушать до починки и после.

Все записи на этой странице — синтез, живого чтеца здесь нет. «Merdiven» читает голос Sevil; вторую книгу и пример с образцом голоса — мой собственный.

Книга целиком

Начало первой главы «Merdiven» можно послушать в спутнике первой статьи. Здесь — десятая, и почти вся она держится на диалоге: короткие реплики, вопросы, восклицания, смена говорящего.

«Merdiven», глава X: диалог

Голос Sevil, 78 секунд подряд из десятой главы. Здесь же слышно то, что пока не решено: тире перед репликой модель видит, но смену говорящего читает как новое предложение, а не как новый голос.

Роман целиком лежит в библиотеке ana-yurt.com, в читалке, которая подсвечивает слово, звучащее в эту секунду: ana-yurt.com/kutuphane/3444/read.

Каждую главу я проверял отдельно: читал синтез обратно нашей распознавалкой и считал, сколько букв разошлось с текстом. Одно среднее число на всю книгу было бы неправильной цифрой — одна неудачная реплика портит среднее, ничего не говоря о самом чтении. По главам картина ровная: медиана 2,15 %, лучшая глава 1,5 %, худшая 2,7 %, и ни к концу книги, ни на длинных главах качество не плывёт.

Столбчатая диаграмма: ошибки по буквам в каждой из шестнадцати глав «Merdiven». Почти все главы — около 2 %, медиана 2,15 %; у второй и четвёртой глав заштрихованные надстройки до 4,4 % и 8,3 %.
Штриховка — то, что добавили сбои проверки на коротких репликах, а не само чтение. Почти вся она — одна и та же реплика «– dep tüşündi.»: на ней распознавалка зациклилась и в четвёртой главе, и во второй.

Что ломалось — и как это звучит

Склейка коротких предложений

Поначалу я склеивал короткие предложения с соседними: модель училась на записях не короче трёх секунд, и реплику в два слова казалось безопаснее не давать ей отдельно. Проверять это допущение я не стал — а на склеенных кусках модель начала выбрасывать целые предложения. Склеенные куски занимали четверть текста главы, а ошибок давали 43 %.

Склеено в один запрос

Просили прочитать «Men yañılğanım. O, oca degil eken.» — «Я ошибся. Он, оказывается, не учитель». Прозвучало только «O, oca degil eken.»

Каждое предложение отдельно

Те же два предложения — два отдельных запроса к модели, между ними 0,3 секунды, как в главе.

Тогда я наконец проверил само допущение и прочитал главу без склейки. Короткие предложения действительно выходят хуже — ошибок в них примерно в два с половиной раза больше, хотя в абсолютных числах это около двух процентных пунктов. Но этот штраф меньше, чем цена склейки, которая теряла целые куски фраз. Склейку я выключил.

Столбчатая диаграмма: ошибки по буквам в первой главе по длине предложения. До 42 букв — 3,3–3,5 %, 43–69 букв — 2,1 %, от 70 букв и длиннее — 1,3–1,6 %.
Первая глава, прочитанная без склейки. Раньше к соседям приклеивалось всё, что короче 43 букв, а ошибок становится меньше примерно до семидесяти.

Обрезка, которая ела первое слово

Синтез иногда начинает фразу со вдоха, как живой диктор, и я написал обрезку: всё, что звучит до первого звонкого звука, считается вдохом и срезается. Но первое слово часто начинается с глухого согласного, и в 111 предложениях из 147 обрезка заходила внутрь первого слова. Новая обрезка смотрит не на звонкость, а на громкость: согласный звук тихий, но всё же намного громче паузы перед ним. Обе записи ниже — одна и та же озвучка; разница только в том, где отрезано начало.

Старая обрезка

«Çañ qaqıldı. O, istemey-istemey vagonına taba adımladı.» Срез пришёлся на начало «Çañ», и распознавалка слышит только «Qaqıldı…».

Новая обрезка

Та же озвучка, отрезано на 85 миллисекунд раньше — перед словом, а не внутри него.

«Нидже», которое звучало как «ниже»

В первой статье я рассказывал, как машина прочитала «нидже» как «ниже»: правило, которое переписывает наши буквы для модели, заодно превращало дж в ж, и модели буквально подавали русское слово. Чтобы починить, я сравнил пять способов записать этот звук. На четырнадцати проверочных фразах два лучших были неразличимы; только целая глава из 195 предложений показала, что татарская буква җ, исправляя «нидже», портит всё остальное — ошибок по буквам становилось на 27 % больше. Обычное дж исправляло слово и не портило ничего.

Дж переписано в ж

«Bu zaman içinde özenlerde nice suvlar aqtı, insanlar nice urba kiyip iprandırdılar.» Модели подали «ниже» — она так и прочитала, оба раза.

Обычное дж

То же предложение: «нидже», как и должно быть. Эту разницу нашло ухо, а не приборы.

Чей это голос

Образец решает

Модель, которую я дообучал, учится языку, а не тембру: тембр она берёт из короткого образца, нескольких секунд чьей-то записи с точным текстом. Свой голос я сначала пробовал на отдельных фразах и услышал длинные неуместные паузы посреди предложений. Виновата оказалась не модель, а образец: в нём было 0,77 секунды тишины перед словами и 1,77 секунды после. Модель берёт из образца и темп — и раскладывала лишнее время паузами внутри фраз. Я обрезал тишину по краям, и медиана суммарных пауз внутри предложения упала с 930 до 85 миллисекунд. В слепом сравнении голос с обрезанным образцом было не отличить от прежнего: 7 к 6.

Образец с тишиной по краям

«Съезд, кергин музакерелерден сонъ, къыркъ беш адамдан ибарет Къырым Мусульман Иджра Комитетини мейдангъа кетирди.» Мой голос в синтезе; паузы внутри предложения — около 1,8 секунды в сумме.

Тот же образец, тишина обрезана

Тот же текст, и всё остальное то же — изменился только образец. Паузы внутри предложения — 0,2 секунды.

Вторая книга

Разобравшись с образцом, я решил попробовать свой голос для целой книги. Так вторую книгу в нашей библиотеке — Юнус Къандым, «Куреш мейданыны от басмаз», 28 глав, 6 часов 29 минут звучания — машина прочитала моим голосом. Эту книгу я выбрал не случайно: её автор, Юнус Къандым, — мой дядя. Читала её уже нынешняя версия модели, а «Merdiven» — более ранняя.

«Куреш мейданыны от басмаз», начало первой главы

Мой голос в синтезе, 47 секунд. Отрывок начинается так: «Озь миллий девлетчилигимиз огърунда курешимиз девам этеркен, бизлер басып кечтигимиз ёлларгъа бир назар ташламалымыз.»

Её тоже можно послушать целиком: ana-yurt.com/kutuphane/3516/read.

Голос оказался самой надёжной частью всей цепочки. Почти всё, что ломалось, было вокруг него: склейка, обрезка, буквы, разметка. Часть этого нашли приборы, и ухо не нашло бы её никогда. Часть нашло ухо, и прибор не умел её даже оценить. А книга целиком нашла то, чего не нашли бы ни четырнадцать фраз, ни одна глава.

Читать дальше