Смекни!
smekni.com

Система управления распознаванием речевой информации (стр. 9 из 10)

В бакалаврской работе проводилось моделирование работы устройства на ЭВМ. Так же была разработана программа на языках программирования высокого уровня С#.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. Листинг программы – SpeechRecognition

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.waveInUnprepareHeader(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.SuppressFinalize(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.SuppressFinalize(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.waveOutUnprepareHeader(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.SuppressFinalize(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.SuppressFinalize(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++)

{