Громкость tts что это
Как настроить синтезатор речи Google на Android
В то время как Google фокусируется на Помощнике, владельцы Android не должны забывать о функции синтеза речи (TTS). Она преобразует текст из Ваших приложений для Android, но Вам может потребоваться изменить его, чтобы речь звучала так, как Вы этого хотите.
Изменение синтеза речи легко сделать из меню настроек специальных возможностей Android. Вы можете изменить скорость и тон выбранного Вами голоса, а также используемый голосовой движок.
Синтезатор речи Google — это голосовой движок по умолчанию, который предварительно установлен на большинстве устройств Android. Если на Вашем Android-устройстве он не установлен, Вы можете загрузить приложение Синтезатор речи Google из Google Play Store.
Изменение скорости речи и высоты тона
Android будет использовать настройки по умолчанию для Синтезатора речи Google, но Вам может потребоваться изменить скорость и высоту голоса, чтобы Вам было легче его понять.
Изменение скорости речи и высоты тона TTS требует, чтобы Вы попали в меню настроек специальных возможностей Google. Шаги для этого могут незначительно отличаться, в зависимости от Вашей версии Android и производителя Вашего устройства. В данной статье используется устройство Honor 8 lite, работающее на Android 8.0.
Чтобы открыть меню специальных возможностей Android, перейдите в меню «Настройки» Android. Это можно сделать, проведя пальцем вниз по экрану для доступа к панели уведомлений и нажав значок шестеренки в правом верхнем углу, или запустив приложение «Настройки» в своем списке приложений.
В меню «Настройки» нажмите «Управление», а оттуда «Специальные возможности».
Выберите «Синтез речи».
Отсюда Вы сможете изменить настройки преобразования текста в речь.
Изменение скорости речи
Скорость речи — это скорость, с которой будет говорить синтезатор речи. Если Ваш TTS движок слишком быстрый (или слишком медленный), речь может звучать искаженно или плохо для понимания.
Если Вы выполнили вышеуказанные действия, Вы должны увидеть слайдер под заголовком «Скорость речи» в меню «Синтез речи». Проведите пальцем вправо или влево, чтобы повысить или понизить скорость.
Нажмите кнопку «Прослушать пример», чтобы проверить новый уровень речи.
Изменение высоты тона
Если Вы чувствуете, что тон преобразованного текста в речь слишком высок (или низок), Вы можете изменить это, следуя тому же процессу, что и при изменении скорости речи.
Как и выше, в меню настроек «Синтез речи» отрегулируйте ползунок «Тон» в соответствии с желаемой высотой тона.
Когда Вы будете готовы, нажмите «Прослушать пример», чтобы попробовать новый вариант.
Продолжайте этот процесс, пока Вы не будете довольны настройками скорости речи и высоты тона, или нажмите «Сбросить скорость речи» и/или «Сбросить настройки тона», чтобы вернуться к настройкам TTS по умолчанию.
Выбор голоса синтезатора речи
Вы можете не только изменить тон и скорость своего речевого движка TTS, но и изменить голос. Некоторые языковые пакеты, включенные в стандартный движок Синтезатор речи Google, имеют разные голоса, которые звучат как мужской, так и женский.
Если Вы используете Синтезатор речи Google, нажмите кнопку «i» рядом названием.
В меню «Настройки» нажмите «Установка голосовых данных».
Нажмите на выбранный Вами язык.
Вы увидите различные голоса, перечисленные и пронумерованные, начиная с «Голоса I». Нажмите на каждый, чтобы услышать, как он звучит. Вы должны убедиться, что на Вашем устройстве включен звук.
Выберите голос, который Вас устраивает в качестве Вашего окончательного выбора.
Ваш выбор будет автоматически сохранен, хотя, если Вы выбрали другой язык по умолчанию для Вашего устройства, Вам также придется изменить его.
Переключение языков
Если Вам нужно переключить язык, Вы можете легко сделать это из меню настроек Синтеза речи. Возможно, Вы захотите сделать это, если Вы выбрали язык в Вашем движке TTS, отличный от языка Вашей системы по умолчанию.
Вы должны увидеть опцию «Язык». Нажмите, чтобы открыть меню.
Выберите свой язык из списка, нажав на него.
Сторонние движки синтезатора речи
Если Синтезатор речи Google Вам не подходит, Вы можете установить альтернативные варианты.
Их можно установить из Google Play Store или установить вручную. Примеры движков TTS, которые Вы можете установить, включают Acapela и eSpeak TTS, хотя доступны и другие.
Мы Опубликовали Качественный, Простой, Доступный и Быстрый Синтез Речи
Вокруг темы синтеза речи сейчас много движения: на рынке есть огромное число тулкитов для синтеза, большое число закрытых коммерческих решений за АПИ (как на современных технологиях, так и на более старых, т.е. «говорилки») от условных GAFA компаний, большое количество американских стартапов, пытающихся сделать очередные аудио дипфейки (voice transfer).
Но мы не видели открытых решений, которые бы удовлетворяли одновременно следующим критериям:
Мы попытались учесть все эти пункты и представить комьюнити свое открытое некоммерческое решение, удовлетворяющее этим критериям. По причине его публичности мы не заостряем внимание на архитектуре и не фокусируемся на каких-то cherry picked примерах — вы можете оценить все сами, пройдя по ссылке.
Краткий Обзор Решений
Данная статья не ставит своей целью глубокий технический обзор всех доступных решений. Мы хотим просто обрисовать некий ландшафт из доступных вариантов с минимальной степенью готовности. Понятно, что мы не рассматриваем многочисленные тулкиты, а смотрим в первую очередь какие есть более-менее готовые решения с ненулевой библиотекой голосов и подобием поддержки / комьюнити:
Конкатенативные модели (появившиеся до DL бума). Из того, что хоть как-то поддерживается и живо и можно запустить «as-is» без археологических раскопок, я нашел только rhvoice (я глубоко не копал, но есть целые форумы, посвященные использованию голосов из Windows, но вряд ли это можно назвать поддерживаемым решением). На момент, когда я пользовался проектом ради интереса, он по сути был заброшен, но потом у него появился новый «хозяин». К плюсам такого рода решений можно отнести их скорость и нетребовательность к ресурсам (исключая ресурсы, чтобы заставить это работать). Очевидный и основной минус — звучит как говорилка. Менее очевидный минус — довольно тяжело оценить стоимость обладания. Качество звучания: 3+ по пятибалльной шкале;
Tacotron2 + WaveNet (оригинальный WaveNet принимал на вход лингвофичи, но для такотрона поменяли на более удобные мелспектрограммы). Основная проблема — очень медленный инференс ввиду авторегрессионности модели и необходимость запретительно большого количества ресурсов и времени. Качество звучания: 4+;
Tacotron2 + WaveRNN (тоже с переходом от лингвофичей к спектрограммам). Вокодер заметно быстрее предыдущего: при использовании всех хаков можно получить даже риалтайм синтез без GPU, правда естественность звука несколько просядет. Качество звучания: 3.5-4;
Tacotron2 + Parallel WaveNet. Упомянутый выше медленный вокодер был использован в качестве учителя для получения новой довольно быстрой параллельной модели вокодера: с ней стал возможен синтез быстрее риалтайма, но все еще на мощных GPU. Из недостатков — дистилляция требует качественную учительскую модель и соответствующую схему обучения. Качество звучания: 4+;
Tacotron2 + multi-band WaveRNN. Тоже развитие предыдущих идей, тоже распараллеливание в некотором смысле — здесь доступен синтез быстрее риалтайма уже на CPU. Однако, не слишком популярная работа, меньше имплементаций и поддержки, хотя некоторые подходы хороши и были успешно использованы в более поздних моделях; Качество звучания: 3.5-4+;
Tacotron2 + LPCNet. Интересная идея про сочетание DL и классических алгоритмов, что может дать буст по скорости до подходящего для продакшена уровня и на CPU, но требует вдумчивого допиливания для качественных результатов. Качество звучания: 3.5-4+;
Многочисленные решения на базе Tacotron2 + Waveglow от Nvidia как нынешний стандарт для задачи синтеза речи. Никто не пишет про свой «секретный соус» (например как 15.ai делает голос по 15 минутам и сколько там моделей в цепочке). Есть много имплементаций и репозиториев, которые «копируют» чужой код. Может звучать на cherry-picked примерах неотличимо от живых людей, но когда смотришь реальные модели от комьюнити, качество заметно варьируется, а детали улучшенных решений не раскрываются. Архитектурно к такотрону и его аналогам по скорости и цене обладания претензий нет, но Waveglow очень прожорлив к ресурсам как на тренировке, так и в продакшене, что делает его использование по сути нецелесообразным. Качество звучания: 3.5-4+;
Замена Tacotron2 => FastSpeech / FastSpeech 2 / FastPitch, то есть уход к более простой сетке (на базе forced-align от такотрона и миллион более хитрых и сложных вариантов). Из полезного дает контроль темпа речи и высоты голоса, что неплохо, вообще упрощает и делает более модульной конечную архитектуру. Немаловажно, что сетка перестает быть рекуррентной, что открывает просторы для оптимизаций по скорости. Качество звучания: 3.5-4+;
Оценки Качества и Примеры Аудио
Чтобы не вдаваться в дебри, мы поступили максимально просто: синтезировали аудио из валидационной выборки датасетов (
200 файлов на спикера), смешали с оригинальными аудио этой же выборки и дали группе из 24 людей для оценки качества звучания по пятибалльной шкале. Для 8kHz и 16kHz оценки собирали раздельно, градация оценок — [1, 2, 3, 4-, 4, 4+, 5-, 5] — с большей детализацией для более качественного звука.
Всего было поставлено 37,403 оценок. 12 человек сделали оценку полностью. Еще 12 людей успели проставить только от 10% до 75% оценок. Дальше для каждого спикера мы просто посчитали среднее (в скобочках приведено стандартное отклонение). Расчет среднего от медиан по каждому аудио завышает средние оценки на 0.1 — 0.2 балла, но не влияет на отношения. Показательны естественно скорее отношения средних баллов друг к другу. Дисперсия довольно высокая, но оценки пользователей отличались сильно и мы решили не выбрасывать никакие, т.к. оценки одного пользователя были консистентными друг с другом. По ряду соображений мы провели такую оценку только на своих уникальных голосах:
Спикер | Оригинал | Синтез | Отношение | Примеры |
---|---|---|---|---|
aidar_8khz | 4.67 (.45) | 4.52 (.55) | 96.8% | link |
baya_8khz | 4.52 (.57) | 4.25 (.76) | 94.0% | link |
kseniya_8khz | 4.80 (.40) | 4.54 (.60) | 94.5% | link |
aidar_16khz | 4.72 (.43) | 4.53 (.55) | 95.9% | link |
baya_16khz | 4.59 (.55) | 4.18 (.76) | 91.1% | link |
kseniya_16khz | 4.84 (.37) | 4.54 (.59) | 93.9% | link |
Мы просили людей в первую очередь оценивать естественность звучания речи (а не качество звука). Нас удивило, что по расспросам обычные люди на своих ежедневных девайсах не особо слышат разницу между 8 kHz и 16 kHz (что подтверждается оценками)! Самые низкие абсолютные оценки и самое низкое отношение у Байи. Самые высокие абсолютные оценки — у Ксении, а относительные — у Айдара. Тут важно отметить, что у Байи меньше поставлен голос, но поэтому он звучит более по-человечески за счет этого. У Байи также выше дисперсия оценок.
Ручной просмотр аудио с большими расхождениями показывает ошибки спикеров, ошибки такотрона, ошибочные паузы (тоже вследствие ошибок такотрона), имена собственные и сложные слова, которые вообще непонятно как читать. Естественно 75% таких расхождений в синтезе (а не оригинале) и частота дискретизации особо не влияет.
Если мы пытались дать численную оценку естественности, то еще хорошо бы оценить «неестественность» или «роботизированность» голоса. По идее ее можно оценивать, давая людям пару аудио на выбор и прося выбрать между ними. Но мы пошли дальше и по сути применили «двойной слепой тест». Мы в случайном порядке дали людям поставить оценки «одному и тому же аудио» 4 раза — оригинал и синтез с разной частотой дискретизации. Для участников исследования, разметивших весь датасет, получается такая таблица:
Сравнение | Хуже | Одинаково | Лучше |
---|---|---|---|
16k против 8k, оригинал | 957 | 4811 | 1512 |
16k против 8k, синтез | 1668 | 4061 | 1551 |
Оригинал против синтеза, 8k | 816 | 3697 | 2767 |
Оригинал против синтеза, 16k | 674 | 3462 | 3144 |
Тут напрашивается несколько выводов:
Можете оценить сами, как это звучит, как для наших уникальных голосов, так и для спикеров из внешних источников (больше аудио для каждого спикера можно синтезировать в colab.
Если вы не дружите с колабом или глаза разбегаются от количества файлов в папках с примерами, то вот несколько случайных аудио:
Как мы выбирали TTS для озвучек примеров в Словаре
Словарь в Puzzle English помогает пользователям учить лексику наряду с аудио- и видеопазлами, подкастами, фильмами, сериалами и песнями. В Словаре переводы сопровождаются аудиопримерами слов и выражений. Для озвучек мы используем записи живых дикторов и TTS — text-to-speech system, синтезаторы речи из текста. Сегодня расскажем, как выбрали TTS-движок Vocalware, почему хотим подключить вместо него систему Amazon Polly и какие задачи человек пока решает лучше робота.
В Словаре мы задействовали больше 20 голосов с разными акцентами, тембром, вариантами произношения. Звучат мужские и женские голоса с различной скоростью речи. У «дикторов» есть имена и страны происхождения — США, Великобритания или Австралия. Варианты произношения помогают пользователям научиться говорить и воспринимать иностранную речь. Так выглядит переключатель произношения для одного слова:
Как искали подходящую TTS
Исходя из функционала Словаря, нам нужна TTS, которая поддерживает хотя бы три акцента: американский (General American), британский (Received Pronunciation) и австралийский. Требовались мужские и женские голоса и желательно поддержка транскрипций.
Мы искали TTS, которая синтезирует речь близко к натуральному голосу, выдает четкий звук и не слишком требовательна к качеству интернет-соединения на стороне пользователя. Студенты Puzzle English живут в разных регионах России, пользуются сервисом с мобильных телефонов через 2G и 3G. Хотелось, чтобы TTS умела синтезировать не только слова, но и читать фразы с выражением.
Мы озаботились этой проблемой еще в 2015 году, но обнаружили, что найти адекватную требования TTS почти невозможно. На рынке было несколько движков:
Acapela — умеет распознавать и озвучивать тексты на 34 языках. Более 100 синтезируемых голосов с разным возрастом, эмоциями, акцентами. Выдает высокое качество звука.
Vocalizer — голос звучит естественно, речь чистая. Устанавливаются различные словари, корректируется громкость, скорость и ударение.
RSynth — нет документации, качество речи посредственное.
Festival — многоязычная система синтеза речи, работает не всегда стабильно.
Vocalware — больше 100 синтезируемых голосов на 20 языках.
Acapela и Vocalizer работали только на Андроиде, другие системы не поддерживали. К тому же, они были нестабильны, как и Festival. Движки eSpeak и RSynth не подошли, потому что качество синтеза речи для Словаря должно быть идеальным.
Из этих вариантов мы выбрали движок Vocalware, который отвечал нашим критериям: акценты, голоса разнополых «дикторов», транскрипции. Тогда этот движок предлагал одно из лучших качеств синтеза произвольного текста. С его помощью мы создали больше трети озвучек. Vocalware хорошо справляется с переводом отдельных слов, но не с целыми фразами. Их в Puzzle English переводят живые дикторы.
Почему хотим подключить Amazon Polly
К сожалению, Vocalware не успевает за требованиями времени.
Amazon Polly лучше Vocalware по всем параметрам: предлагает десятки языков, мужские и женские голоса, которые звучат естественнее. Движок поддерживает лексиконы и теги SSML, которые позволяют контролировать произношение, громкость, высоту голоса и скорость. Polly работает быстрее.
Google Cloud Text-to-Speech пока не вышел в продакшен, проходит бета-тестирование. В основе движка лежит технология WaveNet — та самая, на которой работает Google Translate и другие сервисы Google. Она использует нейросети, чтобы слова и фразы звучали естественно. Сервис предлагает на выбор 30 голосов с вариантами звучания. Настраивается высота тона каждого голоса, на 20 полутонов выше или ниже исходного.
Мы тестировали обе системы и пришли к выводу, что небольшие компании, которые раньше представляли рынок TTS, упустили свой шанс и остались позади. Они вряд ли сделают продукт лучше гигантов — Google и Amazon. Эти корпорации используют огромные объемы данных и вычислительные мощности для голосовых моделей, и постепенно захватят рынок.
Теперь планируем перейти на решение Amazon, потому что качество синтеза речи у Polly сравнимо с тем, что выдает WaveNet. Наш фаворит — «диктор» для британского английского по имени Brian, который звучит наиболее естественно.
Еще Polly, в отличие от WaveNet, синтезирует русскую речь. У этой TTS есть варианты английского произношения с ирландским и индийским акцентами. Эти произношения полезны для англоязычной версии сайта, которой будут пользоваться в том числе индийцы, желающие выучить английский. При этом стоит система дешевле.
В результате анализа этих TTS мы запланировали в ближайшее подключить дополнительные голоса от Polly. Старые «дикторы» пока тоже останутся: смысл Словаря в том, чтобы пользователь мог услышать разные варианты произношения. А делать озвучку составных фраз с помощью одних только роботов пока не получается. На сервисе много фраз созданы через TTS, но отказаться от живых дикторов полностью пока не получается.
Почему робот уступает человеку при озвучке фраз
В Puzzle English фразы озвучивают живые дикторы. У машины получается озвучивать простые предложения — повествовательные, с вопросом, отрицанием, без эмоциональной окраски. С более сложным текстом она не справляется, допускает несколько типичных ошибок.
«Чеканка»
Это произношение отдельно по одному слову. Такие озвучки даже приблизительно не похожи на речь, в них нет интонации, фразового членения высказывания и смыслового ударения, потому что под ударением произносится каждое слово.
Вот как одну и ту же фразу читает TTS в Google Translate и живой диктор.
Робот делает небольшие паузы между словами, как бы «чеканя их».
Диктор использует фразовое ударение, большое предложение он делит по смыслу. Фраза лучше воспринимается на слух.
Интонация
Машина обычно не может воспроизвести нужную интонацию. Этот момент в произношении фраз важен для многих изучающих английский язык. Часто ученики думают, что достаточно поставить звуки, и речь будет звучать как у англичанина. Это не так. Иностранца выдает неверная интонация. Живой человек может выделить необходимые части предложения, если того требует контекст. Робот такого не сделает. Послушайте еще раз примеры фраз выше и вы поймете о чем речь.
Прямая речь
Машина не выделяет прямую речь, обозначенную пунктуационно. Она продолжает читать текст, сохраняя общую интонационную картину.
Так читает текст носитель языка:
Эмоции в разговоре
Робот не распознает фрагменты, на которых носитель делает ударение, чтобы подчеркнуть определенные слова, например, когда фраза имеет ироничный оттенок. Робот как правило сохраняет нейтральную интонацию.
Это также слышно на предыдущих примерах.
Неверная скорость произношения
Частая ошибка у робота — растягивание, которое производит эффект заторможенности. И, наоборот, слишком быстрое произношение слова или фразы дает «прожевывание» текста.
Неестественные ударения
Робот читает с ударением каждое слово, что неестественно для живой речи.
В этом примере робот выделяет предлог at.
Диктор предлог не выделяет, в живой речи at сливается с playing и сам по себе безударный.
Движки Google и Amazon читают фразы лучше других TTS, которые мы тестировали. По результатам анализа оба решения от крупных корпораций не справились с шестью фразами со сложной интонацией и неплохо справились только с пятью. У Google два стандартных «диктора» читали плохо, два — удовлетворительно, а у Amazon — плохо два и удовлетворительно только один.
Результат Google в целом немного лучше, но некоторые озвучки Amazon Polly показались более интересными, поскольку голос и интонации звучали естественнее. В целом доверить произношение фраз TTS уже можно, но не во всех случаях и не в продукте для изучающих иностранный язык. Им важно качество и нюансы произношения, которые робот не всегда может передать.
Вывод
С помощью TTS можно озвучивать отдельные слова на разных языках для ваших сервисов. Новые решения Amazon и Google справляются с этой задачей лучше, чем существовавшие ранее движки небольших компаний. Но фразы, особенно сложные предложения с несколькими запятыми, в их исполнении пока звучат неестественно. Робот не может выделить прямую речь, передать иронию, сделать смысловое ударение, выбрать правильную интонацию для разделительного вопроса в конце предложения. Для наших целей это неприемлемо, поэтому мы просим живых дикторов озвучивать такие материалы и продолжаем тестировать новые предложения на этом рынке.
Если вы хотите прокачать английский, приходите к нам.
Читателям блога дарим купон на 700 рублей для покупки «Заданий».
Технологии ASR и TTS для прикладного программиста: теоретический минимум
Введение
В последние несколько лет голосовые интерфейсы окружают нас все плотнее. То, что когда-то демонстрировалось только в фильмах о далеком будущем, оказалось вполне реальным. Дело дошло уже до встраивания движков для синтеза (Text To Speech — TTS) и распознавания (Automatic Speech Recognition — ASR) речи в мобильные телефоны. Более того, появились вполне доступные API для встраивания ASR и TTS в приложения.
Ныне создавать программы с голосовым интерфейсом может любой желающий (не поскупившийся заплатить за движок). Наш обзор будет посвящен именно использованию имеющихся движков (на примере Nuance) а не созданию таковых. Также будут даны общие сведения необходимые каждому программисту впервые сталкивающемуся с речевыми интерфейсами. Статья также может быть полезна руководителям проектов, пытающимся оценить целесообразность интеграции голосовых технологий в их продукты.
Итак, начнем…
Но для затравки — анекдот:
Урок русского языка в грузинской школе.
Учитель говорит: «Дети, запомните: слова сол, фасол и вермишел пишутся с мягким знаком, а слова вилька, булька, тарелька – без мягкого знака. Дети, запомните, потому что понять это невозможно!»
Раньше этот анекдот казался мне смешным. Теперь — скорее жизненным. Почему так? Сейчас постараюсь объяснить…
1. Фонемы
Говоря о речи (уже смешно) нам прежде всего придется разобраться с понятием фонемы. Говоря попросту — фонема это отдельный звук, который может быть произнесен и распознан человеком. Но такого определения конечно мало, ибо произнести можно очень много звуков, а набор фонем в языках ограничен. Хочется иметь более строгое определение. А значит — нужно идти на поклон к филологам. Увы, филологи и сами не могут сойтись во мнениях что это такое (да им и не особо надо), но имеют несколько подходов. Один связывает фонемы со смыслом. Например, английская Wiki говорит нам «The smallest contrastive linguistic unit which may bring about a change of meaning». другие — с особенностями восприятия. Так, наш соотечественник Н. Трубецкой писал «Фонологические единицы, которые с точки зрения данного языка невозможно разложить на более краткие следующие друг за другом фонологические единицы мы называем фонемами». И в том и в другом определении есть важные для нас уточнения. С одной стороны, изменение фонемы может (но не обязано) поменять смысл слова. Так, «код» и «кот» — будут восприняты как два разных слова. С другой — вы можете произнести «музей» или «музэй» и смысл не изменится. Разве что ваши собеседники смогут как-то классифицировать ваш акцент. Важна и неделимость фонем. Но, как верно замечено у Трубецкого — она может зависеть от языка. Там, где человек одной национальности слышит один звук, кто-то другой может услышать два, следующих друг за другом. Хочется, однако, иметь фонетические инварианты, пригодные для всех языков, а не только какого-то одного.
2. Фонетический алфавит
Чтобы как-то утрясти определения еще в далеком 1888 году был создан международный фонетический алфавит (IPA). Алфавит этот хорош тем, что не зависит от конкретного языка. Т.е. рассчитан как бы на «сверхчеловека» который может произносить и распознавать звуки практически всех имеющихся живых (и даже мертвых) языков. Алфавит IPA постепенно изменялся вплоть до наших дней (2005 год). Поскольку создан он был в основном в докомпьютерную эпоху, то филологи рисовали символы обозначающие звуки как бог на душу положит. Они конечно как-то ориентировались на латинский алфавит, но весьма и весьма условно. Как результат сейчас символы IPA хоть и есть в Unicode, но вводить их с клавиатуры весьма непросто. Тут читатель может спросить — а зачем вообще нужен IPA простым людям? Где я могу увидеть хотя бы примеры слов, записанных фонетически? Мой ответ — простому человеку IPA в общем-то знать не обязательно. Но, при всем этом увидеть его можно очень легко — во многих статьях Wiki, касающихся географических названий, фамилий и имен собственных. Зная IPA вы всегда можете сверить правильность произношения того или иного названия на незнакомом вам языке. Например, хотите произносить «Париж» как француз? Вот вам пожалуйста — [paʁi].
3. Фонетическая транскрипция
Внимательный пользователь Wiki может правда заметить, что иногда странные значки фонетического алфавита стоят внутри квадратных скобок — [mɐˈskva], а иногда — внутри косых черт (слэшей) — /ˈlʌndən/. В чем же разница? В квадратных скобках записывается т.н. narrow, сиречь «узкая» транскрипция. В отечественной литературе она зовется фонетической. В слэшах же пишется broad, т.е. «широкая» или фонематическая транскрипция. Практический смысл здесь следующий: фонетическая транскрипция дает предельно точное произношение, которое в некотором смысле идеально и независимо от акцента говорящего. Иными словами — имея фонетическую транскрипцию мы можем сказать «кокни произнесет это слово так». Фонематическая же транскрипция позволяет вариации. Так, австралийском и канадском английском произносимый звук при одинаковой записи в // может быть другим. По правде говоря, даже узкая транскрипция все еще не однозначна. Т.е. довольно далека от waw-файла. Мужской, женский и детский голос произнесут одну и ту же фонему по-разному. Также не принимается во внимание общая скорость речи, ее громкость и базовая высота голоса. Собственно, эти отличия и делают задачу генерации и распознавания речи нетривиальной. Далее по тексту я всегда буду пользоваться IPA в узкой транскрипции, если не оговорено другое. При этом прямое использование IPA я постараюсь свести к разумному минимуму.
4. Языки
Каждому живому естественному языку свойственен свой набор фонем. Более точно — это свойство речи, ибо вообще говоря, можно знать язык не имея возможности произносить слов (как обучаются языку глухо-немые). Фонетический состав языков различен, примерно так же как различны алфавиты. Соответственно, разнится и фонетическая сложность языка. Она складывается из двух составляющих. Во-первых, сложность преобразования графем в фонемы (мы помним, что англичане пишут «Манчестер» а читают «Ливерпуль») и сложности произнесения самих звуков (фонем) во-вторых. Сколько фонем обычно содержит язык? Несколько десятков. С детства нас учили что русское произношение простое как три копейки, и все читается как пишется, в отличии от европейских языков. Конечно нас обманывали! Если читать слова буквально так, как они написаны, вас хоть и поймут, но не всегда верно. Но уж русским точно не посчитают. Кроме того, в дело вступает такая жуткая для европейца вещь как ударение. Вместо того, чтобы ставить его в начале (как англичане) или в конце (как французы) у нас оно гуляет по всему слову как бог на душу положит, при этом меняя смысл. Дoрoги и дороги — два различных слова, и даже части речи. Сколько фонем в русском языке? Nuance насчитывает их 54 штуки. Для сравнения — в английском всего 45 фонем, а во французском и того меньше — 34. Не зря аристократы считали его легким для изучения языком пару веков назад! Конечно — русский не самый сложный язык в Европе, но один из (заметьте, я еще молчу о грамматике).
5. X-SAMPA и LH+
Поскольку вводить фонетическую транскрипцию с клавиатуры людям хотелось давно, еще до широкого распространения Unicode, то были разработаны нотации, позволяющие обойтись только символами таблицы ASCII. Две наиболее распространенных из них это X-SAMPA — творение профессора Джона Уэлса, и LH+ — внутренний формат компании Lernout & Hauspie, технологии которой были в дальнейшем куплены Nuance Communications. Между X-SAMPA и LH+ есть довольно существенная разница. Формально, X-SAMPA — это просто нотация, позволяющая по определенным правилам записывать те же фонемы IPA, только с помощью ASCII. Иное дело LH+. В некотором смысле — LH+ является аналогом широкой (фонематической) транскрипции. Дело в том, что для каждого языка, один и тот же символ LH+ может обозначать разные фонемы IPA. С одной стороны — это хорошо, т.к. укорачивается запись, и не нужно кодировать все возможные символы IPA, с другой — возникает неоднозначность. И каждый раз для трансляции в IPA нужно держать перед собой таблицу соответствия. Однако, печальнее всего то, что строку записанную в LH+ может правильно произнести только «голос» для определенного языка.
6. Голоса
Нет, речь пойдет не о тех голосах, которые часто слышат в голове программисты, которые в прошлом написали слишком много плохого кода. Скорее о тех, которые так часто ищут на трекерах и файлопомойках обладатели навигаторов и прочих мобильных устройств. Голоса эти имеют даже имена. Слова «Милена» и «Катерина» многое говорят бывалому пользователю голосовых интерфейсов. Что же это такое? Грубо говоря — это наборы данных, подготовленные различным компаниями (типа той же Nuance) которые позволяют компьютеру преобразовывать фонемы в звук. Голоса бывают женские и мужские, и стоят немалых денег. В зависимости от платформы и фирмы-разработчика с вас могут потребовать 2-5 тыс. долларов за голос. Таким образом, если вы хотите создать интерфейс хотя бы на 5 наиболее распространенных европейских языках, то счет может пойти на десятки тысяч. Разумеется, речь именно о программном интерфейсе. Итак, голос специфичен для языка. Отсюда же происходит и привязка его к фонетической транскрипции. Это непросто осознать по-первости, но анекдот в начале статьи — сущая правда. Люди с одним родным языком обычно просто не в состоянии произнести фонемы другого, которых нет в их родном языке. И, что еще хуже — не только отдельные фонемы но и определенные их сочетания. Так, если в твоем языке слово никогда не заканчивается на мягкое «л» то и произнести его мы не сможем (поначалу).
То же самое и с голосами. Голос заточен на произнесение только тех фонем, которые имеются в языке. Более того — в конкретном диалекте языка. Т.е. голоса для канадского французского и французского французского будут не только отличаться по звучанию, но и иметь разный набор произносимых фонем. Это, кстати, удобно фирмам производителям движков ASR и TTS, т.к. каждый язык можно продавать за отдельные деньги. С другой стороны — можно понять и их. Создание голоса дело довольно трудоемкое, и затратное по деньгам. Возможно именно по этому до сих пор не существует сколь-нибудь широкого рынка Open Source решений для большинства языков.
Казалось бы, ничто не мешает создать «универсальный» голос, который будет уметь произносить все фонемы IPA, и таким образом решит проблему многоязычных интерфейсов. Но этого почему-то никто не делает. Скорее всего, это и невозможно. Т.е. говорить-то он может и будет, но каждый носитель языка будет недоволен недостаточной «натуральностью» произношения. Звучать это будет примерно как русский в устах мало практиковавшегося англичанина или английский в устах француза. Так что, если хотите многоязычности — приготовьтесь раскошелиться.
7. Пример использования TTS API
Чтобы дать читателю представление о том, как процесс работы с TTS выглядит на нижнем уровне (используется С++) я приведу пример синтеза речи на базе движка Nuance. Разумеется это неполный пример, его нельзя не только запустить но даже скомпилировать, но представление о процессе он дает. Все функции кроме TTS_Speak() нужны как «обвязка» для нее.
TTS_Initialize() — служит для инициализации движка
TTS_Cleanup() — для деинициализации
TTS_SelectLanguage — выбирает язык и настраивает параметры распознавания.
TTS_Speak() — собственно генерирует звуковые отсчеты
TTS_Callback() — вызывается, когда очередная порция звуковых данных готова к проигрыванию а также в случае других событий.
Как может заметить читатель, код довольно громоздок, и простая (казалось бы) функциональность требует большого числа предварительных настроек. Увы, это обратная сторона гибкости движка. Разумеется, API других движков и для других языков может быть существенно проще к компактнее.
8. Снова фонемы
Поглядев на API, читатель может спросить — а зачем нам вообще нужны фонемы, если TTS (Text-To-Speech) умеет прямо конвертировать текст в речь. Умеет, но тут есть одно «но». Хорошо преобразуются в речь знакомые движку слова. Гораздо хуже дело обстоит со словами «незнакомыми». Такими как топонимы, имена собственные и т.п. Это особенно хорошо видно на примере многонациональных стран, таких к примеру, как Россия. Названия городам и весям на территории одной вечно-шестой части суши давались разными людьми, на разных языках и в разное время. Необходимость записать их русскими буквами сыграла плохую шутку с национальными языками. Фонемы татар, ненцев, абхазцев, казахов, якутов, бурят оказались втиснуты в прокрустово ложе русского языка. В котором хоть и много фонем, но все же недостаточно чтобы передать все языки народов бывшего Союза. Но дальше хуже — если фонетическая запись хоть как-то похожа на оригинал, то прочтение движком TTS названия типа «Кючук-Кайнарджи» ничего кроме смеха не вызывает.
Однако, наивно думать что это только проблема русского языка. Аналогичные сложности есть и в более однородных по населению странах. Так, во французском языке буквы p, b, d, t, s в конце слов обычно не читаются. Но если мы возьмем топонимы, то тут уже вступают в силу местные традиции. Так, в слове Paris ‘s’ в конце дейстивтельно не произносится, а в слове ‘Valluris’ — наоборот. Разница в том, что Париж расположен на севере Франции, а Валлорис — на юге, в Провансе, где правила произношения несколько другие. Именно поэтому, все же желательно иметь фонетическую транскрипцию для слов. Обычно карты поставляются с ней. Правда, единства в формате не наблюдается. Так, NavTeq традиционно использует транскрипцию X-SAMPA, а TomTom — LH+. Хорошо, если ваш TTS-движок воспринимает обе, а если нет? Тут приходится извращаться. Например — конвертировать одну транскрипцию в другую, что само по себе нетривиально. Если же фонетической информации вовсе нет, то движок имеет собственные методы ее получения. Если говорить о движке Nuance — это «Data Driven Grapheme To Phoneme» (DDG2P) и «Common Linguistic Component» (CLC). Однако использование этих вариантов — уже крайняя мера.
9. Специальные последовательности
Nuance дает не только возможность произносить текст или фонетическую запись, но и динамически переключаться между ними. Для этого используется escape-последовательность вида: /+
Вообще, с помощью escape-последовательностей можно задавать множество параметров. В общей форме это выглядит так:
\x1b\rate=110\ — устанавливает скорость произношения
\x1b\vol=5\ — устанавливает громкость
\x1b\audio=«beep.wav»\ — вставляет в звуковой поток данные из wav-файла.
Аналогичным образом можно заставлять движок читать слово по буквам, вставлять паузы, менять голос (например — с мужского на женский) и многое другое. Конечно, не все последовательности могут вам пригодится, но в целом это очень полезная возможность.
10. Словари
11. Распознавание
Распознавание речи является еще более сложной задачей чем её синтез. Если синтезаторы кое-как работали еще в старые добрые времена, то толковое распознавание стало доступно только сейчас. Причин тут несколько, первая из которых очень напоминает проблемы обычного живого человека столкнувшегося с незнакомым языком, вторая — столкновение с текстом из незнакомой области.
Воспринимая колебания звука, напоминающие нам голос мы сначала пытаемся делить его на фонемы, вычленять знакомы звуки, которые должны у нас сложиться в слова. Если язык знаком нам, то это легко получается, если нет — то скорее всего даже «правильно» разложить речь на фонемы не удастся (помните историю про «Алла, я в бар!»). Там где нам слышится одно, произносящему — совсем другое. Происходит это потому, что годами наш мозг «натаскивался» на определенные фонемы, и со временем привык воспринимать только их. Встречая незнакомый звук, он пытается подобрать фонему родного языка [языков] наиболее близкую к услышанной. В каком-то смысле это похоже на метод векторного квантования применяемый в кодеках речи типа CELP. Не факт, что такая аппроксимация будет удачной. Именно поэтому, «удобными» для нас будут именно «родные» фонемы.
Помните, еще при СССР, учась в школе, и встречаясь с иностранцами мы пытались «транслитерировать» свое имя, говоря:
«Май нэйм из бОрис пEтрофф»
Учителя тогда ругали нас, говоря — зачем коверкаешь свою фамилию? Думаешь ему от этого понятней будет? Говори по-русски!
Увы, они и тут нас обманывали или заблуждались… Если вы смогли произнести свое имя на английский/немецкий/китайский лад, то носителю языка будет действительно легче его воспринять. Китайцы поняли это давно, и для общения с западными партнерами берут себе специальные «европейские» имена. В машинном распознавании, тот или иной язык описывается так называемой акустической моделью. Перед распознаванием текста, мы должны загрузить акустическую модель определенного языка, тем самым дав понять программе, какие фонемы ей ждать на входе.
Вторая проблема не менее сложна. Вернемся снова к нашей аналогии с живым человеком. Слушая собеседника мы подсознательно выстраиваем в голове модель того, что он скажет дальше, сиречь, создаем контекст разговора. И если ВНЕЗАПНО вставлять в повествование слова выпадающие из контекста (например «эвольвента», когда речь идет о футболе), можно вызвать у собеседника когнитивный диссонанс. Грубо говоря, у компьютера этот самый диссонанс происходит постоянно, ибо он никогда не знает чего ожидать от человека. Человеку проще — он может переспросить собеседника. А что делать компьютеру? Чтобы решить эту проблему и дать компьютеру верный контекст, применяются грамматики.
12. Грамматики
Грамматики (обычно заданные в форме BNF) как раз дают компьютеру (точнее движку ASR) представление о том, чего ждать от пользователя в данный конкретный момент. Обычно — это несколько альтернатив объединенных через ‘или’, но возможны и более сложные грамматики. Вот пример грамматики для выбора станций метро Казани:
Как видим, каждая строка представляет собой одну из альтернатив, состоящих из собственно текста, целочисленного id и фонемы. Фонема в общем-то не обязательна, но с ней распознавание будет точнее.
Насколько велика может быть грамматика? Достаточно велика. Скажем, в наших экспериментах 37 тысяч альтернатив распознаются на приемлемом уровне. Гораздо хуже обстоит дело со сложными и разветвленными грамматиками. Время распознавания растет, а качество падает, причем зависимость от длинны грамматики нелинейна. Поэтому мой совет — избегайте сложных грамматик. Во всяком случае пока.
Грамматики (как и контексты) бывают статическими и динамическими. Пример статической грамматики вы уже видели, она компилируется заранее и хранится во внутреннем бинарном представлении движка. Однако порой контекст меняется во время интеракции с пользователем. Характерные пример для навигации — выбор города по первым буквам. Множество возможных вариантов для распознавания здесь меняется с каждой введенной буквой, соответственно, контекст распознавания надо постоянно перестраивать. Для этих целей и используются динамические контексты. Грубо говоря, программист компилирует грамматики «на лету» и подсовывает их движку прямо по ходу выполнения программы. Разумеется, если речь идет о мобильном устройстве, скорость обработки будет не слишком велика, так что придется ограничиться грамматиками небольшого размера (порядка 100 слов) чтобы пользовательский интерфейс не подвисал.
13. Пример использования ASR API
Распознавание текста не так однозначно, как синтез. Если пользователь просто помолчит перед микрофоном — нам придется распознавать окружающий шум. Если произнесет что-то типа «э-э-э-э» то распознавание тоже скорее всего будет неуспешным. В лучшем случае, ASR обычно возвращает нам набор вариантов (называемых еще гипотезами). Каждая гипотеза имеет определенный вес. Если грамматика большая, то вариантов распознавания может быть довольно много. В этом случае имеет смысл последовательно произнести гипотезы (например, первые пять по убыванию достоверности) и попросить пользователя выбрать одну из них. В идеале, при короткой грамматике («да»|«нет») нам вернется один вариант с высоким показателем достоверности.
Пример приведенный ниже содержит следующие функции:
ConstructRecognizer() — создает «распознаватель» и настраивает его параметры
DestroyRecognizer() — уничтожает «распознаватель»
ASR_Initialize() — инициализирует движок ASR
ASR_UnInitialize() — деинициализирует движок ASR
evt_HandleEvent — обрабатывает события генерируемые thread-ом «распознавателя»
ProcessResult() — печатает результаты распознавания
Очевидно, как и в случае TTS, код довольно велик, и предварительные действия занимают много места. И это еще не полностью рабочий код! При публикации я выкинул много лишнего. Все это еще раз показывает тем, кто дочитал до этого места, что использование технологии голосового ввода/вывода требует довольно высокого «порога вхождения».
14. Поточное распознавание (диктовка)
Последним словом техники сейчас является поточное распознавание, или dictation. Технология уже доступна на современных смартфонах под Android и iOS. В том числе — в виде API. Здесь программисту нет нужды указывать контекст распознавания создавая грамматики. На входе имеется речь — на выходе, распознанные слова. К сожалению, детали того, как этот метод работает пока мне недоступны. Процесс распознавания идет не на самом устройстве, а на сервере, куда голос передается и оттуда же получается результат. Хочется однако верить, что по прошествии лет технология будет доступна и на клиентской стороне.