Всем привет.
Хочу рассказать о такой удивительной технологии как Tts и, возможно, неожиданном её применении для озвучки субтитров на YouTube с использованием JavaScript. Реализовано в виде расширения для браузера Chrome (для Yandex и Atom тоже подойдет).
Изучая новое, или когда просто смотрим YouTube, иногда попадаются ролики, очень важные, но на другом языке, с одной стороны можно включить субтитры, выбрав перевод на родной язык, но бывает, сложно одновременно читать и смотреть на то, что происходит на мониторе.
В целом, технология Text-to-Speech достаточно известна, много чего на ней написано, распознавание речи и все такое. Большое внимание заострять не буду, вы и сами почитаете, если будет нужно. Для JavaScript почитать можно тут Web Speech API, послушать здесь Speech synthesiser.
Скажу только, что у Google есть множество разных голосов, но почти все они часть платного API, а базовый функционал, браузерного синтезатора речи, предоставляет по 1 голосу на язык (для английского доступно 3 голоса: en-US, en-GB Male, en-GB Female).
Microsoft предоставляет 2 голоса на язык, в рамках языковых пакетов для Windows (10). Новые голоса добавляются в "Параметры->Время и язык->Распознавание голоса". Может у них есть и больше голосов, но установив все доступные мне языковые пакеты, получилось так:
Список доступных голосов win 10
Доступные голоса для Windows 10 Chrome
Code | Microsoft | |
ar-EG | Microsoft Hoda - Arabic (Egypt) | |
ar-SA | Microsoft Naayf - Arabic (Saudi) | |
bg-BG | Microsoft Ivan - Bulgarian (Bulgaria) | |
ca-ES | Microsoft Herena - Catalan (Catalan) | |
cs-CZ | Microsoft Jakub - Czech (Czech Republic) | |
da-DK | Microsoft Helle - Danish (Denmark) | |
de-AT | Microsoft Michael - German (Austria) | |
de-CH | Microsoft Karsten - German (Switzerland) | |
de-DE | Microsoft Hedda - German (Germany) Microsoft Katja - German (Germany) Microsoft Stefan - German (Germany) | Google Deutsch |
el-GR | Microsoft Stefanos - Greek (Greece) | |
en-AU | Microsoft Catherine - English (Australia) Microsoft James - English (Australia) | |
en-CA | Microsoft Linda - English (Canada) Microsoft Richard - English (Canada) | |
en-GB | Microsoft George - English (United Kingdom) Microsoft Hazel - English (United Kingdom) Microsoft Susan - English (United Kingdom) | Google UK English Female Google UK English Male |
en-IE | Microsoft Sean - English (Ireland) | |
en-IN | Microsoft Heera - English (India) Microsoft Ravi - English (India) | |
en-US | Microsoft David - English (United States) Microsoft Mark - English (United States) Microsoft Zira - English (United States) | Google US English |
es-ES | Microsoft Helena - Spanish (Spain) Microsoft Laura - Spanish (Spain) Microsoft Pablo - Spanish (Spain) | Google español |
es-MX | Microsoft Raul - Spanish (Mexico) Microsoft Sabina - Spanish (Mexico) | |
es-US | Google español de Estados Unidos | |
fi-FI | Microsoft Heidi - Finnish (Finland) | |
fr-CA | Microsoft Caroline - French (Canada) Microsoft Claude - French (Canada) Microsoft Nathalie - French (Canada) | |
fr-CH | Microsoft Guillaume - French (Switzerland) | |
fr-FR | Microsoft Hortense - French (France) Microsoft Julie - French (France) Microsoft Paul - French (France) | Google français |
hi-IN | Microsoft Hemant - Hindi (India) Microsoft Kalpana - Hindi (India) | Google हिन्दी |
hr-HR | Microsoft Matej - Croatian (Croatia) | |
hu-HU | Microsoft Szabolcs - Hungarian (Hungary) | |
id-ID | Microsoft Andika - Indonesian (Indonesia) | Google Bahasa Indonesia |
it-IT | Microsoft Cosimo - Italian (Italy) Microsoft Elsa - Italian (Italy) | Google italiano |
ja-JP | Microsoft Ayumi - Japanese (Japan) Microsoft Haruka - Japanese (Japan) Microsoft Ichiro - Japanese (Japan) Microsoft Sayaka - Japanese (Japan) | Google 日本語 |
ko-KR | Microsoft Heami - Korean (Korean) | Google 한국의 |
ms-MY | Microsoft Rizwan - Malay (Malaysia) | |
nb-NO | Microsoft Jon - Norwegian (Bokmål) | |
nl-BE | Microsoft Bart - Dutch (Belgium) | |
nl-NL | Microsoft Frank - Dutch (Netherlands) | Google Nederlands |
pl-PL | Microsoft Adam - Polish (Poland) Microsoft Paulina - Polish (Poland) | Google polski |
pt-BR | Microsoft Daniel - Portuguese (Brazil) Microsoft Maria - Portuguese (Brazil) | Google português do Brasil |
pt-PT | Microsoft Helia - Portuguese (Portugal) | |
ro-RO | Microsoft Andrei - Romanian (Romania) | |
ru-RU | Microsoft Irina - Russian (Russia) Microsoft Pavel - Russian (Russia) | Google русский |
sk-SK | Microsoft Filip - Slovak (Slovakia) | |
sl-SI | Microsoft Lado - Slovenian (Slovenia) | |
sv-SE | Microsoft Bengt - Swedish | |
ta-IN | Microsoft Valluvar - Tamil (India) | |
th-TH | Microsoft Pattara - Thai (Thailand) | |
vi-VN | Microsoft An - Vietnamese (Vietnam) | |
zh-CN | Microsoft Huihui - Chinese (Simplified, PRC) Microsoft Kangkang - Chinese (Simplified, PRC) Microsoft Yaoyao - Chinese (Simplified, PRC) | Google 普通话(中国大陆) |
zh-HK | Microsoft Danny - Chinese (Traditional, Hong Kong S.A.R.) Microsoft Tracy - Chinese (Traditional, Hong Kong S.A.R.) | Google 粤語(香港) |
zh-TW | Microsoft Hanhan - Chinese (Traditional, Taiwan) Microsoft Yating - Chinese (Traditional, Taiwan) Microsoft Zhiwei - Chinese (Traditional, Taiwan) | Google 國語(臺灣) |
Работает оно в Chromium браузерах (Chrome, Яндекс, Atom)
YouTube
Попробовав несколько таких же расширений, а их в магазине Chrome, штук 5 точно есть, решил написать еще одно, мне показалось, что функционала в них недостаточно и хотелось немного исправить положение дел.
Забегая вперед, хочу сказать, что, одна из ключевых проблем, связанных с озвучиванием субтитров на YouTube, заключается в том, что, технология на данный момент реализована не полностью, и нет возможности задать время произношения текста.
Т.е. можно регулировать скорость произношения (быстро, медленно, нормально), но указать время для указанного текста (12 слов за 2 секунды) через API, пока что нет возможности. Там есть определенный формат SSML, но он еще не поддерживался, когда я его тестировал (лето 2021).
В конце концов, решить проблему кое как удалось, но не очень оптимально.
SpeechSynthesis API
Как все мы знаем, за синтез речи в браузере Chrome отвечает SpeechSynthesis.
В целом, все, достаточно просто, и на этом можно создавать функционал, позволяющий общаться с посетителями презентаций, выставок, сайтов, программ и т.д.
для более точного контроля за синтезатором речи, предусмотрены различные методы, слушатели и параметры. Например, событие "boundary" - Активируется, когда произносимый текст достигает границы слова или предложения.
Один из нюансов, связанных с голосами, таков, что у голосов от Google есть ограничение на время произношения, примерно 1-2 минуты, после чего синтезатор замолкает. Продолжить речь можно через паузу, программно нажать и тут же снять с паузыwindow.speechSynthesis.pause(); window.speechSynthesis.resume();
и речь продолжится. Но если есть очередь воспроизведения... Может быть так только в бесплатном API, платный проверить не доводилось.
У Microsoft таких ограничений нет. Чтобы проверить ограничения на максимальную длину текста и время работы для синтезатора речи, с голосом от Microsoft, как-то почти 2 часа сидел и слушал какой-то рыба-текст, продублированный для увеличения длины... надоело, выключил. Около 100.000 символов и больше 100 минут времени. Теоретически можно сказки или книги на ночь читать.
YouTube API
На Google API присутствует весь функционал, связанный с субтитрами, но он платный. Так что вариантов для бесплатного, остается всего 2: парсить страницу с видеороликом либо "брутфорсить" API плеера на youtube.
варианты
первый вариант с парсингом, выглядит так
и второй, примерно, так
Но, тем не менее, все более-менее доступно и досягаемо.
Получив таким образом url субтитров, и узнав в процессе много нового, о самом плеере и youtube в частности, можно уже построить какой-либо функционал с применением SpeechSynthesis API и YouTube API
Расширение
Так, примерно, и создавалось расширение для браузера, которое я назвал, после нескольких переименований
Translate and Speak Subtitles for YouTube™
иконка Ева из Валл-и
В качестве завершения
Не буду слишком вдаваться в подробности, как там и что, скучные подробности и все такое. Может быть позже.
Тем не менее, выровнять скорость произношения субтитров мне удалось лишь прокрутив все голоса по таймеру, определив скорость произношения 1 буквы. Заполнив ручками таблицу со скоростями, удалось кое как "отгадывать" нужную скорость произношения субтитров, чтобы голос не отставал от видео.
таблица скоростей
Часть API плеера на YouTube
А чтобы не сильно быстро и не сильно медленно, примерное ограничение по скорости, для русской озвучки от 1.1 до 1.6.
Не всегда помогает, бывает, что нужно скорость воспроизведения видео сделать 0.75 или 0.5 чтобы успеть за видео. Особенно в английском, если автор ролика быстро говорит, у них слова короткие, на русском нужно еще быстрее говорить, но выше 2х скорости, слова́ почти не разобрать.
В магазине Translate and Speak Subtitles for YouTube
Итого
Всем спасибо, что прочитали статью.