Смекни!
smekni.com

Голосовое воспроизведение текста (стр. 2 из 3)

Часто требуется применение функций 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.запускаем чтение текста.

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

Для того чтобы использовать 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.