Thursday, August 25, 2016

NHẬN DẠNG LỜI NÓI TRONG C#

 
NHẬN DẠNG LỜI NÓI TRONG C#

Giới thiệu

Máy tính được thiết kế để phục vụ cho con người, thật buồn nếu con người phải đi học ngôn ngữ của máy tính để “thuyết phục” máy tính làm việc cho mình. Ngành khoa học máy tính vẫn đang phát triển nhiều công nghệ để việc giao tiếp giữa con người và máy tính trở nên dễ hơn, tự nhiên và thân thiện với con người hơn. Một trong những kênh giao tiếp quan trọng chính là giao tiếp bằng lời.
Ngày hôm nay, chúng ta sẽ cùng nhau tìm hiểu về cách để nhận dạng lời nói trong C#, Thư viện mà chúng ta sẽ sử dụng là System.Speech. Qua bài viết ngày hôm nay, các bạn sẽ có thể viết được nhiều hơn một ứng dụng nhận biết từ mà người dùng đang nói là gì.

  • Windows 8
  • Windows Server 2012
  • Windows 7
  • Windows Vista SP2
  • Windows Server 2008 (Server Core Role not supported)
  • Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported).
  • Windows Vista SP1 or later
  • Windows Server 2008 (Server Core not supported)
  • Windows Server 2008 R2 (Server Core supported with SP1 or later)
  • Windows Server 2003 SP2
  • Windows XP SP2
  • Windows Server 2008 R2
  • Windows Server 2008
  • Windows Server 2003
  • Windows 98, Windows Server 2000 SP4
  • Windows CE
  • Windows Millennium Edition
  • Windows Mobile for Pocket PC
  • Windows Mobile for Smartphone
  • Windows XP Media Center Edition
  • Windows XP Professional x64 Edition
  • Windows XP SP2
  • Windows XP Starter Edition

Môi trường và thư viện

  • Ngôn ngữ lập trình : C#
  • Thư viện System.Speech, thư viện này nằm trong bộ .Net framwork 4.5, 4, 3.5, 3.0 và .NET 4 Client Profile
  • Công cụ : Visual Studio
  • Windows 8, windows 7, windows vista

Thư viện System.Speech

Các bạn có thể đọc kỹ về thư viện này tại trang của Microsoft : http://msdn.microsoft.com/en-us/library/gg145021(v=vs.110).aspx
Thư viện này  thư viện này nằm trong bộ .Net framwork 4.5, 4, 3.5, 3.0 và .NET 4 Client Profile. Nó chứa các class được viết sẵn để hỗ trợ chúng ta nhận dạng lời nói.
Để thêm thư viện này vào project bạn làm như trong hình
Ảnh Thêm thư viện vào project

Bắt đầu code

Trong bài viết này, mình sẽ tạo một ứng dụng windows form, Mình đổi tên file form1.cs thành frmMain.cs. sau khi thêm thư viện ở bước trên, nhưng đoạn code từ đây về sau sẽ đặt ở file frmMain.cs
Bây giờ chúng ta sẽ gọi các namespace cần dùng vào.
1
2
using System.Speech.Recognition;
using System.Speech.Synthesis;
Trong class frmMain, ta sẽ khai báo một attribute tên _recognizer
1
private SpeechRecognitionEngine _recognizer = null;
Trong hàm khởi tạo frmMain
1
2
3
4
5
_recognizer = new SpeechRecognitionEngine(); //Khởi tạo một instance
_recognizer.SpeechRecognized += _onSpeechRecognized; // Sự kiện nhận dạng thành công
_recognizer.SpeechRecognitionRejected += _onSpeechRejected; // Sự kiện nhận dạng thất bại
_recognizer.SetInputToDefaultAudioDevice(); // Cài đặt thiết bị input là thiết bị mặc định
_recognizer.RecognizeAsync(RecognizeMode.Multiple);
Chúng ta sẽ tự định nghĩa các phương thức _onSpeechRecognized và _onSpeechRejected, các phương thức này sẽ được gọi lên khi các sự kiện SpeechRecognized, SpeechRecognitionRejected  xảy ra. Chúng ta sẽ định nghĩa hai phương thức này ở phần khác.
Trong dòng _recognizer.RecognizeAsync(RecognizeMode.Multiple), nếu RecognizeMode.Single thì _recognizer sẽ nhận dạng một tiếng, sau đó ngưng hoạt động.
Tiếp theo chúng ta sẽ định nghĩa nhưng mẫu để so sánh với âm thanh thu vào từ mic, từ đó sẽ đưa ra được những từ mà người dùng vừa nói
1
2
_recognizer.RequestRecognizerUpdate();
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")) { Name = "testGrammar" });  _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("demo")) { Name = "demoGrammar" }); _recognizer.RequestRecognizerUpdate();
Sau đọan code trên, thì trong danh sách mẫu của _recognizer sẽ chỉ có hai tiếng  là “demo” và “test”.
Lúc tạo grammar, bạn có thể cung cấp name của grammar để sử dụng trong một số trường hợp mà chuỗi text của bạn khá phức tạp, sẽ nói ở phần sau. Tuy nhiên, nếu bạn không muốn để tên thì có thể code như sau
1
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder("demo")));
Khi người dùng đọc vào tiếng “demo”, và _recognizer nhận dạng được thì phương thức _onSpeechRecognized sẽ được gọi.
Nếu text nhận dạng không phải là “test” hoặc “demo” thì phương thức _onSpeechRejected sẽ được gọi.
Theo cách ở trên thì bạn sẽ chỉ nhận dạng được một vài tiếng cố định. Bạn có thể làm như sau để nhận dạng được nhiều tiếng hơn, đây là những tiếng được microsoft định nghĩa sẵn cho chúng ta.
1
_recognizer.LoadGrammar(new DictationGrammar());
Phương thức xử lý các sự kiện
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
private void _onSpeechRecognized (object sender, SpeechRecognizedEventArgs e)
 {
 if (e.Result.Text == "test" || e.Result.Text == "demo")
 {
 MessageBox.Show("Recognized : " + e.Result.Text);
 }
 }
private void _onSpeechRejected (object sender, SpeechRecognitionRejectedEventArgs e)
 {
 string result = "Speech rejected. Did you mean:";
 foreach (RecognizedPhrase r in e.Result.Alternates)
 {
 result += "\n" + r.Text;
 }
 MessageBox.Show(result);
 }
Nếu thất bại thì _recognizer sẽ trả về cho bạn những tiếng gần với input nhất có trong danh sách mẫu. Trong ví dụ này, bạn nói tiếng “mo” thì nó cũng sẽ trả về cho bạn “demo”. Có lẽ khi viết thư viện này, microsoft xác định rằng nó phục vụ cho việc điều khiển máy tính, chứ không phải để nhập liệu chính xác.
Nhưng trong ví dụ trên, mỗi một Grammar chúng ta chỉ để một tiếng, chúng ta muốn cùng một grammar mà để nhiều tiếng, thì sử dụng class tên Choices, Grammar kiểu choice sẽ cho phép chúng ta liệt kê ra nhiều tiếng, khi nhận dạng, nó sẽ nhận dạng một trong những tiếng này :
1
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices("dog","cat","snake"))) { Name = "animalGrammar" });

Nhận dạng một câu

Để có thể nhận dạng được một mẫu câu, ví dụ như “test demo” thì bạn làm như sau :
1
2
3
4
5
6
7
GrammarBuilder grammarBuilder = new GrammarBuilder();
grammarBuilder.Append("I"); // add "I"
grammarBuilder.Append(new Choices("like", "dislike")); // load "like" & "dislike"
grammarBuilder.Append(new Choices("dogs", "cats", "birds", "snakes",
 "fishes", "tigers", "lions", "snails", "elephants")); // add animals
_recognizer.RequestRecognizerUpdate();
_recognizer.LoadGrammar(new Grammar(grammarBuilder)); // load grammar
Khi nhận dạng, thì nó sẽ cố nhận dạng thành một câu, nếu tiếng đầu tiên là I, tiếng tiếp theo là Like và dogs, thì nó sẽ cho bạn một câu là “I like dogs”.
Có trường hợp bạn nói rõ tiếng I, dogs, nhưng không rõ like hay dislike, thì phương thức _onSpeechRejected  sẽ được gọi, và trong e.Result.Alternates sẽ chứ hai câu là “I like dogs” và “I dislike dogs”
Để lấy từ từ trong câu, bạn có thể gọi e.Result.Words[i]

Tải về

http://www.codeproject.com/KB/audio-video/483347/StartingWithSpeechRecognition.zip

Tài liệu tham khảo :

  • System.Speech Namespaces : http://msdn.microsoft.com/en-us/library/gg145021(v=vs.110).aspx
  • http://www.codeproject.com/Articles/483347/Speech-recognition-speech-to-text-text-to-speech-a

Bài Viết Liên Quan