Speech API у Delphi (частина 1)
Декілька слів від укладача
Вивчивши статті Denis Butorin, ми дійшли висновку, що в них йдеться про Microsoft Speech API 4. В силу цього, якщо ви вирішите використовувати наведені в статті приклади, будьте уважні до того, яка версія Microsoft SAPI встановлена на вашому комп'ютері.
Проста програма, що використовує Speech API
Сподіваюся, що ви вже встановили Microsoft Speech API (SAPI) і хоча б один мовний двигун (text-to-speech engine). Якщо ні – то все можна завантажити тут.
"Мовні (голосові) движки" - це ті модулі, які синтезують мову. Для доступу до них потрібно використовувати спеціальні функції, описані в наборі функцій Speech API. Тому для того, щоб написати мінімальну програму, яка вміє говорити, потрібні ці два компоненти. Спочатку ми спробуємо написати цю програму-мінімум, а потім змусимо персонаж MS Agent заговорити. Тобто постараємося поєднати технологію MSAgent та SpeechAPI. Тоді агент стане ще приємнішим.
Ну, а для того, щоб усім цим зайнятися, нам знадобиться корисний модуль, в якому оголошено необхідні константи, типи, функції та інтерфейси. Не забудьте підключити його у розділі uses головного модуля програми.
Оголосимо в секції private необхідні для роботи змінні:
У ході створення головної форми програми нам потрібно перевірити встановлені в системі двигуни і помістити їх назви в ComboBox. Це ми й зробимо:
У цьому коді відбувається створення екземплярів COM об'єктів класу CLSID_MMAudioDest та CLSID_TTSEnumerator . Для цього використовується метод CoCreateInstance з бібліотеки COM. Він створює екземпляр об'єкта виходячи з потрібного класу CLSID(Class Identifier) та ідентифікатора інтерфейсу IID(Interface Identifier). У першому випадку ми утворимо об'єкт длязв'язку з аудіо пристроєм, у другому - створюємо екземпляр TTS, класу, що перераховується, для перебору всіх мовних синтезаторів, встановлених в системі. Після цього екземпляри класів виявляться відповідно до fIAMM та aTTSEnum. Після цього починаємо перебирати двигуни, впізнавати їх імена та додавати до ComboBox. До речі, не забудьте оголосити в розділі uses модуль activex.pas, інакше Delphi лаятиметься щодо процедури CoCreateInstance, і модуль ComObj.pas, інакше після виконання процедури CoCreateInstance змінна aTTSEnum залишатиметься рівною nil, а значить програма обвалюватиметься на наступному рядку.
Тепер, якщо ви запустите програму, то в списку ComboBox'а побачите назви всіх двигунів, встановлених у вас в системі. Поки що наша програма не вміє говорити, але вже знає необхідну інформацію про мовні пристрої.
Тепер займемося завантаженням мовних синтезаторів для читання тексту. Тому пропишемо подію зміни двигуна в ComboBox:
Ну і все тепер слід сказати, що "механізм читання" приводиться в дію наступним чином:
Для повного щастя не вистачає припинення читання, тобто паузи, та повної зупинки. Так ось здійснити це можна за допомогою наступних методів:
Інші процедури на кнопочки читання, паузи і стоп, думаю, ви самі нафантазує, а щоб отримати повний вихідний текст проекту скористайтеся цим посиланням (близько 226Кб)