Система управління розпізнаванням мовної інформації

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
МІНІСТЕРСТВО ОСВІТИ
Південний федеральний університет
ТЕХНОЛОГІЧНИЙ ІНСТИТУТ
ЮНОГО ФЕДЕРАЛЬНОГО УНІВЕРСИТЕТУ У м. Таганрог
Факультет АВТОМАТИКИ І ОБЧИСЛЮВАЛЬНОЇ ТЕХНІКИ
Кафедра СИСТЕМ АВТОМАТИЧНОГО УПРАВЛІННЯ
До захисту допустити:.
Зав. кафедрою ___ д.т.н., проф. Фінал В. І.
«» 2008 р.
ПОЯСНЮВАЛЬНА ЗАПИСКА
До ВИПУСКНИЙ КВАЛІФІКАЦІЙНОЇ РОБОТІ
На академічну ступінь бакалавр техніки і технології
на тему:
СИСТЕМА УПРАВЛІННЯ розпізнавання мовних ІНФОРМАЦІЇ
Керівник роботи
д.т.н., проф.В.І.Фінаев
Студент гр. А-14 Келускар Пунам наря
(Прізвище, ім'я, по батькові, група)
«____»_______________________ 2008р.
Таганрог 2008

УДК 621.395
АНОТАЦІЯ
Проект містить 83 сторінки машинописного тексту, 12 малюнків, 4 таблиць, 13 джерел літератури.
Ця робота присвячена перетворенню усного мовлення в електронний текст. У ній розглядаються основні методи автоматичного розпізнавання мовної інформації. У цій роботі також розроблені та реалізовані алгоритм, модель та інформаційне забезпечення для розпізнавання ізольованих слів. Користувальницький інтерфейс виконаний в середовищі visual C #. Net, а програмна реалізація - в пакеті Matlab.

UDK 621.395
SUMMARY
This project contains 83 pages of text, 12 diagrams, 4 tables and 13 literature sources.
This bachelor's project is dedicated to problem of automatic speech recognition. Described basic speech recognition methods such as HMM (Hidden Markov Model) and neural network method. To solve this real-world problem algorithm was developed using Matlab and was further implemented in visual C #. Net.

УДК 621.395
РЕФЕРАТ
ПРИХОВАТИ МОДЕЛЬ МАРКОВА, УПРАВЛІННЯ МОВЛЕННЄВОЇ ІНФОРМАЦІЄЮ
У випускній роботі розроблена система автоматичного розпізнавання мовної інформації. Так само була розроблена програма, написана для системи MATLAB, що розпізнає мовну інформацію і будує графіки вхідних і вихідних величин. За допомогою цієї програми був досліджено алгоритм розпізнавання мови.
Вирішені завдання економічної доцільності проекту.
Вирішені завдання забезпечення безпеки праці інженера-проектувальника.

Зміст
ВСТУП. 9
АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ .. 15
1.1 Розпізнавання слів в злитої мови. 15
1.2 Розпізнавання ізольованих слів. 16
1.3 Проблема автоматичного розпізнавання мови. 17
1.4 Структурна схема пристрою виділення ознак мовних сигналів. 22
1.5 Розробка структурної схеми пристрою визначення кількості звуків в ізольованому слові мови. 30
2. ОГЛЯД ІСНУЮЧИХ СИСТЕМ УПРАВЛІННЯ розпізнавання мовних ІНФОРМАЦІЇ І МЕТОДІВ РІШЕННЯ .. 34
3 МОДЕЛЮВАННЯ РОБОТИ БЛОКУ ВИДІЛЕННЯ ПОЧАТКУ І ЗАКІНЧЕННЯ СЛОВА, КІЛЬКОСТІ ЗВУКІВ НА ЕОМ .. 42
5. РОЗРОБКА ІНФОРМАЦІЙНОГО ЗАБЕЗПЕЧЕННЯ .. 48
5.1 Структурно-алгоритмічна організація. 48
5.2 Алгоритм програми .. 49
5.3 Опис інтерфейсу. 51
5.4 Реалізація. 52
5.4.1 Модуль входу у програму. 52
5.4.2 Основний графічний модуль. 53
5.4.3 Модуль вибору режиму роботи .. 53
5.4.4 Модуль введення мовного сигналу. 53
5.4.5 Модуль створення БД еталонів. 53
5.4.5 Модулі аналізу звукового сигналу і розпізнавання мови. 54
5.5 Приклад роботи програми .. 54
6 БЕЗПЕКА І ЕКОЛОГІЧНІСТЬ ПРОЕКТУ .. 57
6.1 Системний аналіз безпеки і надійності блоку виділення початку і закінчення слова, кількості звуків при експлуатації. 57
6.2 Заходи щодо підвищення надійності та безпеки блоку. 58
6.3 Безпека блоку для природного середовища .. 59
7.ТЕХНІКО-ЕКОНОМІЧНЕ ОБГРУНТУВАННЯ Проекти .. 60
7.1 Розрахунок заробітної плати розробників. 60
ВИСНОВОК. 62
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ .. 63
Додаток. 65

ВСТУП
В даний час наукове співтовариство вкладає гігантську кількість грошей у розвиток ноу-хау та науково-дослідні розробки для вирішення проблем автоматичного розпізнавання і розуміння мови. Це стимулюється практичними вимогами, пов'язаними зі створенням системи військового і комерційного призначення. Не торкаючись першого з них, можна вказати, що тільки в європейському співтоваристві обсяг продажів систем цивільного призначення становить кілька мільярдів доларів. При цьому слід звернути увагу на те, що в практичному використанні відсутні системи, котрі за незрозумілих причин вершиною розвитку систем автоматичного розпізнавання мови. Це системи, які можна назвати демонстраційними і які 50 років тому називалися «фонетичними друкуючими машинками». Їх метою є переклад мови у відповідний письмовий текст.
Якщо розглядати класичну схему «наука - технології - практичні системи», то, перш за все, треба визначити ті умови, в яких працюватиме практична система автоматичного розпізнавання або розуміння мови. Найбільш серйозні проблеми виникають за умов:
-Довільний, наївний користувач;
-Спонтанне мовлення, супроводжувана аграмматізма і мовним «сміттям»;
-Наявність акустичних перешкод і спотворень, в тому числі мінливих;
-Наявність мовних перешкод.
З іншого боку необхідно визначити важливість завдання, її наукову і прикладну фундаментальність, зв'язок з іншими областями знань. При цьому необхідно враховувати стан науково-промислового потенціалу, його можливості. Ні для кого не секрет, що правильно поставлена ​​задача - це вже половина вирішення.
В даний час в середовищі «мовником» склалося уявлення, що кінцевою і вищою метою є створення саме «фонетичної друкуючої машинки», а універсальним методом вирішення всіх мовних проблем є «приховані Марківські моделі» (ПММ).
Зупинимося на можливостях і недоліках відповідних систем автоматичного розпізнавання мови (анонсуються сьогодні можливістю розпізнавання сотень і навіть тисяч слів з надійністю до 98%).
Від користувача потрібно попереднє налаштування системи на його голос від декількох десятків хвилин до декількох годин попереднього наговаріванія текстів.
Бо слова, включені навіть в добре і акуратно вимовний текст, виявляються як би плаваючими в океані омонімії, то кількість помилок (словесних) зростає приблизно в 5 разів. Побіжне відстежування таких помилок, крім випадків виникнення безглуздих текстів, вже скрутно. Апарат корекції помилок в більшості демонстраційних систем слабо налагоджений.
Були згадки, що навіть для добре організованих спонтанно виголошених текстів ймовірність правильного розпізнавання слів не перевищує однієї третини.
Нарешті, час обробки введеного відрізка мови в таких системах може займати хвилини.
Все сказане говорить про те, що в якості кінцевої мети пропоновані демонстраційні системи «мова-текст» навряд чи становлять інтерес. Це не виключає можливості використання їх як полігон для оцінки наукових ідей, але в цьому випадку повинні чітко викладатися ті моделі, які закладаються в дані системи автоматичного розпізнавання і яким чином повинна перевірятися їхня практична перспективність. Таким чином, ми переходимо на протилежний кінець тріади «практичні системи - мовні технології - мовна наука».
Метою даної бакалаврської роботи є розпізнавання мовної інформації за допомогою систем управління, що використовують системи автоматичного розпізнавання мовних команд на основі прихованих Марковських моделей (СММ) на комп'ютері. При фіксованій на сьогоднішній день апаратної базі подібних систем розпізнавання і враховуючи тенденції її розвитку в найближчому майбутньому, розглядається один з найбільш важливих блоків таких систем - блок навчання ПММ тренувальними послідовностями. Від успішного вирішення ним завдання навчання Марковської моделі прямо залежить якість роботи системи розпізнавання. У задачі навчання ПММ на даний момент є дві серйозні проблеми: стандартні методи її вирішення (метод Баума-Велча або ЕМ-процедура) є методами локальної оптимізації, (тобто, не здатні вийти за межі локальних екстремумів функції) і сильно залежні від стартових параметрів .
У пошуках вирішення даної задачі в роботі проводиться розробка програмного забезпечення для систем розпізнавання мовних команд.
Для досягнення поставленої мети в роботі вирішені такі основні завдання:
• Досліджено алгоритми навчання ПММ тренувальними послідовностями.
• Розроблено методи, спрямовані на подальше підвищення ефективності і якості роботи даного алгоритму в контексті розглянутої задачі.
В даний час роботи по розпізнаванню мови не тільки не втратили актуальності, а й розвиваються широким фронтом, знаходячи для себе безліч областей для практичного застосування. Зараз можна виділити 4 порівняно ізольованих напрямки в області розвитку мовних технологій:
1. Розпізнавання мови - тобто перетворення мовного акустичного сигналу в ланцюжок символів, слів. Ці системи можуть бути охарактеризовані за низкою параметрів. Перш за все це обсяг словника: малі обсяги до 20 слів, великі - тисячі і десятки тисяч. Кількість дикторів: від одного до довільного. Стиль проголошення: від ізольованих команд до злитої мови і від читання до спонтанної мови. Коефіцієнт розгалуження, тобто величина, що визначає кількість гіпотез на кожному кроці розпізнавання: від малих величин (<10 ÷ 15) до великих (> 100 ÷ 200). Відношення сигнал / шум від великих (> 30 дБ) до низьких (<10 дБ). Якість каналів зв'язку: від високоякісного мікрофона до телефонного каналу. Якість роботи систем розпізнавання мови зазвичай характеризується надійністю розпізнавання слів, або, що те ж саме, відсотком помилок.
2. Визначення індивідуальності мовця. Ці системи діляться на два класи: верифікація мовця (тобто підтвердження його особи) та ідентифікація мовця (тобто визначення його особистості з заздалегідь обмеженого числа людей). Обидва ці класу далі можуть бути розділені на тексто-залежні і тексто-незалежні. Наступний характеристичний параметр - обсяг парольної фрази. Два інших (як і в розпізнаванні мови): відношення сигнал / шум і якість каналу зв'язку. Якість роботи систем верифікації / ідентифікації мовця характеризується двома величинами: ймовірністю не впізнання «свого» диктора і ймовірністю прийняття «чужого» диктора за свого.
3. Синтез мови. Практично існує два класи:
1) Відтворення записаного в тій чи іншій формі обмеженого числа повідомлень;
2) Синтез мови по тексту. Синтезатори характеризуються за наступними параметрами: розбірливість (словесна чи слоговая), природність звучання, завадостійкість.
4. Компресія мови. Основний (і єдиний) класифікаційна ознака цих систем, це ступінь компресії: від низької (32-16 кбіт / сек) до високої (1200-2400 кбіт / сек і нижче). Якість роботи систем компресії мови характеризується, перш за все, розбірливістю компрессированном мови. Додатковими характеристиками дуже важливими в ряді додатків є впізнаваність голосу мовця і можливість визначення стресового рівня мовця.
У даній роботі розглядаються системи першої групи - системи розпізнавання мови і їх окремий випадок - системи розпізнавання мовних команд, тобто розпізнавання ізольованих слів, а не злитої мови. Такі системи дуже корисні на практиці, і зросла необхідність у них пов'язана в першу чергу з появою великої кількості доступних людині різноманітних пристроїв (персональні, мобільні та кишенькові комп'ютери, комунікатори й мобільні телефони, ігрові і багатофункціональні мультимедійні пристрої з достатньою обчислювальною потужністю) у поєднанні з бурхливим розвитком телекомунікацій в сучасному світі. Зростає важливість масового впровадження нових інтерфейсів взаємодії людини з технічними системами, оскільки традиційні інтерфейси багато в чому вже досягли своєї досконалості, а разом з ним і своїх меж. При традиційно високої значимості інформації, що надходить до нас через органи зору, і її високу частку серед всієї сенсорної інформації, що вважається рівною близько 85%, цей канал сприйняття людини стає в значній мірі перевантажений, і першочерговим альтернативою тут бачиться комунікація саме по акустичному каналу. Крім того, системи розпізнавання (а також синтезу) мови також вкрай важливі для людей з обмеженим зором, і ця ніша для їх застосування активно розвивається, перш за все, в області мобільної телефонії, а також у побутовій техніці (для керування різноманітними домашніми пристроями). Для допомоги таким людям виробники вводять у свої пристрої можливості управління за допомогою голосових команд, а також дублювання екранної інформації голосом. І в першу чергу від таких продуктів потрібно розпізнавання обмеженого набору команд користувача, а не злитого мовлення з більшим чи необмеженим словником. Завдяки стандартизації платформ і операційних систем телефонів розширюється коло сторонніх розробників програмних продуктів з даною функціональністю.
Апаратна база таких систем також може бути дуже різноманітною і надавати помітний вплив на підсумкову ефективність системи розпізнавання в цілому. Апаратна частина систем розпізнавання вже не є найвужчим місцем і здатна виконувати якісну оцифровку мовного сигналу з необхідними параметрами, а також забезпечує необхідні обчислювальні потужності для реалізації необхідних алгоритмів передобробки і роботи з моделями слів.

1. АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

Традиційна модель автоматичного розпізнавання мови (АРР) припускає, що шляхом відстеження акустичних параметрів і застосування одного із засобів пошуку по набору еталонів фонематических сегментів можна встановити фонематичні ряди. Потім ці ряди можуть бути застосовані для проведення лінгвістичного аналізу на більш високому ярусі виділення слів, фраз і сенсу висловів. Успішне розуміння виголошених речень (фраз) включає вживання тієї чи іншої лінгвістичної структури в поєднанні з найбільш достовірною звуковою інформацією.
При автоматичному розпізнаванні мови великі труднощі представляють собою процеси виявлення та ідентифікації деяких груп фонем.

1.1 Розпізнавання слів в злитого мовлення

Для розпізнавання слів в злитого мовлення апробовані два різні підходи. У першому випадку при глобальному підході слово, яке потрібно розпізнати, порівнюється з кожним словом словника. При порівнянні використовується, як правило, спектральне представлення кожного слова. Серед різних методів даного типу хороші результати дав метод динамічного програмування.
У другому випадку при аналітичному підході кожне слово чи група слів спочатку сегментується на менші одиниці. Сегментами є слогоподобние або фонемоподобние одиниці. Це дозволяє проводити розпізнавання або на складовому, або на фонемної рівні і одночасно зберігати в пам'яті параметри (тривалість, енергію тощо), пов'язані з просодії і корисні в подальшому. Сегментація може бути заснована на знаходженні голосних висловлювання, які часто розташовуються близько максимуму інтегративної енергії спектру. При такому підході першим критерієм сегментації є зміна енергії в часі. Деякі приголосні, наприклад m, n, l, іноді мають такою ж енергією, як і голосні. Тому необхідне уведення додаткових параметрів для з'ясування наявності голосного звуку в кожному раніше певному сегменті.
Для ідентифікації приголосних, як правило, проводиться поділ вибухових і невибухових приголосних. Це досягається шляхом виявлення паузи (змички), відповідної змиканню перед реалізацією вибуху. Завдання ускладнюється для позиції початку висловлювання, де порівняно просто визначається смичка тільки для дзвінких вибухових приголосних. Після виявлення змички визначаються зміна спектру і вид зміни. Для встановлення кожної категорії звуків зазвичай користуються впорядкованими правилами, заснованими на інформації, яка залежить від акустичного і фонетичного контекстів. У злитого мовлення фонетична реалізація якогось конкретного висловлювання залежить від декількох факторів, включаючи діалект, швидкість виголошення промови, манеру проголошення диктора та інші.

1.2 Розпізнавання ізольованих слів

Основні ознаки розпізнавання ізольованих слів - ієрархічна багатоярусна структура і контроль кожного ярусу за допомогою відповідних граматик, чиї символи є розпливчастими лінгвістичними змінними величинами.
Стратегія розпізнавання базується на угрупованню одиниць мовлення в широкі фонетичні класи, за яким слідує класифікація на більш детальні групи.
При розпізнаванні злитого мовлення виникають труднощі: розпізнавання злитого мовлення набагато складніше розпізнавання окремо вимовлених слів, перш за все, внаслідок неявних кордонів між словами. В результаті важко визначити початок і кінець відповідності між фонемної ланцюжком слова зі словника і розпізнається фонемної ланцюжком. Система акустико-фонетичного аналізу злитої промови зазвичай розглядається як частина загальної системи з автоматичного її розпізнавання.
Попередня сегментація і класифікація звукових елементів включає визначення гласноподобних, фрікатівноподобних звуків, вибухових приголосних, пауз. Завдання сегментації, розглянута як задача розподілу мовного потоку на функціонально значущі відрізки, вирішується по-різному. При розробці систем розпізнавання мови враховується важливість першого ступеня обробки акустичного сигналу, що пов'язано з роботою акустичного процесора. Процес автоматичної сегментації безперервно пов'язаний з маркуванням звуковий послідовності. Розробка автоматичної сегментації та маркування викликана необхідністю залучення великої акустико-фонетичної бази даних і прагненням до об'єктивізації мовного аналізу.

1.2 Проблема автоматичного розпізнавання мови

Проблема АРР може бути вирішена поетапно. На першому етапі завдання розпізнавання полягає в зовнішньому посвідченні внутрішньо виявлених і тільки поверхово охарактеризованих класів акустичних подій. Для другого етапу вирішальне значення має узагальнення зовнішніх критеріїв класифікації внутрішньо не виявлених класів, що робить можливим передбачуваність характеристики невідомого сигналу.
При автоматичному розпізнаванні мови, перш за все, слід з'ясувати, чи є сигнал насправді фонетичним (мовним). Відомо поділ мовного потоку на мікро-і макросегменти. Розмежування між двома макросегментамі (фразами синтагмами) носить, як правило, дискретний характер, а між двома мікросегмент (субзвукамі, звуками, складами) - стертий. Звуки змінюють свої супрасегментних (тривалість, інтенсивність, частота основного тону) і сегментні (спектральні) характеристики згідно з впливом одиниць інших ярусів. Наприклад, збільшення тривалості голосною в мовному потоці може вказувати на семантичну виділені слова, положення наголоси щодо цієї гласною, інформацію про попередньої і наступної фонемах і т. д. Отже, для передбачення, наприклад, тривалості звуку, слід враховувати ряд лінгвістичних чинників.
Знання сполучуваності фонем на стиках слів відіграє також не останню роль при сприйнятті мови. Розмежувальні кошти звуковій мові є складне явище, що складається з самих різних компонентів, пов'язаних з фонотактіческімі особливостями, синтактико-семантичними чинниками, ритмікою формування мовного висловлювання.
Слід зупинитися на деяких проблемах сегментації, пов'язаних зі специфікою фонетичного рівня. До числа труднощів може бути віднесено автоматичне розпізнавання назальних і плавних фонем злитої мови. Невизначеності, що виникають із-за обмежень будь-якої системи обробки мови і часто через поганий вимови, розглядаються як джерела інформації для стохастичної граматики чи граматики невизначеного множини.
Наявні в даний час способи микросегментации мови (сегментації на субзвукі, звуки, склади) можна класифікувати наступним чином:
1) використання ступеня стабільності в часі будь-яких акустичних параметрів мовного сигналу, таких як концентрація енергії в частотному спектрі;
2) накладання акустичних міток на мовний сигнал через регулярно повторювані короткі інтервали;
3) порівняння вибірок мовного сигналу в коротких тимчасових вікнах при регулярних інтервалах з вибірками з фонем-прототипів.
Розрізняють контекстно-залежні і контекстно-незалежні методи сегментації. Найпростішим методом контекстно-незалежної маркування є зіставлення еталонів. Для цього необхідно, щоб у пристрої для кожної можливої ​​словникової одиниці зберігалося модель. Контекстно-залежна сегментація допускає зв'язок використовуваного безлічі ознак і порогів з фонетичним контекстом.
Для вирішення проблеми сегментації усної мови велике значення має звернення до стилю. При цьому в сучасній лінгвістиці умовно розмежовуються фонетичний і фонологічний типи складу.
При визначенні, розмежування та визначення складу необхідно використовувати фонологічні критерії. У найбільш загальних термінах склад - це мовної сегмент, що складається з ядра, тобто гласного (або складотворної приголосного) і артикуляторно пов'язаних з ним сусідніх приголосних. Склад дає можливість виходу як на більш низький звуковий, так і на більш високий мовної ярус з використанням інформації фонотактіческіх особливостей формування морфем, слів. Більшість способів сегментації на склади засноване на змінах загальної (сумарної) інтенсивності сигналу, тобто енергії. Оскільки теоретично кожен склад повинен містити тільки один голосний, а голосні зазвичай мають переважну інтенсивність у порівнянні з навколишніми приголосними, можна припустити, що більшість локальних максимумів - голосні. Очевидно, що складові кордону перебувають у мінімальній точці між двома максимумами. Однак цей підхід наштовхується на складність, тому що за наявності, наприклад, Сонанти можуть з'являтися помилкові максимуми.
Сегментація може проводитися в два етапи: на склади, а потім на звуки, їх складові, у результаті чого уточнюються межі між складами. Співвідношення між сегментами по ряду параметрів дозволяє виявити внутрішню структуру складової одиниці.
У фонетиці точка зору на акустичну виділених меж фонетичного слова (ритмічної структури) зазнала певних змін. Повне заперечення акустичних кордонів слова змінилося твердженням про те, що при визначенні меж фонетичного слова в потоці мовлення цілком реально спиратися на об'єктивні критерії: акустичні характеристики звуків на стику фонетичних слів і їх аллофоніческую варіативність. При розмежуванні мовного потоку на фонетичні слова залучення акустичних характеристик стикових звуків необхідно у всіх випадках: як без паузи, так і за наявності останньої.
Імовірність появи паузи в мові залежить від характеру поєднань звуків ритмічної структури сусідніх слів (наприклад, якщо перше слово закінчується ударним складом, а наступне за ним починається також з ударного, то поява між цими словами паузи більш імовірно, ніж у тому випадку, коли за ударним стилем першим фонетичного слова слід ненаголошений склад друге фонетичного слова) і місця розглянутого стику у фразі.
У потоці мовлення визначення меж фонетичного слова пов'язане з рядом труднощів, що виникають у зв'язку з приналежністю висловлювання до стилю вимови і типом проголошення; позицією фонетичного слова в тексті, синтагме і фразі.
Одні реалізації кордонів фонетичних слів дійсно мають свої акустичні ознаки, інші їх не мають. Завдання не повинна обмежуватися виключно пошуком фізичних і слухових ознак сусідніх звуків, а повинна бути спрямована на визначення ієрархії (підпорядкування) цих ознак.
Інформація про наголос, безсумнівно, також використовується для визначення числа фонетичних слів в повідомленні. Найважливішою інформацією, однак, використовуваної людиною при членуванні мовного потоку, є інформація про типи найбільш частотних фонетичних слів (ритмічних структур). При членуванні злитого мовлення на семантично значущі відрізки використовується інформація різних мовних рівнів - від фонологічного до семантичного. При розробці програм для автоматичного членування тексту ця інформація (про типи ритмічних структур, зокрема і ступеня наголоси і т.д.), безумовно, повинна бути прийнята до уваги. Однак у злитого мовлення виникають двозначні мовні ситуації, декодування яких може бути здійснено із залученням додаткової інформації про акустичні ознаках членування. Стикові голосні і приголосні володіють певними акустичними ознаками, зміна яких залежить від характеру зв'язку між ними.
У випадках, коли доступ до системи, яка розпізнає мова, повинен бути забезпечений будь-якому користувачеві, доцільний перехід до неадаптівним (незалежним від диктора) систем автоматичного розпізнавання. Ці системи набагато легше реалізувати для мов, фонетична структура яких більш вивчена (для російської, японської, англійської) і набагато складніше для мов тонального типу (в'єтнамського, китайського, французького).
При створенні систем автоматичного розпізнавання усної мови величезне значення набувають експерименти в області сприйняття мови. Результати таких експериментів часто лежать в основі функціонування тієї чи іншої системи. ЕОМ, що розпізнають мова, найчастіше копіюють деякі не тільки аналізують функції людського вуха, а й запам'ятовують, а також логічні функції людського мозку.
Безперервне вдосконалення форм діалогу між людиною-оператором і ЕОМ повинно привести до оптимізації комунікації між ними. Діалог «людина-машина» на природному мовою передбачає використання, як відповідних технічних методів, так і певних лінгвістичних знань. Вивчення проблеми ролі мови спілкування між людиною і ЕОМ і розробка автоматизованих систем з природним для людини мовою спілкування знаходяться на стадії подальшого становлення.

1.4 Структурна схема пристрою виділення ознак мовних сигналів
Нижче буде запропонована наступна структурна схема пристрою виділення ознак мовних сигналів (рисунок 1.1).
Вона складається з наступних блоків:
1 - мікрофон;
2 - блок виділення обвідної;
3 - блок визначення початку і кінця слова;
4 - блок виділення кінцевої різниці;
5 - блок виділення кількості звуків;
6 - лінія затримки;
7 - блок виділення інтервалів;
8 - блок аналізу;
9 - блок даних;
10 - друкувальний пристрій.

Малюнок 1.1 - Структурна схема пристрою виділення ознак мовних сигналів
Завдання розпізнавання мовлення може бути зведена до задачі розпізнавання окремих звуків з подальшим використанням алгоритмів, що враховують особливості вимови, словопостроенія і словосполучення фраз окремих індивідуумів.
У цьому випадку завдання виділення звуків мови може розглядатися як задача розпізнавання образів, кількість яких обмежена, хоча і досягає декількох десятків. При цьому сама задача класифікації пропонованих зразків звуків може бути зведена до задачі багатоальтернативної перевірки гіпотез. При цьому система розпізнавання звуків мови може будуватися з використанням принципів "навчання з учителем", тобто попереднього набору інформаційної бази класифікованих даних, з якими проводиться порівняння надходять на аналіз сигналів. Процедура розпізнавання звуків мови повинна враховувати особливості їх реалізації. По-перше, ці реалізації у кожного звуку мають свій вигляд. По-друге, мають обмежену протяжність у часі.
Методи аналізу мовних сигналів можна розглядати за допомогою моделі, в якій мовний сигнал є відгуком системи з повільно змінними параметрами на періодичне або шумове збудливу коливання (малюнок 1.2).
Вихідний сигнал голосового тракту визначається згорткою функції збудження і імпульсного відгуку лінійного, що змінюється в часі фільтра, моделює голосовий тракт. Таким чином, мовний сигнал s (t) виражається наступним чином:
,
де e (t) - функція збудження, v (t, t) - відгук голосового тракту в момент t на дельта-функцію, що подається на вхід в момент t.

Малюнок 1.2 - Схема функціональної моделі формування мови
Мовний сигнал можна промоделювати відгуком лінійної системи зі змінними параметрами (голосового тракту) на відповідний збудливий сигнал. При незмінній формі голосового тракту вихідний сигнал дорівнює згортку збудливого сигналу і імпульсного відгуку голосового тракту. Однак все розмаїття звуків виходить шляхом зміни форми голосового тракту. Якщо форма голосового тракту змінюється повільно, то на коротких інтервалах часу вихідний сигнал логічно, як і раніше апроксимувати згорткою збудливого сигналу і імпульсного відгуку голосового тракту. Оскільки при створенні різних звуків форма голосового тракту змінюється, огинає спектра мовного сигналу буде, звичайно, теж змінюватися з часом. Аналогічно при зміні періоду сигналу, збудливого дзвінкі звуки, частотний рознос між гармоніками спектру буде змінюватися. Отже, необхідно знати вид мовного сигналу на коротких відрізках часу і характер його зміни в часі.
У системах аналізу мовних сигналів звичайно намагаються розділити збудливу функцію і характеристики голосового тракту. Далі в залежності від конкретного способу аналізу отримують параметри, що описують кожну компоненту.
У частотної області спектр коротких відрізків мовного сигналу можна представити у вигляді добутку обвідної, що характеризує стан голосового тракту, і функції, яка описує тонку структуру, яка характеризує збудливий сигнал. Оскільки основним параметром сигналу, збудливого дзвінкий звук, є рознос гармонік основного тону, а характеристики голосового тракту з достатньою повнотою визначаються частотами формант, то при аналізі дуже зручно виходити з уявлення мови в частотній області. При створенні різних звуків форма голосового тракту і збудливий сигнал змінюються, при цьому змінюється і спектр мовного сигналу. Отже, спектральне уявлення мови повинно грунтуватися на короткочасному спектрі, отримуваний із перетворення Фур'є.
Розглянемо Дискретизований мовний сигнал, представлений послідовністю s (n). Його короткочасне перетворення Фур'є S (w, n) визначається як
(1.1)
Цей вираз описує перетворення Фур'є зваженого відрізка мовного коливання, причому вагова функція h (n) зсувається у часі.
Лінійне передбачення є одним з найбільш ефективних методів аналізу мовних сигналів. Цей метод стає домінуючим при оцінці основних параметрів мовних сигналів, таких як період основного тону, форманти, спектр, а також при скороченому поданні мови з метою її низкоскоростной передачі та економного зберігання. Важливість методу обумовлена ​​високою точністю одержуваних оцінок і відносною простотою обчислення.
Основний принцип методу лінійного передбачення полягає в тому, що поточний відлік мовного сигналу можна апроксимувати лінійною комбінацією попередніх відліків. Коефіцієнт передбачення при цьому визначається однозначно мінімізацією середнього квадрата різниці між відліками мовного сигналу та його передбаченими значеннями (на кінцевому інтервалі). Коефіцієнти передбачення - це вагові коефіцієнти, використовувані в лінійній комбінації. Метод лінійного передбачення можна застосовувати для скорочення обсягу цифрового мовного сигналу.
Основною метою обробки мовних сигналів є отримання найбільш зручного і компактного представлення міститься в них. Точність подання визначається тією інформацією, яку необхідно зберегти або виділити. Наприклад, цифрова обробка може застосовуватися для з'ясування, чи є це коливання мовним сигналом. Схожа, але трохи більш складне завдання полягає в тому, щоб класифікувати коливання на вокалізованих мова, невокалізованную мова і паузу (шум).
В основі більшості методів обробки мови лежить уявлення про те, що властивості мовного сигналу з плином часу повільно змінюються. Це припущення приводить до методів короткочасного аналізу, в яких сегменти мовного сигналу виділяються і обробляються так, як якщо б вони були короткими ділянками окремих звуків з відмінними властивостями.
Одним з найбільш відомих методів аналізу промови в тимчасовій області можна назвати метод, запропонований Л. Рабінера і Р. Боярином в / 3 /. Він заснований на вимірюванні короткочасного середнього значення сигналу і короткочасної функції середнього числа переходів через нуль. Як зазначалося вище, амплітуда мовного сигналу суттєво змінюється в часі. Подібні зміни амплітуди добре описуються за допомогою функції короткочасної енергії сигналу. У загальному випадку визначити функцію енергії можна як

Цей вираз може бути переписано у вигляді
, (1.2)
де
Вибір імпульсної характеристики h (n) або вікна складає основу опису сигналу за допомогою функції енергії.
Щоб зрозуміти, як впливає вибір часового вікна на функцію короткочасної енергії сигналу, припустимо, що h (n) в (1.2) є досить тривалою і має постійну амплітуду; значення En буде при цьому змінюватися в часі незначно. Таке вікно еквівалентно фільтру нижніх частот з вузькою смугою пропускання. Смуга фільтра нижніх частот не повинна бути настільки вузькою, щоб вихідний сигнал виявився постійним. Для опису швидких змін амплітуди бажано мати вузьке вікно (коротку імпульсну характеристику), проте дуже мала ширина вікна може призвести до недостатнього усереднення і, отже, до недостатнього згладжування функції енергії. Вплив ширини тимчасового вікна на точність вимірювання короткочасного середнього значення (середньої енергії):
якщо N (ширина вікна в отсчетах) мало (близько періоду основного тону і менше), то En буде змінюватися дуже швидко, відповідно до тонкою структурою мовного коливання,
якщо N велике (порядку декількох періодів основного тону), то En буде змінюватися повільно і не буде адекватно описувати змінюються особливості мовного сигналу.
Це означає, що не існує єдиного значення N, яке в повній мірі задовольняло б перерахованим вимогам, так як період основного тону змінюється від 10 відліків (при частоті дискретизації 10 кГц) для високих дитячих і жіночих голосів і до 250 відліків для дуже низьких чоловічих. N виберемо рівним 100, 200, 300 відліків при частоті дискретизації 8 кГц.
Основне призначення En полягає в тому, що ця величина дозволяє відрізнити вокалізованих мовні сегменти від невокалізованних. Значення функції короткочасного середнього значення сигналу для невокалізованних сегментів значно менше, ніж для вокалізованих.
Характерною особливістю методу аналізу мовних сигналів є бінарна квантування вхідного мовного сигналу. Можливість виділення параметрів сигналів, які зазнали бінарному квантованию, показана в / 4 /. Використовувана математична модель мовного сигналу має вигляд:
, (1.3)
де A (t) - закон зміни амплітуди мовного сигналу, Y (t) - повна фазова функція мовного сигналу.
Закон зміни амплітуди сигналу не є достатньо інформативним параметром для оцінки мовного повідомлення, так як він не є постійним для одного і того ж слова чи фрази, виголошених з різною інтонацією і гучністю. За інформативну характеристики мовного сигналу в запропонованому методі покладається повна фазова функція мовного сигналу. Повна фазова функція мовного сигналу представляється у вигляді розкладання в ряд Тейлора:
. (1.4)
Вираз (1.4) можна переписати таким чином
. (1.5)
У розкладанні беруться першi три коефіцієнти розкладання. При цьому перший коефіцієнт m0, що є початковою фазою мовленнєвого сигналу, приймається рівним нулю, внаслідок неінформативності. Тоді повна фазова функція буде:
, (1.6)
де, m1 - коефіцієнт розкладання, що є середньою частотою мовного сигналу, m2 - коефіцієнт розкладання, що є зміною (девіацією) частоти мовного сигналу.
Після дискретизації повна фазова функція має наступний вигляд:
, (1.7)
де i - номер поточного відліку в Дискретизований послідовності, Dt - крок дискретизації.
Параметри m1 і m2 є характеристиками, які використовуються для опису мовного повідомлення. У режимі обробки "ковзне вікно" обчислюється перший кінцева різниця повної фазової функції мовного сигналу, яка є короткочасною функцією середнього числа переходів через нуль мовного сигналу і є грубою оцінкою частоти мовного сигналу m1 з деякою погрішністю, що залежить від зміни частоти m2. Для визначення m2 слід обчислити другу кінцеву різниця повної фазової функції мовного сигналу, яка також є швидкістю зміни функції середнього числа переходів через нуль мовного сигналу. Перша і друга кінцеві різниці повної фазової функції мають такий вигляд / 4 /:
,
, (1.8)
де L - ширина тимчасового "ковзного" вікна виражена в кількості відліків.
Тоді з (1.8) частоту мовного сигналу m1 і зміна частоти m2, отримаємо у вигляді:
,
,
де T = L × Dt - ширина тимчасового "ковзного" вікна.

1.5 Розробка структурної схеми пристрою визначення кількості звуків в ізольованому слові мови

Структурна схема розроблювального пристрою, аналізує інформаційні ознаки мовних сигналів і визначає початок і кінець звуку в слові, зображена на малюнку 1.3. Вона складається з наступних блоків:
1 - перший формувач;
2 - цифрова лінія затримки (ЦЛЗ);
3 - перший реверсивний лічильник;
4 - другий РС;
5 - перший суматор;
6 - третій РС;
7 - четвертий РС;
8 - другий суматор;
9 - п'ятий РС;
10 - шостий РС;
11 - третій суматор;
12 - перша обчислювач модуля;
13 - другий обчислювач модуля;
14 - третіх обчислювач модуля;
15 - перша граничний пристрій;
16 - другий ПР;
17 - третіх ПР;
18 - другий формувач;
19 - третіх формувач;
20 - четвертий формувач;
21 - схема АБО.

Малюнок 1.3 - Структурна схема пристрою визначення кількості звуків
Мовний сигнал, вимовний людиною, потрапляє в мікрофон. Мікрофон служить для перетворення акустичних хвиль, що збуджуються голосовим трактом людини, в електричні коливання.
Для формування бінарно-квантованного сигналу з аналогового мовного сигналу застосовується АЦП з однобітних словникової організацією. В якості такого АЦП можна використовувати компаратор. Амплітудна характеристика компаратора наведена на малюнку 1.4.

Малюнок 1.4 - Амплітудна характеристика компаратора
Завданням компаратора є відстеження перевищення вхідним мовним сигналом деякого порога Uпор (для негативної напівхвилі сигналу-Uпор). Коли мовний сигнал на вході компаратора малий (знаходиться в інтервалі-Uпор <Uвх <Uпор), то на виході буде присутній рівень сигналу, відповідний логічному «0». При перевищенні вхідним сигналом деякого порога Uпор (або якщо сигнал менше ніж-Uпор по амплітуді), на виході компаратора буде присутній рівень сигналу, відповідний логічної «1».
На виході компаратора формується сигнал у вигляді послідовності бінарно-квантованих відліків, тобто у вигляді послідовності логічних «0» і «1». Поява сигналів на виході компаратора визначається частотою надходження на його стробирующий вхід стробирующих імпульсів. Частота проходження стробирующих імпульсів, яка також є частотою дискретизації вхідного мовного сигналу, вибирається з умови виконання теореми Котельникова, тобто не менше 2Fmax, де Fmax - це максимальна частота в спектрі мовного сигналу.
З виходу компаратора оцифрований сигнал надходить на першу ЦЛЗ, яка забезпечує затримку сигналу на 100 відліків, і на суммирующий вхід першого реверсивного лічильника. Параметр, що виділяється реверсивним лічильником, носить назву першої кінцевої різниці повної фазової функції мовного сигналу або функцією середнього числа переходів через нуль. Схема, що обчислює першу кінцеву різниця, складається з лінії затримки і реверсивного лічильника. Вона працює в режимі «ковзне вікно». Ширина тимчасового вікна складає 100 відліків. Код на виході реверсивного лічильника показує кількість перетинів через нуль на інтервалі часу 100 відліків. Зрушуючи на один відлік, «ковзне вікно» видає новий код, що показує кількість нульових перетинань.
Друга ЦЛЗ і другий реверсивний лічильник також обчислюють перший кінцеву різниця, але затриману на 100 відліків щодо тієї, яка обчислюється перший ЦЛЗ і першим реверсивним лічильником. Маючи дві перші кінцеві різниці повної фазової функції мовного сигналу, можна дати оцінку зміни частоти мовного сигналу в часі, тобто обчислити швидкість зміни функції середнього числа перетинів через нуль.
Операція знаходження другої кінцевої різниці виконується в першому суматорі, який віднімає з першої кінцевої різниці в поточний момент часу першого кінцеву різниця, затриману на довжину тимчасового вікна 100 відліків.
Наступні блоки у схемі (чотири реверсивні лічильника і два суматора) призначені для 200 і 300 відліків.
Так як друга кінцева різниця має негативні значення, то з 1, 2, 3-го суматорів вона поступає на 1, 2, 3-й блоки обчислювача модуля. Потім на 1, 2 і 3-є граничний пристрій і на формувачі. Після чого йде схема АБО.

2. ОГЛЯД ІСНУЮЧИХ СИСТЕМ УПРАВЛІННЯ розпізнавання мовних ІНФОРМАЦІЇ і методи розв'язання Я
Розпізнавання та породження (синтез) мови комп'ютером є, безумовно, важливою проблемою. Десятиліттями вчені та інженери шукали способи, які дозволили б людям спілкуватися з комп'ютером так само, як вони спілкуються між собою, а не змушували людини підлаштовуватися під спосіб спілкування, прийнятний для машини. Багато було зроблено, але, мабуть, і на сьогоднішній день можна вважати, що питання далеко не закритий, хоча саме останнім часом були досягнуті значні успіхи: вже багато років голосові команди є однією з можливих опцій програмного забезпечення персональних комп'ютерів, поява функцій розпізнавання мовлення вже звичайна справа в ряді текстових процесорів, системи розпізнавання мови працюють там, де потрібно надання довідкових послуг і в системах безпеки.
Питання цифрової обробки сигналів, окремі галузі математичної статистики, штучного інтелекту (теорії нейронних мереж), пов'язані з розробкою двигунів і додатків розпізнавання і породження мовлення. Наводяться численні уривки програм на мові Сі.
Питання обробки мови є, головним чином, частиною дисциплін, іменованих цифровою обробкою сигналів і розпізнаванням образів.
Методи цифрової обробки сигналів зазвичай здійснюють перетворення, очищення і трансформацію звукового сигналу в цифровий формат даних та інші уявлення, які можуть безпосередньо оброблятися системою розпізнавання мови. Ці завдання включають також фільтрацію шумових сигналів, які додаються до звуку при передачі акустичних сигналів від сприймають пристроїв (мікрофонів) або через мережу. Методи ж розпізнавання образів використовують при виділенні і розпізнаванні окремих слів або пропозицій мовного потоку або в деяких випадках для ідентифікації мовця.
Крім того, системи розпізнавання і синтезу мови зачіпають питання лінгвістики, в якій закладені фундаментальні концепції і принципи розпізнавання мови і розуміння мови.
Перерахуємо два підходи розв'язання задачі розпізнавання голосового повідомленні.
2.1 Застосування нейронних мереж для розпізнавання мови.
· Введення в нейронні мережі:
Штучна нейронна мережа - це математична модель, а також пристрої паралельних обчислень, що представляють собою систему з'єднаних і взаємодіючих між собою простих процесорів (штучних нейронів). Як математична модель штучна нейронна мережа являє собою окремий випадок методів розпізнавання образів або дискримінантного аналізу.
Такі процесори зазвичай досить прості, особливо в порівнянні з процесорами, використовуваними в персональних комп'ютерах.
Кожен процесор подібної мережі має справу тільки з сигналами, які він періодично отримує, і сигналами, які він періодично посилає іншим процесорам. І тим не менш, будучи з'єднаними в досить велику мережу з керованим взаємодією, такі локально прості процесори разом здатні виконувати досить складні завдання.
Поняття виникло при вивченні процесів, що протікають в мозку при мисленні, і при спробі змоделювати ці процеси. Отримані моделі називаються штучними нейронними мережами (ІНС).

Рис. 2. SEQ Рисунок \ * ARABIC 1. Схема простий нейромережі. Зеленим позначені вхідні елементи, жовтим - вихідний елемент
Нейронні мережі не програмуються в звичному сенсі цього слова, вони навчаються. Можливість навчання - одна з головних переваг нейронних мереж перед традиційними алгоритмами. Технічно навчання полягає в знаходженні коефіцієнтів зв'язків між нейронами. У процесі навчання нейронна мережа здатна виявляти складні залежності між вхідними даними і вихідними, а також виконувати узагальнення. Це означає, що, у разі успішного навчання, мережа зможе повернути вірний результат на підставі даних, які були відсутні у навчальній вибірці.
· Алгоритми зворотного розповсюдження:
Складніше йде справа з багатошаровими мережами, оскільки спочатку невідомі бажані виходи шарів мережі (за винятком останнього) і їх неможливо навчити, керуючись тільки величиною помилок на виході мережі, як це було з одношарової мережею.
Найбільш прийнятним варіантом вирішення проблеми стала ідея поширення сигналу помилки від виходу мережі до її входу, шар за шаром. Алгоритми, що реалізують навчання мережі за цією схемою, отримали назву алгоритмів зворотного поширення. Найбільш поширений варіант цього алгоритму ми і розглянемо і надалі застосуємо в програмній реалізації завдання.
Алгоритм потребує диференційовності активаційний (або як її по-іншому називають, що стискає) функції на всій осі абсцис. З цієї причини, функція одиничного стрибка не може використовуватися і як стискає функції зазвичай застосовують згаданий вище сигмоїда (логістичну функцію), хоча існують і інші варіанти.
2.2 Застосування прихованих Марковських моделей для розпізнавання мови.
· Введення в приховані Марківські моделі (ПММ). Рішення задачі розпізнавання.
Прихованої Марківської моделлю (СММ) називається модель складається з N станів, в кожному з яких деяка система може приймати одне з M значень якого-небудь параметра. Ймовірності переходів між станами задається матрицею ймовірностей A = {aij}, де aij - ймовірність переходу з i-го в j-й стан. Ймовірності випадіння кожного з M значень параметра в кожному з N станів задається вектором B = {bj (k)}, де bj (k) - ймовірність випадання k-го значення параметра в j-му стані. Імовірність настання початкового стану задається вектором π = {πi}, де πi - імовірність того, що в початковий момент система опиниться в i-му стані.
Таким чином, прихованої Марківської моделлю називається трійка λ = {A, B, π}. Використання прихованих Марковських моделей для розпізнавання мови грунтується на двох наближеннях:
1) Мова може бути розбита на фрагменти, що відповідають станам в СММ, параметри мовлення в межах кожного фрагменту вважаються постійними.
2) Ймовірність кожного фрагмента залежить тільки від поточного стану системи і не залежить від попередніх станів.
Модель називається «прихованої», так як нас, як правило, не цікавить конкретна послідовність станів, у якій перебуває система. Ми або подаємо на вхід системи послідовності типу O = {o1, o2, ... oi} - де кожне oi - значення параметра (одне з M), прийняте в i-й момент часу, а на виході очікуємо модель λ = {A, B , π} з максимальною вірогідністю генеруючу таку послідовність, - або навпаки подаємо на вхід параметри моделі і генеруємо породжувану їй послідовність. І в тому і в іншому випадку система виступає як "чорний ящик", в якому сховані дійсні стану системи, а пов'язана з нею модель заслуговує назви прихованою.
Для здійснення розпізнавання на основі прихованих моделей Маркова необхідно побудувати кодову книгу, яка містить безліч еталонних наборів для характерних ознак мови (наприклад, коефіцієнтів лінійного передбачення, розподілу енергії по частотах і т.д.). Для цього записуються еталонні мовні фрагменти, розбиваються на елементарні складові (відрізки мовлення, протягом яких можна вважати параметри мовного сигналу постійними) і для кожного з них обчислюються значення характерних ознак. Однією елементарної складовою буде відповідати один набір ознак з безлічі наборів ознак словника.
Фрагмент промови розбивається на відрізки, протягом яких параметри мови можна вважати постійними. Для кожного відрізка обчислюються характерні ознаки і підбирається запис кодової книги з найбільш відповідними характеристиками. Номери цих записів і утворюють послідовність спостережень O = {o1, o2, ... oi} для моделі Маркова. Кожному слову словника відповідає одна така послідовність. Далі A - матриця ймовірностей переходів з одного мінімального відрізка мови (номера запису кодової книги) в інший мінімальний відрізок мови (номер запису кодової книги). В - ймовірності випадання в кожному стані конкретного номера кодової книги рис. 2.2
http://speech-text.narod.ru/codebook.gif
Рис. 2.2 кодова книга
На етапі налаштування моделей Маркова ми застосовуємо алгоритм Баума-Уелча для наявного словника і зіставлення кожному з його слів матриці A і B.
При розпізнаванні ми розбиваємо мова на відрізки, для кожного обчислюємо набір номерів кодової сторінки й застосовуємо алгоритм прямого або зворотного ходу для обчислення імовірності відповідності даного звукового фрагмента певному слову словника. Якщо ймовірність перевищує деяке порогове значення - слово вважається розпізнаним.
· Алгоритм Баума-Уелча.
Необхідно підібрати параметри прихованої моделі Маркова так, щоб максимізувати ймовірність даної послідовності спостережень.
Вводяться змінні
ξt (i, j) = P (qt = Si, qt +1 = Sj | O, λ)
які показують імовірність того, що при заданій послідовності спостережень O система в моменти часу t і t +1 буде знаходитися відповідно в станах Si і Sj. Використовуючи пряму і зворотну змінні запишемо:

Введемо змінні ймовірності того, що при заданій послідовності спостережень O система в момент часу t буде перебувати в стані Si:

При цьому ми можемо обчислити очікуване число переходів зі стану Si: одно

а очікувана кількість переходів зі стану Si в стан Sj

Виходячи з цього можна отримати формули для переоцінки параметрів моделі Маркова:
π * i = QUOTE (I)


Вираз

у формулі для b * ij (k) означає що підсумовуються тільки ті γt (j), для яких значення стану одно k, тобто Ot = k.
Після переоцінки параметри моделі або з'ясовується, що вона вже була оптимальною до переоцінки або обов'язково поліпшуються її параметри (тобто правдоподібність моделі після переоцінки вище, ніж до переоцінки у всіх випадках, коли модель можна оптимізувати).

3. МОДЕЛЮВАННЯ РОБОТИ БЛОКУ ВИДІЛЕННЯ ПОЧАТКУ І ЗАКІНЧЕННЯ СЛОВА, КІЛЬКОСТІ ЗВУКІВ НА ЕОМ
У процесі виконання дипломного проекту були проведені експериментальні дослідження алгоритму виділення ознак мовних сигналів.
Мовний сигнал з мікрофону вводився в ЕОМ за допомогою 16-ти розрядного перетворювача аналог-код. Частоту дискретизації вибрали 8 кГц. Далі сигнал піддавався аналізу. Запис трьох голосних звуків «а-oe» і слів «Hello», «Start», «Stop», «Next» і «Back», здійснювали за допомогою спеціального звукового редактора «COOL».
Обробка мовних сигналів вироблялася в ЕОМ за допомогою програмного пакету «Matlab7.6.0». Вхідні дані представляли собою масив Дискретизований чисел і утримувалися в окремому файлі даних. У створеній програмі було вироблено моделювання роботи компаратора. Було вибрано три рівні квантування «0», «1», «-1» і був встановлений шумовий поріг, тому що шуми хоч і були незначні, але все ж таки могли вплинути на результати.
Далі в програмі проводився підрахунок кількості переходів через нуль на інтервалі в 100, 200 і 300 відліків. Таким чином, моделювалася робота блоку складається з ЦЛЗ і реверсивного лічильника. Були обчислені перша і друга кінцеві різниці повної фазової функції. Більш докладно можна розглянути на прикладі фонем «а-о-е» (малюнок 4.1).
За таким же принципом були проведені експерименти зі словами, такими як «Notepad», «Open», «Close», «Pause» і з більш складними словами «Calculator», «Microsoft» і «Explorer».
Далі стояло завдання зібрати статистичні дані щодо виділення кількості звуків у кількох словах. Для статистики були взяті такі слова: «Hello» і «Start». Кожне слово було вимовлено шістьма людьми по десять разів. Результати статистичних даних наведені в таблицях.
Таблиця 4.1 - Статистичні дані за словом «Hello»
Номер експерименту
0
1
2
3
4
5
6
7
8
9
Кількість звуків
4
4
4
4
3
5
4
4
3
4
10
11
12
13
14
15
16
17
18
19
20
21
5
5
3
3
4
3
4
4
4
5
4
4
22
23
24
25
26
27
28
29
30
31
32
33
4
4
4
4
4
4
4
4
4
4
4
4
34
35
36
37
38
39
40
41
42
43
44
45
4
4
4
3
4
4
5
4
4
4
4
4
46
47
48
49
50
51
52
53
54
55
56
57
3
3
4
4
4
4
4
4
4
4
4
4
58
59
60
4
4
4
Разом виходить, що відсоток розпізнавання кількості звуків у слові «Hello» дорівнює близько 79%.
Таблиця 4.2 - Статистичні дані за словом «Start»
Номер експерименту
0
1
2
3
4
5
6
7
8
9
Кількість звуків
4
4
4
4
4
4
4
4
4
4
10
11
12
13
14
15
16
17
18
19
20
21
4
4
4
4
4
4
4
4
4
4
4
4
22
23
24
25
26
27
28
29
30
31
32
33
4
4
4
4
4
2
3
3
4
3
3
4
34
35
36
37
38
39
40
41
42
43
44
45
4
4
4
4
4
4
4
3
4
3
4
3
46
47
48
49
50
51
52
53
54
55
56
57
4
4
4
4
4
3
3
4
3
3
4
3
58
59
60
4
3
4
Разом виходить, що відсоток розпізнавання кількості звуків у слові «Start» дорівнює близько 75%.

5. РОЗРОБКА ІНОФРМАЦІОННОГО ЗАБЕЗПЕЧЕННЯ

5.1 Структурно-алгоритмічна організація

У структурі програми можна виділити логічні модулі. Кожному модулю притаманні свої завдання, методи, які викликаються функції. Структурна схема зображена на малюнку 5.1.

Малюнок 5.1 - Структурна схема програми
Основний графічний модуль - це графічний інтерфейс спілкування користувача з програмою. Користувач при натисканні на кнопки викликає виконання функцій з інших модулів.
Модуль вибору режиму роботи - це модуль для взаємодії користувача з програмою, з метою встановлення режиму роботи.
Модуль вводу мовного сигналу - це модуль, який відповідає за запис сигналу з мікрофона.
Модуль створення БД еталонів - це модуль, який аналізує вхідний сигнал у режимі створення еталона, переводить у цифровий вигляд і створює БД.
Модуль аналізу звукового сигналу - це модуль, який аналізує вхідний сигнал у режимі розпізнавання, і переводить у цифровий вигляд.
Модуль розпізнавання мовлення - це модуль, який проводить зіставлення вхідного сигналу і еталону в БД.

5.2 Алгоритм програми

На початку роботи на екран виводиться головне вікно програми. Після цього на динамік мікрофона подається звукове повідомлення, за який відповідає модуль введення мовного сигналу. Потім на головному вікні користувач вибирає режим роботи програми. Якщо вибраний режим створення еталона, за який відповідає модуль створення БД еталонів, то програма обробляє і зберігає вхідний сигнал з мікрофона і виводить спектр на екран. Якщо ж обраний режим розпізнавання, то програма обробляє результати і порівнює із заздалегідь записаним еталоном в БД, зберігає вхідний сигнал і переходить до його розпізнавання за допомогою обчислення першої та другої кінцевої різниці повної фазової функції, тобто визначаємо кількість звуків у цьому слові, що видно з зробленого раніше моделювання, Визначаємо початок і кінець слова за допомогою виділення облямовує, що показано на рис.3.2. Результат розпізнавання виводиться на дисплей.

5.3 Опис інтерфейсу

Програма має дружній інтерфейс і легка в освоєнні. Графічний інтерфейс проектується в середовищі розробки Visual C #. Net. У даній системі можна швидко і якісно розробляти графічні додатки, використовуючи готові компоненти.
Інтерфейс програми розроблений з урахуванням інформативності одержуваних користувачем даних. На малюнку 5.2 показано головне вікно програми.
У верхній частині вікна програми знаходиться панель управління зі стандартними вкладками. Нижче розташовується панель з вкладками, які дозволяють користувачеві вибирати режим обробки надходить з мікрофону звукового сигналу. Безпосередньо над графіками представлена ​​інформаційна панель, яка дає користувачеві можливість в реальному режимі часу спостерігати загальна кількість команд в БД, кількість розпізнаних команд, останню розпізнану команду і номер випробування.
На верхньому графіку зображено частотна характеристика вхідного звукового сигналу, а на наступному - амплітудна характеристика розпізнаного сигналу.
У нижній частині вікна програми є поле подій, в якому виводяться повідомлення про роботу апаратної частини.

5.4 Реалізація

5.4.1 Модуль входу в програму

При запуску програми викликається функція «static void Main ()». Ця функція ініціалізує додаток шляхом виклику функції Application.EnableVisualStyles ();. Далі запускається функція, яка складає стиль програми шляхом виклику наступної функції Application.SetCompatibleTextRenderingDefault (false);. Після неї запускається функція, яка створює діалогове вікно програми шляхом виклику функції Application.Run (new Form1 ()); і запускає програму. У тілі цієї функції так само передбачена обробка винятків try - catch.
5.4.2 Основний графічний модуль
Основний графічний модуль у вихідному коді програми представлений як клас Form1. Він містить такі основні графічні елементи:
1) PictureBox1: Виведення графічного зображення 1
2) PictureBox2: Виведення графічного зображення 2
3) textBox2: Виведення розпізнаного слова

5.4.3 Модуль вибору режиму роботи

Вибір режиму роботи програми здійснюється натисканням кнопки «Mode». При її натисканні викликається функція-обробник цієї події «private void recognitionToolStripMenuItem_Click (object sender, EventArgs e)» Функція перевіряє і зберігає зазначений режим роботи.

5.4.4 Модуль введення мовного сигналу

Запис і обробка звукового сигналу здійснюється функцією «private void toolStripDropDownButton1_Click (object sender, EventArgs e)». У цій функції задається частота дискретизації - 16 кГц. Довжина сигналу за часом визначається за допомогою функції GetTickCount (). Діскретезірованний і відфільтрований сигнал записується в буфер matrix [].

5.4.5 Модуль створення БД еталонів

При створенні еталону необхідно натиснути кнопку «Add Command» в режимі створення еталона. Після натискання цієї кнопки викликається функція-обробник цієї події «private void toolStripButton1_Click (object sender, EventArgs e)». Ця функція активує кнопку «Add Command». Після цього викликається функція «public bool Record ()» класу WaveIn, яка починає запис сигналу з мікрофона в буфер і зберігає цей сигнал як еталон. Після того як сигнал записаний, натискається кнопка «Stop». Після натискання цієї кнопки викликається функція-обробник події «private void toolStripButton1_Click (object sender, EventArgs e)». Ця функція активує кнопку «Stop» і зупиняє запис шляхом виклику функції WaveIn.StopRecord () класу WaveIn.

5.4.5 Модулі аналізу звукового сигналу і розпізнавання мови

Аналіз і розпізнавання звукового сигналу відбувається у функції «Void AudioFrame.WaveIn (short * buf, int len)» після того як сигнал записаний, діскретезірован і відфільтровано.

5.5 Приклад роботи програми

Перед початком роботи клієнта, безпосередньо після запуску програми необхідно її налаштувати. Для цього буде потрібно приєднаний до комп'ютера мікрофон.
Для налаштування системи необхідно після запуску створити еталон слова для подальшого розпізнавання. Для цього потрібно в полі вибору режиму роботи програми натиснути кнопку створення еталона тобто «Add Command», в лівому верхньому кутку головного вікна програми на панелі з вкладками. Після натискання кнопки почнеться запис сигналу. Далі слід вимовити слово і зупинити запис шляхом натискання кнопки «Stop» у лівому верхньому куті екрану.
Після того як еталон створено та збережено, необхідно перемкнути режим роботи програми у «Mode - Recognition». Після перемикання в «Mode - Recognition» необхідно включити запис сигналу шляхом натискання кнопки «File -> Start Recognition», вимовити слово, яке потрібно розпізнати, і зупинити запис шляхом натискання кнопки «Stop».
Розпізнане слово буде виведено в текстовому полі після «You just said:».
На малюнку 5.3 показаний результат роботи програми. Програма працює успішно, було розпізнано слово «Hello». Програмою було визначено слово за еталоном, збереженому в базі даних програми в режимі створення еталона.
На малюнку 5.4 показаний результат роботи програми при перешкодах. Через створених перешкод програмі не вдалося розпізнати слово. Як шуму використовувався штучно створений стаціонарний шум, що виник в результаті дії кількох незалежних джерел: шум людей, шум працюючого двигуна автомобіля і інші навколишні шуми. Рівень шуму, при якому слово не було розпізнано, становить вище 85дБ, що говорить про придатність програми для використання в автомобілі. Такий рівень шуму може бути викликаний дуже великим скупченням автомобілів на дорозі, інтенсивним трамвайним рухом (фізичний шум).

6 БЕЗПЕКА І ЕКОЛОГІЧНІСТЬ ПРОЕКТУ

6.1 Системний аналіз безпеки і надійності блоку виділення початку і закінчення слова, кількості звуків при експлуатації

Аналізований блок призначений для роботи у складі пристрою визначення кількості звуків в ізольованому слові мови. Детальний опис принципу роботи пристрою наведено в розділі 2. Проведемо процеси синтезу і аналізу.
Головним є подія, коли пристрій непрацездатною. Воно може бути непрацездатних у двох випадках: коли воно продовжує працювати, але усунуло свої технічні характеристики, або пристрій повністю вийшло з ладу.
Розглянемо докладно перший випадок. Він може бути обумовлений двома причинами: при подачі сигналу на вхід пристрою на його виході періодично пропадають дані про кількість звуків в ізольованому слові мови, або внаслідок впливу зовнішніх причин або невірної роботи одного з блоків пристрою відбувається помилкове спрацьовування пристрою. Зовнішніми причинами можуть бути: переотраженіе акустичної хвилі, вплив шумів чи звуків не відносяться до аналізу, а також багато інших причин. Пропуск сигналу може статися в разі недостатньої амплітуди вхідного сигналу або невірної роботи одного з блоків пристрою, яка можлива якщо:
допущені дефекти в пристрої при виробництві;
відбувається сильне падіння напруги живлення;
невірно встановлений шумовий поріг,
або з будь-яких інших причин.
Другий випадок - це повний вихід пристрою з ладу, який можливий за відсутності напруги живлення або при виході з ладу одного або декількох блоків. Харчування може бути відсутнім з багатьох причин. Часто трапляються - це вихід з ладу вставки плавкої або самого блоку живлення, а також втрата контакту, наприклад, при пошкодженні електричного кабелю. Вийти з ладу можуть такі блоки: ЦЛЗ, УОРС, УУ, компаратор, лічильник, мікрофон. Всі вони можуть відмовити якщо на них подіють механічні або електричні причини, в які входять: можливе падіння приладу, невірне поводження з приладом, займання приладу, великі перепади напруги харчування, попадання води, або з інших причин.

6.2 Заходи щодо підвищення надійності та безпеки блоку

Для підвищення надійності та безпеки блоку можна зробити наступні заходи:
1. Амортизація і демпфірування приладу, а також твір
контролю за якістю монтажу, для зменшення вражаючої дії вібрацій, пов'язаних з падінням.
2. Установка в місцях, недоступних маленьким дітям, щоб запобігти невірне поводження з приладом.
3. Застосування заземлення та вставки плавкої для виключення запалення приладу при замиканні.
4. Застосування стабілізатора напруги з захистом від перевантаження, для запобігання виходу пристрою з ладу при великих подачах напруги живлення.
5. Застосування суцільного кожуха для уникнення попадання води на плату пристрою.
6. Застосування екранування звукоізоляції в приладі з метою зменшення впливу зовнішніх електромагнітних полів, а також компенсації перевідбиттів акустичної хвилі.
7. Застосування чутливого, малошумящего мікрофона для отримання необхідної амплітуди вхідного сигналу.
8. Твір налаштування шумового порога тільки кваліфікованим фахівцем.

6.3 Безпека блоку для природного середовища

Допустимі значення шкідливих факторів встановлюються стандартами ССБТ. Найбільшу небезпеку для навколишнього середовища представляє собою процес виготовлення. Це пояснюється тим, що в період експлуатації пристрій практично не завдає шкоди ні гідросфері, ні літосфері, практично не випромінює електромагнітних полів, а якщо і випромінює, то їх значення мізерно мало, воно завдає незначний шкоди тільки атмосфері, тому що при нагріванні елементів виділяються шкідливі газові домішки. Процес утилізації теж не несе значного забруднення навколишнього середовища через відсутність шкідливих, отруйних речовин в елементах пристрою, а також відсутність газоподібних речовин.
Але, процес виготовлення шкідливий і для атмосфери, тому що під час травлення друкованої плати, при виробництві елементів схеми і проведення пайки виділяється значна кількість шкідливих газоподібних домішок; і для літосфери, так як залишки непотрібного сировини необхідно утилізувати, і для гідросфери, так як у час виробництва деяких елементів схеми можливе застосування водяного охолодження.

7.ТЕХНІКО-ЕКОНОМІЧНЕ ОБГРУНТУВАННЯ Проекти

7.1 Розрахунок заробітної плати розробників

Загальна тривалість ТПП складається з часу на всіх етапах з урахуванням паралельності їх виконання. Фонд заробітної плати розрахований шляхом множення трудомісткості на годинну ставку.
Витрати на заробітну плату розробників конструкції представлені в таблиці 2.
Розрахунок годинної тарифної ставки проводиться шляхом ділення місячної тарифної ставки на кількість робочих годин на місяць.

де - Годинна ставка працівників;
- Середній місячний оклад;
- Середня кількість робочих годин у місяці,

Для програміста, електронщика 14 розряду годинна ставка складе = 4370 / 168 = 26 руб. / год.
Таким чином, беручи до уваги все вище зазначені фактори, складається таблиця з розрахунку основної заробітної плати учасників проекту.
Таблиця 1
Заробітна плата учасників розробки

Етап розробки
Виконавець
Трудо-
ємність,
годинник
Годинна тарифна ставка, крб.
Заробітна плата, руб.
Розробка функціональної схеми
Електронщик
40
26
1040
Розробка програмного забезпечення
програміст
65
26
1690
Основна заробітна плата розробників (ОЗП)
2730
З таблиці 1 видно, що основна заробітна плата, тобто сума витрат на етапі підготовки виробництва складе 2730 рубля.
Розрахуємо суму додаткової заробітної плати з розрахунку 10% від основної заробітної плати, отримаємо:
Здоп = 0,1 · 2730 = 273 руб.
Відрахування на соціальні потреби - 26% від суми основної та додаткової заробітних плат
Інуж = 0,26 · (2730 +273) = 780,78 руб.
Розрахуємо накладні витрати. Норматив на накладні витрати становить від 110 до 200% від суми основної заробітної плати розробників. Припустимо, що накладні витрати складуть 130%.
Інак = 1,3 · 2730 = 3549руб.
Таблиця 2
Витрати на технічну підготовку виробництва
Вид витрат
Сума, руб.
Основна заробітна плата (ОЗП)
2730
Додаткова ЗП (ДЗП) розробників -10% від основної ЗП
273
Відрахування на соціальні потреби - 26% від ОЗП + ДЗП
780,78
Накладні витрати (Н) - 130% від основної ЗП
3549
РАЗОМ ( ):
7332,78
Як видно з таблиці 2, витрати на технічну підготовку виробництва становлять 7332,78 рублів.

ВИСНОВОК
У результаті роботи над бакалаврськими проектом був проведений огляд літератури з метою пошуку існуючих методів аналізу мови. Також був проведений патентний пошук пристроїв, які здійснюють виділення ознак мовних сигналів. Виявилося, що запропонований метод аналізу мовних сигналів, що базується на обробці сигналів у часовій області, на сьогоднішній день не має аналогів. Особливістю запропонованого методу є представлення моделі мовного сигналу не в адитивної формі, як у методах спектрального аналізу, а в мультиплікативної. Це пояснює використання ряду Тейлора при розкладанні повної фазової функції мовного сигналу на компоненти, а не ряду Фур'є. Характерною особливістю даного методу є виділення швидкості зміни частоти мовного сигналу як інформативного параметра. Раніше ні в одному методі аналізу промови цього не проводилося. Також вперше була отримана обвідна мовного сигналу та проведено її спектральний аналіз.
У бакалаврській роботі проводилося моделювання роботи пристрою на ЕОМ. Так само була розроблена програма на мовах програмування високого рівня С #. Net і Matlab, реалізує викладений алгоритм моделювання розпізнавання мовних сигналів. Отримані результати показали можливість використання виділених параметрів мовних сигналів для розпізнавання мови.
У бакалаврській роботі було проведено економічне обгрунтування доцільності розробки та розглянуто питання безпеки і екологічності спроектованого пристрою.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Штучний інтелект. Системи спілкування та експертів тні системи. Кн. 1 / За ред. Е. В. Попова. - М.: Радіо і зв'язок, 1990. - 461 с.
2. Оппенгейн А.В., Шафер Р.В. Цифрова обробка сигналів, М.: Радіо і зв'язок, 1979., 347 с.
3. Рабинер Л.Р. Шафер Р.В. Цифрова обробка мовних сигналів, М.: Радіо і зв'язок, 1981., 258 с.
4. Литюк В.І. Методичний посібник № 2231 частина 3 «Методи розрахунку і проектування цифрових багатопроцесорних пристроїв обробки радіосигналів», Таганрог, 1995, 48 с.
5. Кузнєцов В., Отт А. Автоматичний синтез мови. - Таллінн: Валгус, 1989. - 135 с.
6. Методи автоматичного розпізнавання мови / За ред. У.Лі. - М.: Світ, 1983. - 716 с.
7. Зіндер Л.Р. Загальна фонетика. - М.: Вища школа, 1979. - 312 с.
8. Златоустова Л.В., Потапова Р.К., Трунін-Донський В.М. Загальна та прикладна фонетика. М.: МГУ, 1986. - 304 с.
9. Ліндсей П., Нордман Д. Переробка інформації у людини. - М.: Світ, 1974. - 550 с.
10. Потапова Р.К. Мовленнєвий управління роботом. - М.: Радіо і зв'язок, 1989. - 248 с.
11. Бакаєва Т.М. Системний аналіз безпеки: Методична розробка до самостійної роботи з курсу «Безпека життєдіяльності». Таганрог: ТРТУ, 1995, 18 с.
12. Бакаєва Т.М. Безпека життєдіяльності. Частина 2: Безпека в умовах виробництва: Навчальний посібник. Таганрог: ТРТУ, 1997, 318 с.
13. Фрумкін Г.А. «Розрахунок і конструювання РЕА», Москва: Вища школа, 1997, 289 с.

Додаток

1. Лістинг програми - Speech Recognition
1.1) WaveIn.cs
/ / Speech recognition
/ / Wavein => operations on incoming sound signal
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace SoundViewer
{
internal class WaveInHelper
{
public static void Try (int err)
{
if (err! = WaveNative.MMSYSERR_NOERROR)
throw new Exception (err.ToString ());
}
}
public delegate void BufferDoneEventHandler (IntPtr data, int size);
internal class WaveInBuffer: IDisposable
{
public WaveInBuffer NextBuffer;
private AutoResetEvent m_RecordEvent = new AutoResetEvent (false);
private IntPtr m_WaveIn;
private WaveNative.WaveHdr m_Header;
private byte [] m_HeaderData;
private GCHandle m_HeaderHandle;
private GCHandle m_HeaderDataHandle;
private bool m_Recording;
internal static void WaveInProc (IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
{
if (uMsg == WaveNative.MM_WIM_DATA)
{
try
{
GCHandle h = (GCHandle) wavhdr.dwUser;
WaveInBuffer buf = (WaveInBuffer) h.Target;
buf.OnCompleted ();
}
catch
{
}
}
}
public WaveInBuffer (IntPtr waveInHandle, int size)
{
m_WaveIn = waveInHandle;
m_HeaderHandle = GCHandle.Alloc (m_Header, GCHandleType.Pinned);
m_Header.dwUser = (IntPtr) GCHandle.Alloc (this);
m_HeaderData = new byte [size];
m_HeaderDataHandle = GCHandle.Alloc (m_HeaderData, GCHandleType.Pinned);
m_Header.lpData = m_HeaderDataHandle.AddrOfPinnedObject ();
m_Header.dwBufferLength = size;
WaveInHelper.Try (WaveNative.waveInPrepareHeader (m_WaveIn, ref m_Header, Marshal.SizeOf (m_Header)));
}
~ WaveInBuffer ()
{
Dispose ();
}
public void Dispose ()
{
if (m_Header.lpData! = IntPtr.Zero)
{
WaveNative.waveInUndivpareHeader (m_WaveIn, ref m_Header, Marshal.SizeOf (m_Header));
m_HeaderHandle.Free ();
m_Header.lpData = IntPtr.Zero;
}
m_RecordEvent.Close ();
if (m_HeaderDataHandle.IsAllocated)
m_HeaderDataHandle.Free ();
GC.SupdivssFinalize (this);
}
public int Size
{
get {return m_Header.dwBufferLength;}
}
public IntPtr Data
{
get {return m_Header.lpData;}
}
public bool Record ()
{
lock (this)
{
m_RecordEvent.Reset ();
m_Recording = WaveNative.waveInAddBuffer (m_WaveIn, ref m_Header, Marshal.SizeOf (m_Header)) == WaveNative.MMSYSERR_NOERROR;
return m_Recording;
}
}
public void WaitFor ()
{
if (m_Recording)
m_Recording = m_RecordEvent.WaitOne ();
else
Thread.Sleep (0);
}
private void OnCompleted ()
{
m_RecordEvent.Set ();
m_Recording = false;
}
}
public class WaveInRecorder: IDisposable
{
private IntPtr m_WaveIn;
private WaveInBuffer m_Buffers; / / linked list
private WaveInBuffer m_CurrentBuffer;
private Thread m_Thread;
private BufferDoneEventHandler m_DoneProc;
private bool m_Finished;
private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate (WaveInBuffer.WaveInProc);
public static int DeviceCount
{
get {return WaveNative.waveInGetNumDevs ();}
}
public WaveInRecorder (int device, WaveFormat format, int bufferSize, int bufferCount, BufferDoneEventHandler doneProc)
{
m_DoneProc = doneProc;
WaveInHelper.Try (WaveNative.waveInOpen (out m_WaveIn, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));
AllocateBuffers (bufferSize, bufferCount);
for (int i = 0; i <bufferCount; i + +)
{
SelectNextBuffer ();
m_CurrentBuffer.Record ();
}
WaveInHelper.Try (WaveNative.waveInStart (m_WaveIn));
m_Thread = new Thread (new ThreadStart (ThreadProc));
m_Thread.Start ();
}
~ WaveInRecorder ()
{
Dispose ();
}
public void Dispose ()
{
if (m_Thread! = null)
try
{
m_Finished = true;
if (m_WaveIn! = IntPtr.Zero)
WaveNative.waveInReset (m_WaveIn);
WaitForAllBuffers ();
m_Thread.Join ();
m_DoneProc = null;
FreeBuffers ();
if (m_WaveIn! = IntPtr.Zero)
WaveNative.waveInClose (m_WaveIn);
}
finally
{
m_Thread = null;
m_WaveIn = IntPtr.Zero;
}
GC.SupdivssFinalize (this);
}
private void ThreadProc ()
{
while (! m_Finished)
{
Advance ();
if (m_DoneProc! = null & &! m_Finished)
m_DoneProc (m_CurrentBuffer.Data, m_CurrentBuffer.Size);
m_CurrentBuffer.Record ();
}
}
private void AllocateBuffers (int bufferSize, int bufferCount)
{
FreeBuffers ();
if (bufferCount> 0)
{
m_Buffers = new WaveInBuffer (m_WaveIn, bufferSize);
WaveInBuffer Prev = m_Buffers;
try
{
for (int i = 1; i <bufferCount; i + +)
{
WaveInBuffer Buf = new WaveInBuffer (m_WaveIn, bufferSize);
Prev.NextBuffer = Buf;
Prev = Buf;
}
}
finally
{
Prev.NextBuffer = m_Buffers;
}
}
}
private void FreeBuffers ()
{
m_CurrentBuffer = null;
if (m_Buffers! = null)
{
WaveInBuffer First = m_Buffers;
m_Buffers = null;
WaveInBuffer Current = First;
do
{
WaveInBuffer Next = Current.NextBuffer;
Current.Dispose ();
Current = Next;
} While (Current! = First);
}
}
private void Advance ()
{
SelectNextBuffer ();
m_CurrentBuffer.WaitFor ();
}
private void SelectNextBuffer ()
{
m_CurrentBuffer = m_CurrentBuffer == null? m_Buffers: m_CurrentBuffer.NextBuffer;
}
private void WaitForAllBuffers ()
{
WaveInBuffer Buf = m_Buffers;
while (Buf.NextBuffer! = m_Buffers)
{
Buf.WaitFor ();
Buf = Buf.NextBuffer;
}
}
}
}
1.2) WaveOut.cs
/ / Speech recognition
/ / Waveout => show graph on screen
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace SoundViewer
{
internal class WaveOutHelper
{
public static void Try (int err)
{
if (err! = WaveNative.MMSYSERR_NOERROR)
throw new Exception (err.ToString ());
}
}
public delegate void BufferFillEventHandler (IntPtr data, int size);
internal class WaveOutBuffer: IDisposable
{
public WaveOutBuffer NextBuffer;
private AutoResetEvent m_PlayEvent = new AutoResetEvent (false);
private IntPtr m_WaveOut;
private WaveNative.WaveHdr m_Header;
private byte [] m_HeaderData;
private GCHandle m_HeaderHandle;
private GCHandle m_HeaderDataHandle;
private bool m_Playing;
internal static void WaveOutProc (IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
{
if (uMsg == WaveNative.MM_WOM_DONE)
{
try
{
GCHandle h = (GCHandle) wavhdr.dwUser;
WaveOutBuffer buf = (WaveOutBuffer) h.Target;
buf.OnCompleted ();
}
catch
{
}
}
}
public WaveOutBuffer (IntPtr waveOutHandle, int size)
{
m_WaveOut = waveOutHandle;
m_HeaderHandle = GCHandle.Alloc (m_Header, GCHandleType.Pinned);
m_Header.dwUser = (IntPtr) GCHandle.Alloc (this);
m_HeaderData = new byte [size];
m_HeaderDataHandle = GCHandle.Alloc (m_HeaderData, GCHandleType.Pinned);
m_Header.lpData = m_HeaderDataHandle.AddrOfPinnedObject ();
m_Header.dwBufferLength = size;
WaveOutHelper.Try (WaveNative.waveOutPrepareHeader (m_WaveOut, ref m_Header, Marshal.SizeOf (m_Header)));
}
~ WaveOutBuffer ()
{
Dispose ();
}
public void Dispose ()
{
if (m_Header.lpData! = IntPtr.Zero)
{
WaveNative.waveOutUndivpareHeader (m_WaveOut, ref m_Header, Marshal.SizeOf (m_Header));
m_HeaderHandle.Free ();
m_Header.lpData = IntPtr.Zero;
}
m_PlayEvent.Close ();
if (m_HeaderDataHandle.IsAllocated)
m_HeaderDataHandle.Free ();
GC.SupdivssFinalize (this);
}
public int Size
{
get {return m_Header.dwBufferLength;}
}
public IntPtr Data
{
get {return m_Header.lpData;}
}
public bool Play ()
{
lock (this)
{
m_PlayEvent.Reset ();
m_Playing = WaveNative.waveOutWrite (m_WaveOut, ref m_Header, Marshal.SizeOf (m_Header)) == WaveNative.MMSYSERR_NOERROR;
return m_Playing;
}
}
public void WaitFor ()
{
if (m_Playing)
{
m_Playing = m_PlayEvent.WaitOne ();
}
else
{
Thread.Sleep (0);
}
}
public void OnCompleted ()
{
m_PlayEvent.Set ();
m_Playing = false;
}
}
public class WaveOutPlayer: IDisposable
{
private IntPtr m_WaveOut;
private WaveOutBuffer m_Buffers; / / linked list
private WaveOutBuffer m_CurrentBuffer;
private Thread m_Thread;
private BufferFillEventHandler m_FillProc;
private bool m_Finished;
private byte m_zero;
private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate (WaveOutBuffer.WaveOutProc);
public static int DeviceCount
{
get {return WaveNative.waveOutGetNumDevs ();}
}
public WaveOutPlayer (int device, WaveFormat format, int bufferSize, int bufferCount, BufferFillEventHandler fillProc)
{
m_zero = format.wBitsPerSample == 8? (Byte) 128: (byte) 0;
m_FillProc = fillProc;
WaveOutHelper.Try (WaveNative.waveOutOpen (out m_WaveOut, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));
AllocateBuffers (bufferSize, bufferCount);
m_Thread = new Thread (new ThreadStart (ThreadProc));
m_Thread.Start ();
}
~ WaveOutPlayer ()
{
Dispose ();
}
public void Dispose ()
{
if (m_Thread! = null)
try
{
m_Finished = true;
if (m_WaveOut! = IntPtr.Zero)
WaveNative.waveOutReset (m_WaveOut);
m_Thread.Join ();
m_FillProc = null;
FreeBuffers ();
if (m_WaveOut! = IntPtr.Zero)
WaveNative.waveOutClose (m_WaveOut);
}
finally
{
m_Thread = null;
m_WaveOut = IntPtr.Zero;
}
GC.SupdivssFinalize (this);
}
private void ThreadProc ()
{
while (! m_Finished)
{
Advance ();
if (m_FillProc! = null & &! m_Finished)
m_FillProc (m_CurrentBuffer.Data, m_CurrentBuffer.Size);
else
{
/ / Zero out buffer
byte v = m_zero;
byte [] b = new byte [m_CurrentBuffer.Size];
for (int i = 0; i <b.Length; i + +)
b [i] = v;
Marshal.Copy (b, 0, m_CurrentBuffer.Data, b.Length);
}
m_CurrentBuffer.Play ();
}
WaitForAllBuffers ();
}
private void AllocateBuffers (int bufferSize, int bufferCount)
{
FreeBuffers ();
if (bufferCount> 0)
{
m_Buffers = new WaveOutBuffer (m_WaveOut, bufferSize);
WaveOutBuffer Prev = m_Buffers;
try
{
for (int i = 1; i <bufferCount; i + +)
{
WaveOutBuffer Buf = new WaveOutBuffer (m_WaveOut, bufferSize);
Prev.NextBuffer = Buf;
Prev = Buf;
}
}
finally
{
Prev.NextBuffer = m_Buffers;
}
}
}
private void FreeBuffers ()
{
m_CurrentBuffer = null;
if (m_Buffers! = null)
{
WaveOutBuffer First = m_Buffers;
m_Buffers = null;
WaveOutBuffer Current = First;
do
{
WaveOutBuffer Next = Current.NextBuffer;
Current.Dispose ();
Current = Next;
} While (Current! = First);
}
}
private void Advance ()
{
m_CurrentBuffer = m_CurrentBuffer == null? m_Buffers: m_CurrentBuffer.NextBuffer;
m_CurrentBuffer.WaitFor ();
}
private void WaitForAllBuffers ()
{
WaveOutBuffer Buf = m_Buffers;
while (Buf.NextBuffer! = m_Buffers)
{
Buf.WaitFor ();
Buf = Buf.NextBuffer;
}
}
}
}
1.3) SignalGenerator.cs
/ / Speech recognition
/ / Singal generator => to generate various signals like sawtooth ...
using System;
using System.Collections.Generic;
using System.Text;
namespace SoundViewer
{
class SignalGenerator
{
private string _waveForm = "Sine";
private double _amplitude = 128.0;
private double _samplingRate = 44100;
private double _frequency = 5000.0;
private double _dcLevel = 0.0;
private double _noise = 0.0;
private int _samples = 16384;
private bool _addDCLevel = false;
private bool _addNoise = false;
public SignalGenerator ()
{
}
public void SetWaveform (string waveForm)
{
_waveForm = waveForm;
}
public String GetWaveform ()
{
return _waveForm;
}
public void SetAmplitude (double amplitude)
{
_amplitude = amplitude;
}
public double GetAmplitude ()
{
return _amplitude;
}
public void SetFrequency (double frequency)
{
_frequency = frequency;
}
public double GetFrequency ()
{
return _frequency;
}
public void SetSamplingRate (double rate)
{
_samplingRate = rate;
}
public double GetSamplingRate ()
{
return _samplingRate;
}
public void SetSamples (int samples)
{
_samples = samples;
}
public int GetSamples ()
{
return _samples;
}
public void SetDCLevel (double dc)
{
_dcLevel = dc;
}
public double GetDCLevel ()
{
return _dcLevel;
}
public void SetNoise (double noise)
{
_noise = noise;
}
public double GetNoise ()
{
return _noise;
}
public void SetDCLevelState (bool dcstate)
{
_addDCLevel = dcstate;
}
public bool IsDCLevel ()
{
return _addDCLevel;
}
public void SetNoiseState (bool noisestate)
{
_addNoise = noisestate;
}
public bool IsNoise ()
{
return _addNoise;
}
public double [] GenerateSignal ()
{
double [] values ​​= new double [_samples];
if (_waveForm.Equals ("Sine"))
{
double theta = 2.0 * Math.PI * _frequency / _samplingRate;
for (int i = 0; i <_samples; i + +)
{
values ​​[i] = _amplitude * Math.Sin (i * theta);
}
}
if (_waveForm.Equals ("Cosine"))
{
double theta = 2.0f * (double) Math.PI * _frequency / _samplingRate;
for (int i = 0; i <_samples; i + +)
values ​​[i] = _amplitude * Math.Cos (i * theta);
}
if (_waveForm.Equals ("Square"))
{
double p = 2.0 * _frequency / _samplingRate;
for (int i = 0; i <_samples; i + +)
values ​​[i] = Math.Round (i * p)% 2 == 0? _amplitude:-_amplitude;
}
if (_waveForm.Equals ("Triangular"))
{
double p = 2.0 * _frequency / _samplingRate;
for (int i = 0; i <_samples; i + +)
{
int ip = (int) Math.Round (i * p);
values ​​[i] = 2.0 * _amplitude * (1 - 2 * (ip% 2)) * (i * p - ip);
}
}
if (_waveForm.Equals ("Sawtooth"))
{
for (int i = 0; i <_samples; i + +)
{
double q = i * _frequency / _samplingRate;
values ​​[i] = 2.0 * _amplitude * (q - Math.Round (q));
}
}
if (_addDCLevel)
{
for (int i = 0; i <_samples; i + +)
values ​​[i] + = _dcLevel;
}
if (_addNoise)
{
Random r = new Random ();
for (int i = 0; i <_samples; i + +)
values ​​[i] + = _noise * r.Next ();
}
return values;
}
}
}
1.4) AudioFrame.cs
/ / Speech recognition
/ / Audioframe => working on audio frame
using System;
using System.Drawing;
using System.Windows.Forms;
namespace SoundViewer
{
class AudioFrame
{
private Bitmap _canvasTimeDomain;
private Bitmap _canvasFrequencyDomain;
private double [] _waveLeft;
private double [] _waveRight;
private double [] _fftLeft;
private double [] _ftRight;
private SignalGenerator _signalGenerator;
private bool _isTest = false;
public AudioFrame (bool isTest)
{
_isTest = isTest;
}
/ / / <summary>
/ / / Process 16 bit sample
/ / / </ Summary>
/ / / <param Name="wave"> </ param>
public void Process (ref byte [] wave)
{
_waveLeft = new double [wave.Length / 4];
_waveRight = new double [wave.Length / 4];
if (_isTest == false)
{
/ / Split out channels from sample
int h = 0;
for (int i = 0; i <wave.Length; i + = 4)
{
_waveLeft [h] = (double) BitConverter.ToInt16 (wave, i);
_waveRight [h] = (double) BitConverter.ToInt16 (wave, i + 2);
h + +;
}
}
else
{
/ / Generate artificial sample for testing
_signalGenerator = new SignalGenerator ();
_signalGenerator.SetWaveform ("Sine");
_signalGenerator.SetSamplingRate (44100);
_signalGenerator.SetSamples (16384);
_signalGenerator.SetFrequency (5000);
_waveLeft = _signalGenerator.GenerateSignal ();
_waveRight = _signalGenerator.GenerateSignal ();
}
/ / Generate frequency domain data in decibels
_fftLeft = FourierTransform.FFTDb (ref _waveLeft);
_fftRight = FourierTransform.FFTDb (ref _waveRight);
}
/ / / Render time domain to PictureBox
public void RenderTimeDomain (ref PictureBox pictureBox)
{
/ / Set up for drawing
_canvasTimeDomain = new Bitmap (pictureBox.Width, pictureBox.Height);
Graphics offScreenDC = Graphics.FromImage (_canvasTimeDomain);
SolidBrush brush = new System.Drawing.SolidBrush (Color.FromArgb (0, 0, 0));
Pen pen = new System.Drawing.Pen (Color.WhiteSmoke);
/ / Determine channnel boundries
int width = _canvasTimeDomain.Width;
int center = _canvasTimeDomain.Height / 2;
int height = _canvasTimeDomain.Height;
offScreenDC.DrawLine (pen, 0, center, width, center);
int leftLeft = 0;
int leftTop = 0;
int leftRight = width;
int leftBottom = center - 1;
int rightLeft = 0;
int rightTop = center + 1;
int rightRight = width;
int rightBottom = height;
/ / Draw left channel
double yCenterLeft = (leftBottom - leftTop) / 2;
double yScaleLeft = 0.5 * (leftBottom - leftTop) / 32768; / / a 16 bit sample has values ​​from -32768 to 32767
int xPrevLeft = 0, yPrevLeft = 0;
for (int xAxis = leftLeft; xAxis <leftRight; xAxis + +)
{
int yAxis = (int) (yCenterLeft + (_waveLeft [_waveLeft.Length / (leftRight - leftLeft) * xAxis] * yScaleLeft));
if (xAxis == 0)
{
xPrevLeft = 0;
yPrevLeft = yAxis;
}
else
{
pen.Color = Color.LimeGreen;
offScreenDC.DrawLine (pen, xPrevLeft, yPrevLeft, xAxis, yAxis);
xPrevLeft = xAxis;
yPrevLeft = yAxis;
}
}
/ / Draw right channel
int xCenterRight = rightTop + ((rightBottom - rightTop) / 2);
double yScaleRight = 0.5 * (rightBottom - rightTop) / 32768; / / a 16 bit sample has values ​​from -32768 to 32767
int xPrevRight = 0, yPrevRight = 0;
for (int xAxis = rightLeft; xAxis <rightRight; xAxis + +)
{
int yAxis = (int) (xCenterRight + (_waveRight [_waveRight.Length / (rightRight - rightLeft) * xAxis] * yScaleRight));
if (xAxis == 0)
{
xPrevRight = 0;
yPrevRight = yAxis;
}
else
{
pen.Color = Color.LimeGreen;
offScreenDC.DrawLine (pen, xPrevRight, yPrevRight, xAxis, yAxis);
xPrevRight = xAxis;
yPrevRight = yAxis;
}
}
/ / Clean up
pictureBox.Image = _canvasTimeDomain;
offScreenDC.Dispose ();
}
/ / / <summary>
/ / / Render frequency domain to PictureBox
/ / / </ Summary>
/ / / <param Name="pictureBox"> </ param>
public void RenderFrequencyDomain (ref PictureBox pictureBox)
{
/ / Set up for drawing
_canvasFrequencyDomain = new Bitmap (pictureBox.Width, pictureBox.Height);
Graphics offScreenDC = Graphics.FromImage (_canvasFrequencyDomain);
SolidBrush brush = new System.Drawing.SolidBrush (Color.FromArgb (0, 0, 0));
Pen pen = new System.Drawing.Pen (Color.WhiteSmoke);
/ / Determine channnel boundries
int width = _canvasFrequencyDomain.Width;
int center = _canvasFrequencyDomain.Height / 2;
int height = _canvasFrequencyDomain.Height;
offScreenDC.DrawLine (pen, 0, center, width, center);
int leftLeft = 0;
int leftTop = 0;
int leftRight = width;
int leftBottom = center - 1;
int rightLeft = 0;
int rightTop = center + 1;
int rightRight = width;
int rightBottom = height;
/ / Draw left channel
for (int xAxis = leftLeft; xAxis <leftRight; xAxis + +)
{
double amplitude = (int) _fftLeft [(int) (((double) (_fftLeft.Length) / (double) (width)) * xAxis)];
if (amplitude <0) / / Drop negative values
amplitude = 0;
int yAxis = (int) (leftTop + ((leftBottom - leftTop) * amplitude) / 100); / / Arbitrary factor
pen.Color = Color.FromArgb (120, 120, (int) amplitude% 255);
offScreenDC.DrawLine (pen, xAxis, leftTop, xAxis, yAxis);
}
/ / Draw right channel
for (int xAxis = rightLeft; xAxis <rightRight; xAxis + +)
{
double amplitude = (int) _fftRight [(int) (((double) (_fftRight.Length) / (double) (width)) * xAxis)];
if (amplitude <0)
amplitude = 0;
int yAxis = (int) (rightBottom - ((rightBottom - rightTop) * amplitude) / 100);
pen.Color = Color.FromArgb (120, 120, (int) amplitude% 255);
offScreenDC.DrawLine (pen, xAxis, rightBottom, xAxis, yAxis);
}
/ / Clean up
pictureBox.Image = _canvasFrequencyDomain;
offScreenDC.Dispose ();
}
void WaveIn (short * buf, int len)
{
/ / Raspoznavat
}


}
}
2. Лістинг програми - Speech Recognition (Matlab)
2.1) CMN.m
function NormMatrix = CMN (Matrix)
[R, c] = size (Matrix);
NormMatrix = zeros (г, c);
for i = 1: c
MatMean = mean (Matrix (:, i));% Derives mean for each column i in utterance
NormMatrix (:, i) = Matrix (:, i)-MatMean;% Subtracts mean from each element in
End
2.2) Recognition.m
clear all;
close all;
ncoeff = 13;% Required number of mfcc coefficients
N = 20;% Number of words in vocabulary
k = 3;% Number of nearest neighbors to choose
fs = 16000;% Sampling rate
duration1 = 0.1;% Initial silence duration in seconds
duration2 = 2;% Recording duration in seconds
G = 2;% vary this factor to compensate for amplitude variations
NSpeakers = 5;% Number of training speakers
fprintf ('Press any key to start% g seconds of speech recording ...', duration2);
pause;
silence = wavrecord (duration1 * fs, fs);
fprintf ('Recording speech ...');
speechIn = wavrecord (duration2 * fs, fs);% duration * fs is the total number of sample points
fprintf ('Finlshed recording. \ n');
fprintf ('System is trying to recognize what you have spoken ... \ n');
speechIn1 = [silence; speechIn];% pads with 150 ms silence
speechIn2 = speechIn1 .* G;
speechIn3 = speechIn2 - mean (speechIn2);% DC offset elimination
speechIn = nreduce (speechIn3, fs);% Applies spectral subtraction
rMatrix1 = mfccf (ncoeff, speechIn, fs);% Compute test feature vector
rMatrix = CMN (rMatrix1);% Removes convolutional noise
Sco = DTWScores (rMatrix, N);% computes all DTW scores
[SortedScores, EIndex] = sort (Sco);% Sort scores increasing
K_Vector = EIndex (1: k);% Gets k lowest scores
Neighbors = zeros (1, k);% will hold kN neighbors
for t = 1: k
u = K_Vector (t);
for r = 1: NSpeakers-1
if u <= (N)
break
else u = u - (N);
end
end
Neighbors (t) = N;

end
% Apply k-Nearest Neighbor rule
Nbr = Neighbors
% Sortk = sort (Nbr);
[Modal.Freq] = mode (Nbr);% most frequent value
Word = strvcat ('One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Yes', 'No ',' Hello ',' Open ',' Close ',' Start ',' Stop ',' Dial ',' On ',' Off ');
if mean (abs (speechIn)) <0.01
fprintf ('No microphone connected or you have not said anything. \ n');
elseif ((k / Freq)> 2)% if no majority
fprintf ('The word you have said could not be properly recognised. \ n');
else
fprintf ('You have just said% s. \ n', Word (Modal ,:));% Prints recognized word
end
2.3) setTemplates.m
ncoeff = 13;% Required number of mfcc coefficients
fMatrix1 = cell (1,20);
fMatrix2 = cell (1,20);
fMatrix3 = cell (1,20);
fMatrix4 = cell (1,20);
for j = 1:20
q = ['C: \ SpeechData \ Amir \ 5_' num2str (j) '. wav'];
[SpeechIn1, FS1] = wavread (q);
speechIn1 = myVAD (speechIn1);% Speech endpoint trimming
fMatrix1 (1, j) = {mfccf (ncoeff, speechIn1, FS1)};% MFCC coefficients are
% Computed here
end
for k = 1:20
q = ['C: \ SpeechData \ Ayo \ 5_' num2str (k) '. wav'];
[SpeechIn2, FS2] = wavread (q);
speechIn2 = myVAD (speechIn2);
fMatrix2 (1, k) = {mfcvcf (ncoeff, speechIn2, FS2)};
end
for l = 1:20
q = ['C: \ SpeechData \ Sameh \ 5_' num2str (l) '. wav'];
[SpeechIn3, F3] = wavread (q);
speechIn3 = myVAD (speechIn3);
fMatrix3 (1, l) = {mfccf (ncoeff, speechIn3, FS3)};
end
for m = 1:20
q = ['C: \ SpeechData \ Jim \ 5_' num2str (m) '. wav'];
[SpeechIn4, FS4] = wavread (q);
speechIn4 = myVAD (speechIn4);
fMatrix4 (1, m) = {mfccf (ncoeff, speechIn4, FS4)};
end
for n = 1:20
q = ['C: \ SpeechData \ Tope \ 5_' num2str (n) '. wav'];
[SpeechIn5, FS5] = wavread (q);
speechIn5 = myVAD (speechIn5);
fMatrix5 (1, n) = {mfccf (ncoeff, speechIn5, FS5)};
end
% Converts the cells containing all matrices to structures and save
% Structures in matlab. Mat files in the working directory.
fields = {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Yes', 'No' , 'Hello', 'Open', 'Close', 'Start', 'Stop', 'Dial', 'On', 'Off'};
s1 = cell2struct (fMatrix1, fields, 2);
save Vectors1.mat-struct s1;
s2 = cell2struct (fMatrix2, fields, 2);
save Vectors2.mat-struct s2;
s3 = cell2struct (fMatrix3, fields, 2);
save Vectors3.mat-struct s3;
s4 = cell2struct (fMatrix4, fields, 2);
save Vectors4.mat-struct s4;
s5 = cell2struct (fMatrix5, fields, 2);
save Vectors5.mat-struct s5;
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Диплом
257.3кб. | скачати


Схожі роботи:
Захист мовної інформації в каналах звязку
Умови і причини утворення технічних каналів витоку мовної інформації
Умови освіти витоків мовної інформації з використанням ЗУ РЗУ спеціальних дій і випадкових
Умови утворення просочувань мовної інформації з використанням ЗУ РЗУ спеціальних дій і випадкових
Мова як система рівні мовної системи Фонеми Морфеми Пропозиція
Система маркетингової інформації
Система маркетингової інформації
Математична система інформації
Система маркетингової інформації
© Усі права захищені
написати до нас