forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   программа говорящая текст (http://forum.boolean.name/showthread.php?t=7608)

abcdef 09.01.2009 14:19

программа говорящая текст
 
Вложений: 1
Программа говорит голосом франкенштейна :) долго смеялся когда услышал результат..., низкое качество произношения из-за неполного набора звуковых файлов-слогов, которые были взяты из какой-то dos-программы.

Алгоритм: разбираем предложение по имеющимся слогам в звуковых файлах и воспроизводим эти файлы.

__Способы оптимизации алгоритма__
1) Заранее создать массив из элементов Player и подключит к нему воспроизводимые файлы (если не все, то хотя бы текущего слова). Т.о. сократим промежуток между воспроизведением отдельных файлов.
2) Пока играет текущий звуковой файл загружать следующий.

Основная проблема плеера заключается в позднем воспроизведении файла, что связано с внутренней организацией виртуальной машины – это: время инициализации плеера и скорости передачи данных из ресурсов. Например, при тестировании программы на телефоне sony-ericson задержка иногда составляла около 1 сек.
Также в MIDletPascal’е нет метода для определения завершения мелодии. Единственный способ - получение длительности мелодии и приостановка основного потока программы на указанную величину. Здесь также столкнулся с досадной особенностью - телефоны не слишком точно соблюдают время усыпления потока. И в завершение ко всему метод getDuration(), который получает полное время звукового файла не сработал у меня на motorole E398.
Пришлось открывать звуковые файлы и брать из заголовков wav-файлов длительность воспроизведения.

__Рекомендации к улучшению программы__
Улучшить произношение на 30% можно путем создания всех видов слогов встречающихся в русском языке, это число примерно равно количеству согласных букв в комбинации с гласными, т.е. гласные*согласные, а общее кол-во гласные*согласные + одиночные_буквы.
Таким образом, получаем: 10 гласных звуков, 21 согласных звуков
не обозначающие звуки 2, т.е. твердые, мягкие, тогда 3-й вида произношения
10*21*3+33 = 663
10*21+33 = 243 (без учета твердых и мягких звуков)

Для более-менее сносной программы требуется создать ~250 файлов звука, сделать их максимально чистыми и короткими, чтобы текст говорился внятно и быстро, но разборчиво.

__Расчет размера получаемой программы__
Средний размер файла со звуком = 2400 bytes, т.о. общий размер данных = 250*2400 = 600000 bytes = 586 Kb
процент сжатия =~25% (150000 bytes)
общий объем = 600000-150000=450000 bytes = 440 Kb.
Итоговый размер программы не менее 450 Kb, слабые телефоны работать с такими файлами не смогут. Выделенная под java-машину память ограничена, например в motorola (c380, c650, e390, v3, и т.д.) имеет размер 800 KB.
Т.о. для работы программы остается: 800-450-150(мусор в памяти) =~200 КB
___
arT (c) 2006. e-mail: [email protected]

impersonalis 09.01.2009 14:25

Ответ: программа говорящая текст
 
это оно http://forum.boolean.name/showthread.php?t=5612 ?

abcdef 09.01.2009 15:47

Ответ: программа говорящая текст
 
Я использовал простой движек без каких-либо дополнительных библиотек, достаточно чтобы телефон мог воспроизводить звуковые файлы в формате wav (ну или какие вы сделаете), и поддерживал загрузку программ размером 450кб.

Если раздобыть профессионально сделанные файлы слогов, и оптимизировать как писал выше, то можно применить в качестве читалки книг с интернета...

impersonalis 09.01.2009 15:54

Ответ: программа говорящая текст
 
хватило бы и просто читалки, имхо. ну или возможность офф-лайн режима

abcdef 09.01.2009 17:55

Ответ: программа говорящая текст
 
можно будет сделать,... если кто-нить найдет все слоги русского языка, в формате WAV PCM 8 кГц, 8 bit mono, студийного качества, без шумов,
и общий размер файлов укладывался в расчеты.

p.s. этот проект пылился уже пару лет, желания и времени искать звуки для профессиональной программы - нету, потому что везде у нас халява, и заработать на ней врятли получится

Serg153 10.01.2009 14:36

Ответ: программа говорящая текст
 
ммм... я могу с помощью "Говорилки" создать звуковые файлы...
но останется "глюк" подгрузки слоговых файлов...
--
а может возможно создание вав файла на лету? типа один процесс анализирует слова - создаёт буфер нескольких слов и формирует вав - а другой процесс исполняет подготовленный файл.. возможно ли такое?

ViNT 10.01.2009 15:37

Ответ: программа говорящая текст
 
Теоретически, зная структуру WAV-файла и имея доступ к ФС такое можно реализовать, но, думаю, производительность все равно будет низкой.

abcdef 10.01.2009 19:30

Ответ: программа говорящая текст
 
Вложений: 1
Serg153, об этом как-то думал, но реализовывать не пробовал.
идея заинтересовала и поэтому решил щас написать либу для воспроизведения звука из строки, т.е. загружаем из ресурсов звуковой файл midi,wav и т.д. в строку и передаем её модифицированному плееру

Можно подготавливать блоки данных в единый массив, создать для этого массива общий заголовок с воспроизводить плеером...
Для нормальной работы лучше создать специализированную библиотеку с байтовыми массивами, в которые подгружать wav'ы текущего слова, т.к. на все звуковые файлы все равно не хватит места в памяти...

Некоторые загвоздки:
1. байты в строку долго подгружается если файл больше 10 кб
2. строка не может быть слишком большой (более 50 кб), иначе может повиснуть java-машина
3. setplayercount не работат (воспроизведение только 1 раз)
4. Т.к. getduration() использует тип Long, то такая библиотека отказыватся подключаться к MIDletPascal, поэтому пришлось исключить это метод
5. размер WAV берется из заголовка загружаемого файла, иначе если readByte=0, то это считается как завершение файла с ресурсами, а нулевых байтов хватает...
__
В архиве исходники и тестовый пример

Piligrim 10.01.2009 23:26

Ответ: программа говорящая текст
 
а если так (int)getduration();

ViNT 11.01.2009 00:27

Ответ: программа говорящая текст
 
Цитата:

Сообщение от pilgrim (Сообщение 94383)
а если так (int)getduration();

Если я не ошибаюсь, использование return (int)p.getDuration()
приводит к ошибке. У меня получилось только так:
PHP код:

public static int get_duration()
{
 
int len;
 
len=(int)P.p.getDuration();
 return 
len;



abcdef 11.01.2009 09:09

Ответ: программа говорящая текст
 
спасибо за советы! попробую, думаю ошибка загрузки из-за того что MIDletPascal не корректно разбирает элементы, которые занимают по две позиции в константном пуле, т.е. Long и Double...

касательно библиотеки то ее будет удобно использовать для загрузки из интернета и сохранения в RMS коротких midi-файлов, типа настройки программы на ходу

Serg153 12.01.2009 02:51

Ответ: программа говорящая текст
 
вот нарыл статью в инете - говорящая Java - там приведён пример на джаве.... глянтье - может что полезное там?

http://www.emanual.ru/download/www.eManual.ru_268.html

ViNT 12.01.2009 13:42

Ответ: программа говорящая текст
 
Цитата:

Сообщение от Serg153 (Сообщение 94544)
вот нарыл статью в инете - говорящая Java - там приведён пример на джаве.... глянтье - может что полезное там?

http://www.emanual.ru/download/www.eManual.ru_268.html

Это java для компов, в мобильной java нет SoundAPI. Хотя, может, удастся найти что-то полезное.

abcdef 12.01.2009 22:05

Ответ: программа говорящая текст
 
Serg153, хорошая ссылка (правда применительно к упрощенной английской речи), какраз рассказывает о некоторых проблемах при создании голосового движка, звуковые файлы формата *.au схожи с форматом *.wav, и занимают примерно одинаковое кол-во места.

основные задачи подобных программ:
1) разбор текста на звуковые частицы
2) придание эмоциональной окраски производимой речи
3) склейка частей звука
----
1) разбор можно производить только при наличии необходимого кол-ва звуковых заготовок
2) пока не рассматривается, т.к. это довольно тяжеловесная задача для сотового телефона
3) можно попробовать склеивать в один большой файл, но это довольно медленно, потому что прийдется перемещать довольно большие байтовые массивы, на месте "склейки" без предварительной обработки возможны щелчки звука, можно попробовать использовать микширование файлов, как в библиотеке для проигрывания нескольких файлов, но опять это будут поддерживать не все телефоны...
____
сделать программу нормальную реально, просто качество звука напрямую зависит от качества звуковых файлов и метода их слияния

Slepetc 27.01.2009 11:05

Ответ: программа говорящая текст
 
Нет ничего приличного на компе или кпк. Для телефона это нормально.


Часовой пояс GMT +4, время: 14:36.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot