Голосовое воспроизведение текста

2









 

КУРСОВАЯ РАБОТА

«Голосовое воспроизведение текста»



















Выполнила:



Допущен к защите:

«



»



2010 г.

Научный руководитель:








Содержание

Глава 1. Выбор программных средств	3

		    1.1.	Выбор средств разработки	3

		    1.2.	Дополнительные компоненты	3

Глава 2. Анализ предметной области и создание концептуальной модели	3

	    2.1. Сбор информации о предметной области	3

	    2.2. Выделение сущностей	3

Глава 3. Программная реализация	3

	    3.1. Логическая структура программы	3

		    3.2.	Подключение готовых библиотек кода	3

Заключение	3

Список используемых источников	38

Приложение а. Внешний вид программы	19

 




Введение



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

Самые крупные компании ведут учёт занятости всех рабочих в больших базах данных, которые управляются компьютерными программами. 

Подобные программы и базы данных используются в таких сферах деятельности бизнеса, как предоставление потребительских счетов, контроль за полученными и возможными денежными поступлениями, контроль над необходимым объёмом предложения и количеством произведённой, хранимой, поставленной на рынок и проданной продукции.

В малом масштабе многие предприятия заменили уже кассовый аппарат специальным кассовым терминалом.

Компьютеры появились очень давно в нашем мире, но только в последнее время их начали так усиленно использовать во многих отраслях человеческой жизни. Ещё десять лет назад было редкостью увидеть какой-нибудь персональный компьютер — они были, но были очень дорогие, и даже не каждая фирма могла иметь у себя в офисе компьютер. А теперь? Теперь в каждом третьем доме есть компьютер, который уже глубоко вошёл в жизнь самих обитателей дома.

Такое широкое использование и объясняет наличие огромного количества программных продуктов для удовлетворения интересов человека. Речь пойдёт о виртуальных учебниках.

Электронные книги сегодня медленно, но уверенно отвоёвывают всё новые и новые позиции у традиционных, бумажных книг. Многие люди сегодня предпочитают, скачав из Интернета текст интересующей их книги, прочесть её на экране монитора. Однако многие пользователи предпочитают прослушивать её в целях бережливости своего зрения или в силу каких-либо других причин. Но особенно актуален этот вопрос для незрячих и слабовидящих пользователей ПК, которые ограничены в выборе альтернативных источников получения информации методом её прочтения. 

Даная задача ставиться перед различного рода прикладными программами, создаваемыми для прослушивания загружаемых в них электронных учебников. Они существенно облегчают жизнь не только слабовидящих людей, но и дают возможность не терять времени, которое уходит сидя за чтением книги. Благодаря таким программам можно «читать» книгу и одновременно делать что-то ещё.

Цель данной курсовой работы – это создание такого приложения, которое сможет прочитать пользователю ту книгу в электронном варианте, которую он сам захочет.

Для реализации этого проекта необходимо решить следующие задачи:

Подбор материалов и сервисов чтения.

Моделирование предметной области и обоснование выбранных средств разработки проекта.

Программная реализация проекта.


Глава 1. Выбор программных средств

Выбор средств разработки



Программиста, привыкший к платформе Майкрософт, может представить себе C Sharp как промежуточный вариант между C++ и Visual Basic, если рассматривать сложность языковых конструкций и возможности языка.

C Sharp имеет C стиль синтаксиса (для управляющих конструкций, блоков кода, описания сигнатуры методов и др.), много общего с Java (отсутствие множественного наследования и шаблонов, наличие сборщика мусора) и Дельфи (ориентированность на создание компонент), в то же время имеет и свой колорит.

При создании языка в основу дизайна легла легкость использования, доминирующая над мощностью языка и скоростью выполнения. Отсюда и сборщик мусора с управляемыми объектными ссылками, который автоматически освобождает за Вас память, отбирая при этом процессорное время. Вы также получаете безопасность работы с типами, а это по мнению многих является вторым важнейшим фактором избежания ошибок.

C Sharp объектно-ориентированный язык, как и вся платформа .NET. Более того, это язык, ориентированный на написание компонент. C Sharp создан для программирования в управляемой среде с присутствующим сборщиком мусора, но позволяет писать и неуправляемый (unmanaged) код. 

Цельность концепции видна, скажем в реализации упаковки/распаковки. Это позволяет рассматривать все типы (даже примитивные) как объекты, что разрешает многие проблемы дизайна приложений.

При создании языка рассматривалась не только простота написания приложений, но и их поддержки - в связи с чем в язык включили поддержку XML комментариев и контроля версий. Настоящий подарок для программистов.

Помимо сборщика мусора и безопасности работы с типами для избежания ошибок в языке также применяется автоматическая инициализация переменных. Все типы, которые размещаются в стеке (value types, к которым относятся примитивные типы, структуры и прочие наследники класса ValueType) инициализируются нулями. Объекты остальных типов размещаются в куче, доступ к ним осуществляется по объектной ссылке, и ссылки эти инициализируются в значение null (которая говорит, что данная ссылка не имеет ассоциированного объекта в куче).

В C Sharp представлена концепция пространств имен, аналогичная пакетам в Java. Это позволяет иерархически структурировать Вашу систему типов, делая код намного более понятным и позволяя избежать проблем с именованием. Вы можете рассматривать пространства имен как директории, а языковые типы как файлы в этих директориях.

В языке для работы с событиями и обратными вызовами представлена новая концепция объектно-ориентировано и безопасной с точки зрения системы типов ссылки на функцию - "делегат". Именно эта концепция позволяет описывать события C Sharp компонента без возвратных интерфейсов и дополнительных усилий, достаточно использовать ключевое слово event.

Индексаторы и свойства органично дополняют события до создания описываемого сигнатурой компонента. 

C Sharp позволяет использовать при разработке парадигму атрибутивного программирования, когда в компиляционных модулях вместе с типом может сохраняться мета-информация. Данная информация впоследствии может быть получена и использована во время выполнения. Более того, этой информацией может воспользоваться компилятор или, скажем, дизайнер, что позволяет, не запуская компонент, получать информацию о нем.

Работа с атрибутам позволяет использовать COM, COM+ и DLL в C Sharp приложениях, работающих в среде .NET. Перечисления позволяют обезопасить работу с перечисляемыми типами.

Реализация структур как типов, работа с которыми идет по значению, вкупе с возможностью использовать не только вложенные массивы (как в Java), но и многомерные позволяет оптимизировать производительность приложений.

При написании стандартных приложений под .NET трудно подобрать более подходящий язык для реализации всех задуманных идей. По этой причине наилучшим вариантом программного продукта для написания курсовой работы является C Sharp.

 Дополнительные компоненты



При создании приложений, использующих платформу Microsoft .NET, возникает задача применения в собственных проектах уже готовых библиотек кода, написанных на других языках. Сжатые сроки разработки и уже имеющиеся программные блоки не позволяют отказаться от готовых решений, поэтому их приходится использовать, встраивая в структуру собственных проектов.

Код, выполняющийся под управлением среды выполнения (в случае платформы .NET — среды Common Language Runtime), называется управляемым. Напротив, код, запускаемый не под управлением среды, называется неуправляемым. Примером неуправляемого кода могут служить COM-компоненты, Microsoft ActiveX интерфейсы и функции API Win32.

Microsoft .NET Framework позволяет взаимодействовать с COM-компонентами, COM+-службами, внешними типами библиотек и разными службами операционной системы. Перехват исключений различается в управляемом и неуправляемом коде. Платформа .NET Framework предлагает две службы взаимодействия управляемого кода с неуправляемым — Platform Invoke и COM interoperability, которые используют реальные возможности проекта.

Объектная модель COM (Common Object Model) компонентов имеет некоторые существенные отличия от объектной модели компонентов .NET Framework.

		Управление жизненным циклом объектов. Клиенты СОМ-объектов сами управляют этим циклом, среда CLR платформы .NET берет эту задачу на себя.

		Обращение к службам и объектам. Клиенты COM-объектов узнают о функциональности службы путем опроса ее интерфейса, клиенты .NET-объектов могут получить описание функциональности, используя пространство имен Reflection.

		Среда CLR перемещает объекты в памяти для улучшения производительности, обновляя ссылки этих объектов. Клиенты COM имеют постоянную ссылку на ячейки памяти, не изменяющуюся в течение всей жизни объекта.



Для преодоления этих различий CLR предлагает классы-оболочки, которые позволяют управляемым и неуправляемым клиентам думать, что они работают с объектами той же среды, что и они сами. Когда управляемый клиент вызывает неуправляемый метод, CLR создает временную оболочку RCW (Runtime Callable Wrapper). RCW абстрагирует различия между управляемым и неуправляемым кодом. CLR также создает оболочку CCW (COM Callable Wrapper) для обращения процесса, которая позволяет COM-объектам запускать методы .NET-объектов.

Часто требуется применение функций WinAPI, находящихся в файлах dll. Когда служба вызывает функцию, совершаются следующие операции:

		обнаружение необходимой библиотеки;

		загрузка найденной библиотеки в оперативную память;

		обнаружение адреса библиотеки в памяти и передача аргументов функции, с их преобразованием при необходимости;

		после этого передается управление неуправляемой функции и ждет завершения.

Для подключения функции необходимо представить адрес библиотеки и данные о функции: название, входящие и исходящие аргументы.






Глава 2. Анализ предметной области и создание концептуальной модели

2.1. Сбор информации о предметной области



Перед тем, как начать работу над проектом, необходимо изучить структуру DLL файлов, т.к. через подключение этих библиотек мы достигнем наиболее оптимального решения поставленной задачи.

DLL - это сокращение от Dynamic Link Library (динамически загружаемая библиотека). 

С формальной точки зрения DLL - особым образом оформленный относительно независимый блок исполняемого кода. 

Особый способ оформления предполагает наличие в DLL так называемых секций импорта и экспорта. Секция экспорта указывает те идентификаторы объектов (функций, классов, переменных), доступ к которым предоставляет данная DLL. В этом случае мы говорим об экспортировании идентификаторов из DLL. В общем случае, именно секция экспорта предоставляет особый интерес для разработчиков. Хотя ничто не мешает реализовать DLL, которая не имеет данной секции, но, тем не менее, выполняет полезную работу.

Относительная независимость связана с наличием/отсутствием секции импорта у DLL (т.е. секции, в которой описываются внешние зависимости данной DLL от других). Подавляющее большинство DLL (за исключением, быть может, DLL ресурсов) импортирует функции из системных DLL (kernel32.dll, user32.dll, gdi32.dll и др.). В большинстве случае при создании проекта в его опциях автоматически проставляется стандартный набор таких библиотек. Иногда в этот список необходимо добавить требующиеся для Ваших задач DLL (например, в случае использования библиотеки сокетов требуется дополнительно подключить библиотеку ws2_32.dll).

"Исполняемый" код в DLL не предполагает автономного использования. Перед тем, как можно будет приступить к использованию, необходимо загрузить DLL в область памяти вызывающего процесса (т.е. DLL не может выполняться сама по себе - ей обязательно нужен клиент). Это явление носит название "проецирование DLL на адресное пространство процесса". И это не удивительно, если вспомнить тот факт, что процессор работает не только с регистрами, но и с адресами памяти. Поэтому каждому объекту DLL требуется свое место "под солнцем", чтобы иметь возможность быть выполненным при вызове. В конечном коде exe-файла, который генерирует компилятор, не будет инструкций процессора, соответствующих коду данной функции. Вместо этого будет сгенерирована инструкция вызова соответствующей функции (call). Так как DLL отображена на адресное пространство процесса, то код DLL будет легко доступен по call-вызову.

Итак, формально, DLL - особым образом оформленный программный компонент, доступ к исполняемому коду которого приложение получает в момент старта (DLL неявной загрузки) или в момент использования (DLL явной и отложенной загрузки).



2.2. Выделение сущностей



При анализе предметной области были выделены следующие сущности и проблемы: на начальном этапе реализации требовалось создать текстовый редактор для отображения читаемого текста. Его задача заключается в том, чтобы пользователь мог полноценно воспользоваться всеми стандартными функциями редактирования текста. 

Затем – подключить имеющиеся голосовые движки и предоставить пользователю возможность самостоятельно выбрать понравившийся синтезатор речи.

Следующий этап разработки – создание удобного и понятного интерфейса, не требующего от пользователя высокого уровня компьютерной грамотности.


Глава 3. Программная реализация

   3.1. Логическая структура программы

		

Данная программа читает голосом любой текст. Язык чтения зависит от выбранного синтезатора речи. Она может читать  текст,  находящийся в окне программы. 

Кроме этого, программа обладает возможностями изменения скорости чтения и громкости, записи речи в звуковой wav-файл

Для корректной работы программы придется загрузить некоторые недостающие файлы – text-to-speech engine и SAPI 

TTS (text to speech) – технология, позволяющая синтезировать текст в его звуковое представление.

Text-to-speech engine (голосовой движок) – это набор файлов с описанием голоса. Позволяет синтезировать речь из текста. Существует много разных движков различных производителей. Движки отличаются качеством синтеза речи, количеством и характером голосов (мужчина, женщина, роботы), языком (русский, английский, французский, немецкий, ... ) и прочими параметрами. В Windows  уже есть голосовой движок SpeechAPI (Microsoft Sam), но стандартным языком для него является английский.

Порядок работы с Суфлером:

1.загружаем файл для чтения либо вводим свой текст;

2.выбираем синтезатор речи;

3.запускаем чтение текста.



 Подключение готовых библиотек кода



Для того чтобы использовать SpeechAPI нужно подключить СОМ-объект Microsoft Speech Object и прописать using SpeechLib. 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading;

using System.Windows.Forms;

using SpeechLib;

Для начала работы с SpeechAPI нужно объявить основной объект:



SpVoice m_voice;



Но при подключении только SpeechAPI программа будет говорить только на английском. 

Эту проблему решаем следующим образом: подключаем библиотеку SAPI_DLL. 

Для  начала необходимо  подключить нужное пространство  имен:


using System.Runtime.InteropServices;



Далее импортировать нужные функции. Для этого создадим отдельный класс SAPIDLL:


class SAPIDLL



Функция CreateSpeech:



[DllImport("SAPIDLL.DLL")]

 public static extern Int32 CreateSpeech();



реализует проверку работоспособности SAPI и, если это так,  инициализирует этот COM интерфейс. Эта функция вызывается первой, перед началом работы с остальными процедурами и функциями экспортируемыми SAPI_DLL.DLL. 

	Вызов этой функции сделан автоматическим, при загрузке SAPI_DLL.DLL: 



private void Form1_Load(object sender, EventArgs e)

{

 SAPIDLL.CreateSpeech();

for (int i = 1; i <= SAPIDLL.GetEnginesCount(); i++) comboBoxLang.Items.Add(SAPIDLL.PGetEngines(i));

}




Функция PSelectEngineNumber:



[DllImport("SAPIDLL.DLL")]

public static extern Int32 PSelectEngineNumber(Int32 EngineNumber);



осуществляет выбор Engina (синтезатора речи). Указывает, какой именно синтезатор речи необходимо задействовать для синтеза речи. Параметр EngineName должен содержать одно из имен доступных синтезаторов речи. Имена всех доступных синтезаторов можно получить, вызвав функцией GetEngines. Либо, нужно быть уверенным в том, что указывается  правильное(существующее) имя синтезатора.



Функция GetEnginesCount:



[DllImport("SAPIDLL.DLL")]

public static extern Int32 GetEnginesCount();



нужна для того, чтобы узнать количество дикторов установленных на компьютер.



Функция PSpeak:



[DllImport("SAPIDLL.DLL")]

 public static extern Int32 PSpeak(string Text);

функция для произнесения текста

private void button1_Click(object sender, EventArgs e)

{

 if (comboBoxLang.SelectedIndex == -1)

MessageBox.Show("Выберите синтезатор голоса");

else

{

SAPIDLL.PSelectEngineNumber(comboBoxLang.SelectedIndex);

SAPIDLL.PSpeak(richTextBox1.Text);

}

}




Функция PGetEngines:



[DllImport("SAPIDLL.DLL")]

public static extern string PGetEngines(int num);



возвращает имя диктора с порядковым номером number. Диктор может быть не выбран до вызова этой процедуры. Что бы узнать имена всех дикторов установленных на вашем компьютере используется  GetEnginesCount, а после  PGetEngines(0..GetEnginesCount-1). 



Следующая группа функций возвращает соответственно допустимые максимальные и минимальные значения скорости и громкости речи для выбранного синтезатора:



[DllImport("SAPIDLL.DLL")]

public static extern Int32 GetMaxSpeed();

[DllImport("SAPIDLL.DLL")]

public static extern Int32 GetMaxVolume();

[DllImport("SAPIDLL.DLL")]

public static extern Int32 GetMinSpeed();

[DllImport("SAPIDLL.DLL")]

public static extern Int32 GetMinVolume();

[DllImport("SAPIDLL.DLL")]





private void comboBoxLang_SelectedIndexChanged(object sender, EventArgs e)

{

SAPIDLL.PSelectEngineNumber(comboBoxLang.SelectedIndex);

trackBar2.Minimum = SAPIDLL.GetMinVolume();

trackBar2.Maximum = SAPIDLL.GetMaxVolume();

trackBar1.Minimum = SAPIDLL.GetMinSpeed();

trackBar1.Maximum = SAPIDLL.GetMaxSpeed();

}



Функции устанавливающие уровни  скорости и громкости для выбранного синтезатора:



[DllImport("SAPIDLL.DLL")]

public static extern Int32 SetSpeed(int num);

[DllImport("SAPIDLL.DLL")]

public static extern Int32 SetVolume(int num);




Перед вызовом этих функций следует  обратиться к приведенным выше функциям максимального и минимального значения скорости и громкости речи.



private void trackBar2_Scroll(object sender, EventArgs e)

{

SAPIDLL.SetVolume(trackBar2.Value);

}

private void trackBar1_Scroll(object sender, EventArgs e)

{

SAPIDLL.SetSpeed(trackBar1.Value);

}



Функция для остановки чтения. Очищает очередь синтеза.



[DllImport("SAPIDLL.DLL")]

public static extern void Stop();



private void button3_Click(object sender, EventArgs e)

{

SAPIDLL.Stop();

}



Функция,которая реализует паузу в синтезе речи. Синтез (чтение) может быть возобновлено вызовом процедуры Resume.



[DllImport("SAPIDLL.DLL")]

public static extern void Pause();



Для паузы обрабатывается событие нажатия клавиши:



private void button2_Click(object sender, EventArgs e)

{

 if (a)

{

SAPIDLL.Pause();

a = false;

}

else

{

SAPIDLL.Resume();

a = true;

}




Возобновляет чтение после вызова Pause функция Resume:



[DllImport("SAPIDLL.DLL")]

public static extern void Resume();




Заключение



В процессе  разработки данного курсового проекта были проведены работы, развивающие теоретические навыки с применением их при решении конкретной задачи проектирования и разработки "говорящей" программы, приобретены умения по выбору варианта проектирования и соответствующих инструментальных средств, закреплены навыки по работе с платформой .NET. 

В ходе выполнения курсового проекта был проведен анализ предметной области. Это позволило выделить функциональную задачу, решение которой целесообразно осуществить средствами ПЭВМ.

В результате проведенных исследований были выделены объекты данной предметной области и определены характеризующие их атрибуты. С учетом выбранной темы была разработана диалогическая модель и соответствующее программное обеспечение по обработке и введению текста в окно программы. Использование чётких алгоритмов позволило повысить надежность и эффективность работы приложения. Разработанное программное обеспечение рассчитано на массового пользователя и не требует от него высокого уровня компьютерной грамотности.

	Программа «Суфлёр» нужна тому, кто больше любит слушать тексты, чем читать их с экрана монитора или бережет свое зрение и хочет читать тексты электронных книг сидя подальше от монитора, кто хочет узнать, как звучат слова и фразы на иностранном языке. Она нужна всем, кто хочет научить свой компьютер говорить и кому просто любопытно узнать, как это все работает. «Суфлёр» просто незаменим для тех людей, которые не могут самостоятельно читать книги. Обратите внимание: для работы программе требуется, чтобы в системе был установлен голосовой движок (text-to-speech engine) и SAPI4.

В перспективе планируется разработка и подключение к приложению пользовательских словарей, а так же открытие и чтение книг в формате *.pdf.


Список используемых источников

Windows Presentation Foundation в .NET 3.5 с примерами на C# 2008 для профессионалов – Санкт-Петербург,  2009 – 922 с. 

Лабор В.В. С#. Создание приложений для Windows – Минск: Харвест, 2003 – 385 с. 

Г. Шилдт Полный справочник по C# / Г. Шилдт Москва: Вильямс, 

2004 – 752 с.

C# 2005 и платформа .Net 3.0 для профессионалов / К. Нейгел [и др.]; под общ. ред. Ю.Н. Артеменко – Москва: Вильямс

Голосовые движки http://dcp.sovserv.ru/program/16174/2007/01/30/golosovie_dviszki/






Приложение А

Внешний вид программы





Рис.1. Открытие файла





Рис.2. Выбор синтезатора голоса



Рис.3. Редактирование текста