Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2008, 18:49   #1
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию Склеивание звуков

Помогите, пожалуйста, соединить звуковые файлы в один. Как можно воспроизвести слово "сто", а затем "один" если в memo находится текст "сто один", включая паузу? Помогите, пожалуйста. Заранее благодарю.
varvara16 вне форума Ответить с цитированием
Старый 19.09.2008, 21:02   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

письменный текст не равен произносимому смотри примеры

непроизносимые согласные со[л]нце лес[т]ница

твердые мягкие подЪезд дятел
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.09.2008, 22:35   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от varvara16 Посмотреть сообщение
Помогите, пожалуйста, соединить звуковые файлы в один. Как можно воспроизвести слово "сто", а затем "один" если в memo находится текст "сто один", включая паузу? Помогите, пожалуйста. Заранее благодарю.
Их не надо соединять. Просто нужно воспроизвести первый, выдержать паузу и за ним второй. Узнать что закончился первый можно получив сообщение об этом, либо заранее знать длину сэмпла и по истечении этого времени выдержать паузу и воспроизвести второй. Чтобы не было задержек, лучше сэмплы предварительно загрузить из файлов в память. Информацию о них, т.е. длину, название, или что либо еще, удобно хранить в массиве и обращаться к ним по индексам.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 20.09.2008, 10:45   #4
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

А можете показать как это сделать программно?
varvara16 вне форума Ответить с цитированием
Старый 21.09.2008, 12:47   #5
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

Я вывела звуки следующим образом

Код:
procedure TSpeechS.Button1Click(Sender: TObject);
begin
if pos('1',Tntmemo1.text)>0 then
sndPlaySound('1.WAV', SND_SYNC);
if pos('2',Tntmemo1.text)>0 then
sndPlaySound('2.WAV', SND_SYNC);
end;
Но если я пишу текст "1 2 1", т он читает только "один", а потом "два", но еще раз "один" уже не произносит. Помогите исправить ошибку, пожалуйста. Спасибо.

Последний раз редактировалось varvara16; 21.09.2008 в 12:50.
varvara16 вне форума Ответить с цитированием
Старый 21.09.2008, 15:19   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Функция просматривает текст Мемо и если находит знакомые слова, воспроизводит соответствующие им звуки. Паузу я не делал, т.к. в тех звуках что у меня, она уже есть в самих звуках, и дополнительная не нужна. Добавить паузу не сложно, в коде отмечено место, где ее вставить.
Вложения
Тип файла: rar Speek digits.rar (28.9 Кб, 42 просмотров)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 22.09.2008 в 09:55.
mutabor вне форума Ответить с цитированием
Старый 22.09.2008, 14:48   #7
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

Извините. Вы можете еще раз загрузить файл. Почему-то он у меня не скачивается. Спасибо огромное.
varvara16 вне форума Ответить с цитированием
Старый 22.09.2008, 18:11   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от varvara16 Посмотреть сообщение
Извините. Вы можете еще раз загрузить файл. Почему-то он у меня не скачивается. Спасибо огромное.
http://webfile.ru/2250582
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 27.09.2008, 17:04   #9
varvara16
Пользователь
 
Регистрация: 05.11.2007
Сообщений: 57
По умолчанию

Извините, что опять беспокою. Как можно сделать, чтобы программа произносила любые числа от 1 до 1000. Я взяла процедуру, которая переводит цифры в азербайджанский текст

Код:
function SumNumToFull(Number:real) : widestring;
var
   PartNum, TruncNum, NumTMP, D : longword;
   NumStr : widestring;
   i, R : byte;
   Flag11 : boolean;
   ya,yu,sh,i1,o,ch:widestring;
begin
   D:=1000000000;
   R:=5;
   ya:=#1241;
   yu:=widechar($00FC);
   sh:=#351;
   i1:=#305;
   o:=widechar($00F6);
   ch:=widechar($00E7);
      TruncNum:=Trunc(Number);
   if TruncNum<>0 then
      repeat
         PartNum:=TruncNum div D;
         Dec(R);
         D:=D div 1000;
      until PartNum<>0
   else R:=0;

   FOR i:=R DOWNTO 1 DO
      BEGIN
         Flag11:=False;
// -------------------------------------------------------
         NumTMP:=PartNum div 100; {выделение цифры сотен}
         case NumTMP of
            1: NumStr:=NumStr+'y'+yu+'z ';
            2: NumStr:=NumStr+'iki y'+yu+'z ';
            3: NumStr:=NumStr+yu+ch+' '+yu+'z ';
            4: NumStr:=NumStr+'d'+o+'rd y'+yu+'z ';
            5: NumStr:=NumStr+'be'+sh+' y'+yu+'z ';
            6: NumStr:=NumStr+'alt'+i1+' y'+yu+'z ';
            7: NumStr:=NumStr+'yeddi y'+yu+'z ';
            8: NumStr:=NumStr+'s'+ya+'kkiz y'+yu+'z ';
            9: NumStr:=NumStr+'doqquz y'+yu+'z ';
         end;
// --------------------------------------------------------
         NumTMP:=(PartNum mod 100) div 10; {выделение цифры десятков }
         case NumTMP of
            1:
               begin
                  NumTMP:=PartNum mod 100;
                  case NumTMP of
                     10: NumStr:=NumStr+'on ';
                     11: NumStr:=NumStr+'on bir ';
                     12: NumStr:=NumStr+'on iki ';
                     13: NumStr:=NumStr+'on '+yu+ch+' ';
                     14: NumStr:=NumStr+'on d'+o+'rd ';
                     15: NumStr:=NumStr+'on be'+sh+' ';
                     16: NumStr:=NumStr+'on alt'+i1+' ';
                     17: NumStr:=NumStr+ 'on yeddi ';
                     18: NumStr:=NumStr+'on s'+ya+'kkiz ';
                     19: NumStr:=NumStr+'on doqquz ';
                  end;
                  case i of
                     4: NumStr:=NumStr+'milyard ';
                     3: NumStr:=NumStr+'milyon ';
                     2: NumStr:=NumStr+'min ';
                     1: NumStr:=NumStr;
                  end;
                  Flag11:=True;
               end;
            2: NumStr:=NumStr+'iyirmi ';
            3: NumStr:=NumStr+'otuz ';
            4: NumStr:=NumStr+'q'+i1+'rx ';
            5: NumStr:=NumStr+ya+'lli ';
            6: NumStr:=NumStr+'altm'+i1+sh+' ';
            7: NumStr:=NumStr+'yetmi'+sh+' ';
            8: NumStr:=NumStr+'s'+ya+'ks'+ya+'n ';
            9: NumStr:=NumStr+'doxsan ';
         end;
// --------------------------------------------------------
         NumTMP:=PartNum mod 10; {выделение цифры единиц}
         if not Flag11 then
            begin
               case NumTMP of
                  1: if i=2 then NumStr:=NumStr+''
                     else NumStr:=NumStr+'bir ';
                  2: NumStr:=NumStr+'iki ';
                  3: NumStr:=NumStr+yu+ch+' ';
                  4: NumStr:=NumStr+'d'+o+'rd ';
                  5: NumStr:=NumStr+'be'+sh+' ';
                  6: NumStr:=NumStr+'alt'+i1+' ';
                  7: NumStr:=NumStr+'yeddi ';
                  8: NumStr:=NumStr+'s'+ya+'kkiz ';
                  9: NumStr:=NumStr+'doqquz ';
               end;

               case i of
                  4:
                        NumStr:=NumStr+'milyard ';
                  3:
                        NumStr:=NumStr+'milyon ';
                  2:
                        NumStr:=NumStr+'min ';
               end; {case}
            end; {begin}
// --------------------------------------------------------
            if i>1 then
               begin
                  PartNum:=(TruncNum mod (D*1000)) div D;
                  D:=D div 1000;
               end;
      END; {BEGIN in FOR}


   SumNumToFull:=NumStr;
end; //---SumNumToFull
Можно как-нибудь по-другому перевести цифры в звуки? Если нет, то как можно с помощью этой процедуры перевести строку "1 2 3 55" в "один два три пятьдесят пять". Я ее вывожу следующим образом

Код:
procedure TSpeechS.BitBtn4Click(Sender: TObject);
var i:integer; 
begin
tntmemo2.Clear;
for i:=0 to tntmemo1.Lines.Count-1 do begin
tntmemo2.lines.Add(SumNumToFull(strtoint(Tntmemo1.lines.Strings[i])));
end;
end;
но при этом числа нужно вводить в столбец, т. е. так
1
2
3

Помогите, пожалуйста. Спасибо.
varvara16 вне форума Ответить с цитированием
Старый 28.09.2008, 01:24   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Можно как-нибудь по-другому перевести цифры в звуки?
Есть два способа сделать произношение текста - использовать заранее заготовленные звуки, как в примере к-рый я приводил выше, или использовать голосовой движок (синтезатор речи), тогда ему можно давать любой текст и он его произнесет.

В вашем случае предпочтительней первый вариант. Чтобы программа могла произнести цифры 0-1000, нужно не так много заготовить звуков.
Вариант с движком сложнее, к тому же азербайджанского может и не быть. Да и незачем, программы говорящие время используют в основном первый способ, произношение с ним намного лучше, все таки человеческий голос (в примере, что я давал, я использовал синтезатор речи для записи звуков, но это только для примера, слова должны быть наговорены человеком, запишите сами или попросите кого нибудь, можно еще скачать, но опять же вам же не на русском надо, можно и не найти).

Вам нужно заготовить примерно такой набор звуков (пишу для русского языка, для своего вы уже сами переведите по аналогии):
один - двадцать (первые двадцать цифр, 20 слов)
тридцать - девяносто (десятки, 7 слов)
сто - девятсот (сотни, 9 слов)
тысяча (1 слово)
ноль (1 слово)
Итого: 38 слов, их достаточно чтобы произнести любое число от 0 до 1000.

Можно еще чтобы совсем красиво было, 1 и 2 записать в разных родах: один - одна, два - две и т.д., и записать единицу исчисления - минуты, рубли и т.д. Это уже смотря от назначения программы.

Цитата:
как можно с помощью этой процедуры перевести строку "1 2 3 55" в "один два три пятьдесят пять"
Нужно "парсить" строку, я давал пример, там именно это и делается. Разделитель - пробел. Вместо запуска произношения запускайте вашу функцию преобразования, вот и вся разница.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - СКЛЕИВАНИЕ ФАЙЛОВ Pblog Обсуждение статей 0 07.08.2007 12:41