4.8. Синтезирование речи
Синтезировать речь можно просто записы-
вая и воспроизводя ее как любой другой
звук с помощью подпрограмм из главы 4.6,
но обычно действуют иначе. Сначала в ком-
пьютер вводятся все фонемы определенного
языка, затем у пользователя запрашивается
фраза, и наконец, компьютер последователь-
но воспроизводит входящие в нее фонемы.
Этот способ позволяет значительно эконо-
мить память и воспроизводить абсолютно лю-
бые фразы. Вот программа, позволяющая Cпе-
ктруму разговаривать:
10 CLEAR 25343: LET L=3
20 PRINT "Wait please..."
30 FOR A=25344 TO 25433: READ D: POKE A,D: NEXT A
40 FOR A=0 TO 25: POKE 25437,A*L+100
50 CLS: PRINT "Press any key, then say '";CHR$ (A+65);"'":
PAUSE 0
60 RANDOMIZE USR 25344: NEXT A
70 CLS: INPUT "Enter phrase:"; LINE A$: PRINT A$
80 FOR A=1 TO LEN A$
90 IF A$(A)=" " THEN POKE 25433+A,32:NEXT A
100 IF A$(A)>="a" THEN LET A$(A)=CHR$(CODE A$(A)-32)
110 POKE 25433+A,(CODE A$(A)-65)*L+100: NEXT A: POKE 25433+A,0
120 RANDOMIZE USR 25406: GOTO 70
130 DATA 243,33,0,0,17,0,L,6,8,203,38,219,254,203,119,40,
2,203,198,16,244,35,27,122,179,32,236,251,201
140 DATA 243,33,0,0,17,0,L,62,7,6,8,230,239,203,6,48,2,246,
16,211,254,16,244,35,27,79,122,179,121,32,234,251,201
150 DATA 33,90,99,126,183,200,254,32,32,7,6,5,118,16,
253,24,8,50,32,99,229,205,29,99,225,35,24,231
Поясню некоторые строки:
30 - считываются в память программы в ко-
дах;
40...60 - записываются фонемы с микрофо-
на;
70 - ввод фразы;
80...110 - фраза заносится в память в
специальном формате;
120 - вызывается подпрограмма воспроизве-
дения;
130...150 - подпрограммы в кодах.
После запуска программа попросит немно-
го подождать, считывая кодовую часть, за-
тем Вы должны будете последовательно про-
изнести в микрофон 26 фонем. После этого
Вы можете вводить любые фразы и наслаж-
даться их звучанием. При вводе этих фраз
допустимы прописные и строчные латинские
буквы и пробелы. Как будут звучать все ос-
тальные символы, никому неизвестно. Ни в
коем случае не стоит вводить знак "@",
иначе программа просто "зависнет".
Эта программа написана как пример, поэ-
тому не содержит дополнительных сервисных
возможностей (например, изменение отдель-
ной фонемы), но Вы свободно можете их до-
бавить.
Для изменения длительности отдельной
фонемы смените в десятой строке значение
переменной L (в данном случае оно может
быть от 1 до 6).
Если Вам не удалось с первого раза
произнести все фонемы с удовлетворительным
качеством, то можете попытаться еще раз,
остановив программу с помощью клавиши
BREAK и выполнив команду GOTO 40. Когда
фонемы будут записаны, Вы можете сохранить
их на ленте, набрав команду SAVE "name"
CODE 25600,6656*L (число 6656 получилось
путем умножения количества фонем (26) на
256). Лучше всего, если перед этим блоком
будет записана вышеприведенная программа
со следующей строкой:
35 LOAD "name" CODE 25600: GOTO 70
Записать эту программу можно с помощью ко-
манды SAVE "SPEAKER" LINE 10.
К сожалению, 26 фонем - это маловато
даже для английского языка, не говоря уже
про русский. Их количество можно, конечно,
увеличить, но при этом увеличится и объем
занимаемой ими памяти. Тут уж ничего не
сделаешь.
Если Вы хотите, чтобы Ваш ZX-Spectrum
говорил по-русски, то Вы должны подклю-
чить русский шрифт (подробнее см. в [1]) и
увеличить число фонем. А также сменить все
сообщения, выводимые на экран.
Количество русских фонем можно зна-
чительно сократить, если не использовать
мягкие согласные (в компьютерном исполне-
нии их мягкость практически не слышна) и
гласные "Е","Е","Ю" и "Я" (вместо них вво-
дите "Й" и, соответственно, "Э","О","У" и
"А"). Твердый знак также заменяйте буквой
"Й".
И в заключение один совет. Гораздо при-
ятнее слышать нормальную человеческую
речь, чем слова, выговариваемые в соответ-
ствии с правилами грамматики. Поэтому вво-
дите слова как слышите: sinclair - sink-
ler, компьютер - кампйутер.