Pull to refresh

Учим iPod Shuffle G3 говорить по-русски

Reading time5 min
Views8.9K
image
Пока мы ждем что iTunes (Apple) научит новые iPod Shuffle говорить по-русски, почему бы не попробовать самим?

Перед тем как начать

Все что здесь описано не предназначено для замены iTunes, а служит, скорее, дополнением, которое нужно только до тех пор, пока iTunes не научится озвучивать названия по-русски (очень надеюсь что научится).


Техническая сторона вопроса
Функция voiceover, появившаяся в новых iPod (произносит голосом название песни/плейлиста) реализуется, конечно же, не самим iPod-ом, а программой iTunes (именно поэтому для работы с новым iPod нужен iTunes не ниже чем 8.1), которая при синхронизации синтезирует звуковые файлы и закачивает их на iPod. iPod, в свою очередь, их читает (при «удобном» случае).
 
Звуковые файлы, котороые используются для проговаривания находятся в директории Speakable. По мимо всего прочего (системных голосовых сообщений о заряде батареии и т.д.) в ней есть две поддиректории — Tracks и Playlists. В которых находятся озвученные названия плейлистов и треков, в формате wav (raw PCM, 22050 Hz), с довольно странными именами. Как выяснилось, эти имена — идентификаторы песен и плейлистов в базе данных, которая хранится на iPod.
 
Ищем способ читать iPod — libgpod
В поисках места, откуда iPod берет имена файлов с озвучкой, наткнулись на файлы в директории iPod_Control/iTunes, в которых встречаются имена файлов, точнее, если некоторые числовые последовательности из файлов представить в виде шестнадцетиричной строки, то получались имена файлов. Разбираться с форматом БД iTunes не было ни времени, ни желания, поэтому решили поискать готовые решения. Выбор пал на библиотеку libgpod (о ней узнали из зависимостей приложения gtkpod — очень неплохая замена iTunes для линукс — для которого, судя по-всему эта библиотека и была разработана).

Тут возникла сложность — библиотека возвращала ошибку, что-то в духе «не правильный размер записи (11 < 18)». Пришлось смотреть исходники библиотеки.
(К слову, здесь речь идет о библиотеке версии 7.0, существовала, на момент начала разработки, версия 7.2, которая так же не умела читать шафлы третьего поколения.)
На рисунке справа показан соответствующий участок кода. Первое подчеркнутое — смещение, которое в той версии БД, которая в новых iPod, изменилось и стало 8 (это видно если открыть файл hex-редактором, в нашем случае это был GHex). Второе подчеркнутое — изменения котороые сделали (пока искали информацию в сети, нашли что числа стали 32-х битными в новых iPod, так ли это — не проверяли, но на всякий случай сделали :).

Стоит обратить внимание, что т.к. число которое исправляли (смещение) задано жестко, не зависимо от версии БД, то пропатченная таким образом libgpod не будет работать со старыми версиями iPod. Чтобы сделать по-нормальному пришлось бы довольно сильно менять библиотеку, что целью не являлось.

Итак, сумев прочитать БД iPod-а увидели что названия файлов с озвучиванием — это идентификаторы плейлистов и треков. В той же БД, к счастью, есть вся информация и о названиях плейлистов, треках, названиях албомов и исполнителей. Следующий вопрос — как озвучивать, т.е. как самим синтезировать звуковые файлы из русского текста.

Озвучиваем по-русски, festival

Мне удалось найти только одно бесплатное решение для озвучивания, — festival, дистрибутив есть, наверное, во всех дистрибутивах Linux, если нет, — можно скачать исходники с сайта разработчиков (http://www.cstr.ed.ac.uk/projects/festival/). Официальный дистрибутив не поддерживает русский язык, но есть решение, позволяющее озвучивать русский текст. Описание можно найти здесь (http://festlang.berlios.de/docu/doku.php?id=russianru)

Чтобы можно было пользоваться сразу русским языком в festival, нужно добавить команду (set! voice_default 'voice_msu_ru_nsh_clunits) в файл /etc/festival/siteinit.scm.
Festival позволяет получить довольно неплохое качество русского текста, но у него есть одна беда — английский текст получается не очень хорошим… скорее даже совсем не хорошим (это если выбран русский голос).

Примеры озвучивания (wav, порядка 100к каждый):

Собственно, программа

У нас получилась вот такая программа (C, GTK+):



Жмем прочитать iPod, выбираем iPod, получаем список плейлистов и треков. Правая колонка — файл, — имя файла с «озвучкой», для соответствующей позиции
Двойной клик на строке, — воспроизвести файл, который в данный момент соответствует треку/плейлисту.
Выбираем что именно нужно озвучить, жмем озвучить и ждем, довольно долго, внизу прогресс.

У программы еще есть консольный (не интерактивный) интерфейс (смотрим --help и README).

Установка

Итак, нам потребуется:
  1. Собственно программа (здесь)
  2. Пропатченная libgpod (здесь)
  3. версии пакетов GTK+, GStreamer и libgpod для разработчиков (в генту это те же самые пакеты, в дебиане, кажется, они с постфиксом -dev). Поставить любимыми средствами.
Распаковываем libgpod, внутри выполняем
./configure
make
(только если не собираетесь пользоваться gtkpod с более старыми моделями iPod) make install

Распаковывем программу, внутри выполняем
./configure
make
(make install выполнять не нужно, т.к. все равно нет desktop-файла, т.е. в меню ничего не добавится)

Если в предыдущем пункте (про libgpod) не делали make install, то нужно сделать следующее (иначе, можно пропустить до последнего параграфа этой части):

скопировать файл libgpod/src/.libs/libgpod.a в директорию shuffle-vo/src, libgpod — это директория в которой распакованная библиотека libgpod, shuffle-vo — директория с распакованной программой.
Перейти в директорию shuffle-vo/src, выполнить там make clean, затем make, скопировать строку примерно такого вида (она будет последней):

gcc -Wall -g -g -O2 -Wl,--export-dynamic -o shuffle_vo main.o -pthread -L/usr/lib /usr/lib64/libgtk-x11-2.0.so /usr/lib64/libgdk-x11-2.0.so /usr/lib64/libatk-1.0.so /usr/lib64/libpangocairo-1.0.so /usr/lib64/libpangoft2-1.0.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/libpng12.so /usr/lib64/libXrender.so /usr/lib64/libX11.so /usr/lib64/libXau.so /usr/lib64/libXdmcp.so /usr/lib64/libpango-1.0.so /usr/lib64/libfontconfig.so /usr/lib64/libfreetype.so /usr/lib64/libexpat.so /usr/lib/libgpod.so /usr/lib64/libgdk_pixbuf-2.0.so /usr/lib64/libgio-2.0.so /usr/lib64/libgstreamer-0.10.so /usr/lib64/libgobject-2.0.so /usr/lib64/libgmodule-2.0.so /usr/lib64/libgthread-2.0.so -lpthread -lrt /usr/lib64/libxml2.so -ldl -lz -lm /usr/lib64/libglib-2.0.so -pthread

и заменить /usr/lib/libgpod.so в этой строке на libgpod.a, а потом выполнить получившуюся строку

Таким образом, наша программа будет статически связана с нужной библиотекой libgpod, при этом в системе будет библиотека libgpod, которая сможет работать с предыдущими версиями iPod.

Чтобы проверить что связывание статическое можно выполнить следующее — ldd shuffle_vo, в списке не должно быть строки вида
libgpod.so.4 => /usr/lib/libgpod.so.4 (0x00007fe6537f1000)

Читаем README, который с программой, настраиваем соответствующим образом festival.

Что дальше

Качество озвучивания английсих слов в русских текстах оставляет желать лучшего, поэтому будет здорово если кто-нибудь, например, uBot организует сервис по озвучиванию, у uBot, кстати, качество озвучивания русских текстов повыше чем у festival. Ну и ждем когда apple выпустит обновление для iTunes, которое позволит озвучивать русские названия, ждем сильно, т.к. iTunes озвучивает английские тексты очень хорошо, если также будет озвучивать русские будет очень здорово.

Это первый публичный релиз программы, так что, наверняка, в ней полно глюков и ошибок.

По поводу дальнейшего развития программы — смело скачивайте, модифицируйте и выкладывайте. У меня, скорее всего не будет времени для ее развития. Разве что если будет интеграция с uBot.
Данная статья и чать программы написаны пользователем и одним из создателей it-портала thinkit.ru (it_3.0), но у него нет рагистрации на хабре, по этому публикую ее я по его просьбе.
Tags:
Hubs:
+45
Comments31

Articles

Change theme settings