Технический форум по робототехнике.
contr » 17 май 2009, 15:39
А можно через комп записать на флешку все что нужно и потом только читать с неё?
Можно, так и сделано, правда когда я свой звонок/манок делал I2C EEPROM были самым доступным носителем.
yakuzaa » 19 авг 2009, 16:05
кароче надыбал я звуковой фрамент со всеми гласными и согласными буквами, а также всеми вариантами слогов (ба,бя,би, ва,вя,ви... и.т.д).
Вопрос - как сделать счканирование строки, чтобы к, примеру, прога выделяла из нее слоги (к примеру, ра+ди+о+ко+т) и брала соотв. звуковые фрагменты. Как-то пока я себе этот алгоритм не совсем представляю...
Думмаю пока сделаьть так: SD карта, разбить фрагмент на файлы, записать на карту, avr-dos ит.д; ну или если на сях, то есть уже отлаженная связка SD-карта + FatFs + vs1053... Если хто хочет помучаться вместе со мной - выложу тут аудио-файлик и кой какие исходники для работы с картой...
Digit » 19 авг 2009, 16:13
не могу говорить с уверенностью, но вроде бы подобный алгоритм я встречал на сайте
http://algolist.ru/. Там то ли семантический разбор текста, то ли еще что-то этом духе...
Duhas » 19 авг 2009, 17:10
да, искать нада по семантике работы разные.. народ этим занимается..
а данные которые есть выкладывай, они тут не помешают..
Snable » 19 авг 2009, 17:51
Хм... Семантика... Там простой алгоритм...
- Код: Выделить всё • Развернуть
#include <stdio.h>
#include <string.h>
#define GLASNAYA 1
#define SOGLASNAYA 2
#define NEPONYATNO 3
//const char gl[] = "уеыаоэяиюё"; //10 букв
//const char sogl[] = "йцкнгшщзхфвпрлджчсмтб"; //21 буква
// ъ и ь тоже можно добавить... в гласные, наверное...
const char gl[] = "eyuioa"; //6
const char sogl[] = "qwrtpsdfghjklzxcvbnm"; //20
int f(char w)
{
int i;
for (i = 1; i<=6; i++)
if (w==gl[i]) return GLASNAYA;
for (i = 1; i<=20; i++)
if (w==sogl[i]) return SOGLASNAYA;
return NEPONYATNO;
}
void process_word(char *w)
{
printf("%s : \n", (char*)w);
int i;
int l = strlen(w);
for (i = 0; i<l; i++)
{
if (f(w[i])==SOGLASNAYA)
{
if (i+1>=l)
{
printf("%c ",w[i]);
continue;
}
if (f(w[i+1])==GLASNAYA)
{
printf("%c%c ",w[i],w[i+1]);
i++;
continue;
} else // SOGLASNAYA
{
printf("%c ", w[i]);
continue;
}
}
if (f(w[i])==GLASNAYA) printf("%c ",w[i]);
}
printf("\n");
}
int main(int argc, char** argv)
{
int i;
for (i = 0; i<argc; ++i) process_word(argv[i]);
return 0;
}
Звиняйте за корявый Си, если он корявый... Обычно на Си++ пишу...
Кстати, нет другого способа сделать это - "printf("%c ",w[i]);"?Теперь осталось только вместо вывода на экран звуки издавать.
Чтобы воспользоваться прогой её надо компильнуть и в строке запуска написать что ты хочешь разложить после имени проги. То есть так:
- Вложения
-
- Изучая фишки gcc...
boez » 19 авг 2009, 23:39
Предлагаю представить себе красивое произнесение таким девайсом к примеру слова "вскрикнул"
В общем в слитной речи не все так просто со слогами...
Strijar » 20 авг 2009, 00:08
Предлагаю представить себе красивое произнесение таким девайсом к примеру слова "вскрикнул"
Ну можно и не по слогам, а имено парами "звуков". Я когда то так и хотел делать. вс-кр-ик-ну-л - пары микшировать между собой кросс-фэйдом. А можно даже так вс-ск-кр-ри-ик-кн-ну-ул лучше получится.
Snable » 20 авг 2009, 00:25
yakuzaa писал(а):Вопрос - как сделать счканирование строки, чтобы к, примеру, прога выделяла из нее слоги (к примеру, ра+ди+о+ко+т) и брала соотв. звуковые фрагменты. Как-то пока я себе этот алгоритм не совсем представляю...
Собственно прога - ответ на этот вопрос.
А если про качество говорить... То да - это далеко не лучший выход. Самый лучший, ИМХО (и только ИМХО), - полный цикл синтеза звука.
Более реальный - синтез по фонемам. Там нужно предварительно раскладывать слова на фонемы и потом уже запускать файлы со записями звучания этих фонем. Суда можно прикрутить простейшую обработку.
А по слогам - самый простой. На мой взгляд с него лучше всего начинать. А потом двигаться дальше... Чтобы через пару лет запустить и сразу вырубить с гримасой отвращения на лице
yakuzaa » 20 авг 2009, 12:51
Спасибо,
Snable!
перенес прогу на авр-ку в CVAVR - все пашет гууд, только циклы надо от нуля делать, массивы гласных и согласных все-таки нулевые элементы содержат...
- Код: Выделить всё • Развернуть
const char gl[] = "eyuioa#"; //6
const char sogl[] = "qwrtpsdfghjklzxcvbnm"; //20
int f(char w)
{
int i;
for (i = 0; i<=6; i++)
if (w==gl[i]) return GLASNAYA;
for (i = 0; i<=19; i++)
if (w==sogl[i]) return SOGLASNAYA;
return NEPONYATNO;
}
юзаю функцию
process_word(char *w);мягкий знак у меня пока обозначается решеткой.
- Код: Выделить всё • Развернуть
strcpyf(fname, "sireneven#kij parovozik");
process_word(fname);
как отделить слова друг от друга пока не знаю, признак пробела как-то надо замутить...
- Вложения
-
- VOICE.rar
- Набор гласных, согласных и парных звуков: 8 bit, PCM (Unsigned) 11 025 Hz
- (321.36 КиБ) Скачиваний: 48
Последний раз редактировалось
yakuzaa 24 авг 2009, 10:36, всего редактировалось 1 раз.
Snable » 20 авг 2009, 18:30
только циклы надо от нуля делать
Это то да... Просто я потом русскому его пытался научить в кодировке UTF-8... А там это весьма весело... Кстати, тогда, наверное, вместо "<=" надо "<" ставить в условиях продолжения.
как отделить слова друг от друга
Вместо пробела ничего не воспроизводить некоторое время будет достаточно. Тоже самое вместо знаков и припинания и так далее... Для этого введена константа NEPONYATNO.
И, я думаю, лучше каким-то образом наладить работу с русскими буквами. Если кодировка однобайтная (типа cp1251), то особых проблем возникнуть не должно... Хотя тут я могу ошибаться. Думаю, кто-нибудь подскажет )))
Snable » 24 авг 2009, 18:34
Кстати, тем, кому интересна теория синтеза и анализа речи -
есть ссылочка.
Тут кладезь знаний
А для меня - источник геморроя - еще минимум 2 года придется грызть
Strijar » 24 авг 2009, 19:32
leonidy-85 » 18 май 2010, 20:59
Kozinaka » 18 июн 2010, 13:35
Торренты прикрыли. А что было по ссылке?
galex1981 » 18 июн 2010, 13:55
h t t p : / / r u t r a c k e r . o r g / / f o r u m / v i e w t o p i c . p h p ? t = 1 5 5 7 6 5 5
Подборка книг по ИИ