Skip to content

Commit 854e44e

Browse files
committed
增加语音识别功能
1 parent f44f1db commit 854e44e

12 files changed

Lines changed: 369 additions & 201 deletions

Speech/EmCmd.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//using System;
2+
3+
namespace Speech
4+
{
5+
public enum EmCmd
6+
{
7+
Init = 1,
8+
Speak = 2,
9+
Recognize = 3
10+
}
11+
12+
// [Flags]
13+
// public enum EmInitType
14+
// {
15+
// Speak = 0x01,
16+
// Recognize = 0x02,
17+
// }
18+
19+
// public enum EmRecognizeCmd
20+
// {
21+
// Stop = 0,
22+
// Start = 1,
23+
// }
24+
}

Speech/NetServer.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using System;
2+
using Speech.Properties;
3+
using Stardust;
4+
5+
namespace Speech
6+
{
7+
public class NetServer : INetComponent
8+
{
9+
private Speecher m_speecher;
10+
private Recognizer m_recognizer;
11+
private readonly SocketServer m_socket;
12+
13+
public NetServer()
14+
{
15+
m_socket = new SocketServer(this);
16+
}
17+
18+
public void Init()
19+
{
20+
m_speecher = new Speecher();
21+
m_recognizer = new Recognizer
22+
{
23+
OnRecognized = OnRecognized
24+
};
25+
Console.WriteLine("初始化完成");
26+
}
27+
28+
private void OnRecognized(string text)
29+
{
30+
var arg = new ByteInArg();
31+
arg.Write(text);
32+
NetSendMsg(arg.GetBuffer());
33+
}
34+
35+
public void StartServer()
36+
{
37+
m_socket.OnConnecte = OnClientConnecte;
38+
m_socket.Bind("127.0.0.1", Settings.Default.Port);
39+
}
40+
41+
private int m_clientid;
42+
private void OnClientConnecte(int cid)
43+
{
44+
m_clientid = cid;
45+
Console.WriteLine("已连接客户端:" + cid);
46+
}
47+
48+
public bool NetSendMsg(byte[] sendbuffer)
49+
{
50+
return m_socket.SendMsg(sendbuffer, m_clientid);
51+
}
52+
53+
public bool NetReciveMsg(byte[] recivebuffer, int netID)
54+
{
55+
var arg = new ByteOutArg(recivebuffer);
56+
var cmd = arg.ReadInt32();
57+
switch ((EmCmd)cmd)
58+
{
59+
case EmCmd.Init:
60+
Init();
61+
break;
62+
case EmCmd.Speak:
63+
var str = arg.ReadString();
64+
Console.WriteLine(str);
65+
m_speecher.Speak(str);
66+
return true;
67+
case EmCmd.Recognize:
68+
var scmd = arg.ReadInt32();
69+
if (scmd == 1)
70+
m_recognizer.BeginRec();
71+
if (scmd == 0)
72+
m_recognizer.EndRec();
73+
return true;
74+
default:
75+
throw new ArgumentOutOfRangeException();
76+
}
77+
return false;
78+
}
79+
80+
public bool Connected
81+
{
82+
get { return m_socket.Connected; }
83+
}
84+
}
85+
}

Speech/Program.cs

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
using System;
2-
using System.Linq;
3-
using System.Speech.Synthesis;
4-
using System.Text;
5-
using Speech.Properties;
62

73
namespace Speech
84
{
@@ -21,75 +17,4 @@ static void Main(string[] args)
2117
}
2218
}
2319
}
24-
25-
public class NetServer : SocketExtra.INetComponent
26-
{
27-
private readonly Speecher m_speecher;
28-
29-
private readonly SocketExtra m_socket;
30-
31-
public NetServer()
32-
{
33-
m_speecher = new Speecher();
34-
m_socket = new SocketExtra(this);
35-
}
36-
37-
public void StartServer()
38-
{
39-
m_socket.Bind("127.0.0.1", Settings.Default.Port);
40-
}
41-
42-
public bool NetSendMsg(byte[] sendbuffer)
43-
{
44-
return true;
45-
}
46-
47-
public bool NetReciveMsg(byte[] recivebuffer)
48-
{
49-
var str = Encoding.Default.GetString(recivebuffer);
50-
Console.WriteLine(str);
51-
m_speecher.Speak(str);
52-
return true;
53-
}
54-
55-
public bool Connected { get { return m_socket.Connected; } }
56-
}
57-
58-
public class Speecher
59-
{
60-
private readonly SpeechSynthesizer m_speaker;
61-
62-
public Speecher()
63-
{
64-
m_speaker = new SpeechSynthesizer();
65-
var installs = m_speaker.GetInstalledVoices();
66-
67-
m_speaker.Volume = Settings.Default.SpeakVolume;
68-
m_speaker.Rate = Settings.Default.SpeakRate;
69-
var voice = Settings.Default.SpeakVoice;
70-
71-
var selected = false;
72-
if (!string.IsNullOrEmpty(voice))
73-
{
74-
if (installs.Any(install => install.VoiceInfo.Name == voice))
75-
{
76-
m_speaker.SelectVoice(voice);
77-
selected = true;
78-
}
79-
}
80-
if (!selected)
81-
{
82-
foreach (var install in installs.Where(install => install.VoiceInfo.Culture.Name == "en-US"))
83-
{
84-
m_speaker.SelectVoice(install.VoiceInfo.Name);
85-
break;
86-
}
87-
}
88-
}
89-
90-
public void Speak(string msg)
91-
{
92-
m_speaker.Speak(msg);
93-
}
94-
}
9520
}

Speech/Properties/Settings.Designer.cs

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Speech/Properties/Settings.settings

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,12 @@
1414
<Setting Name="Port" Type="System.Int32" Scope="User">
1515
<Value Profile="(Default)">9903</Value>
1616
</Setting>
17+
<Setting Name="Keywords" Type="System.Collections.Specialized.StringCollection" Scope="User">
18+
<Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
19+
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
20+
&lt;string&gt;Fire&lt;/string&gt;
21+
&lt;string&gt;发射&lt;/string&gt;
22+
&lt;/ArrayOfString&gt;</Value>
23+
</Setting>
1724
</Settings>
1825
</SettingsFile>

Speech/Recognizer.cs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Speech.Recognition;
4+
using Speech.Properties;
5+
6+
namespace Speech
7+
{
8+
public delegate void SpeechRecognized(string text);
9+
10+
public class Recognizer
11+
{
12+
private readonly SpeechRecognitionEngine m_recognizer;//语音识别引擎
13+
private readonly DictationGrammar m_grammar; //自然语法
14+
15+
public Recognizer()
16+
{
17+
var myCIintl = new CultureInfo("en-US");
18+
var rs = SpeechRecognitionEngine.InstalledRecognizers();
19+
if (rs.Count > 0)
20+
{
21+
foreach (var config in rs)//获取所有语音引擎
22+
{
23+
if (config.Culture.Equals(myCIintl) && config.Id == "MS-1033-80-DESK")
24+
{
25+
m_recognizer = new SpeechRecognitionEngine(config);
26+
break;
27+
}//选择美国英语的识别引擎
28+
}
29+
if (m_recognizer == null)//如果没有适合的语音引擎,则选用第一个
30+
m_recognizer = new SpeechRecognitionEngine(rs[0]);
31+
}
32+
if (m_recognizer != null)
33+
{
34+
var kws = Settings.Default.Keywords;
35+
var fg = new string[kws.Count];
36+
kws.CopyTo(fg, 0);
37+
InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎
38+
m_grammar = new DictationGrammar();
39+
}
40+
else
41+
{
42+
Console.WriteLine("创建语音识别失败");
43+
}
44+
}
45+
46+
private void InitializeSpeechRecognitionEngine(string[] fg)
47+
{
48+
m_recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备
49+
var customGrammar = CreateCustomGrammar(fg);
50+
//根据关键字数组建立语法
51+
m_recognizer.UnloadAllGrammars();
52+
m_recognizer.LoadGrammar(customGrammar);
53+
//加载语法
54+
m_recognizer.SpeechRecognized += recognizer_SpeechRecognized;
55+
//m_recognizer.SpeechHypothesized += recognizer_SpeechHypothesized;
56+
}
57+
58+
public SpeechRecognized OnRecognized;
59+
60+
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
61+
{
62+
Console.WriteLine("SpeechRecognized:" + e.Result.Text);
63+
OnRecognized?.Invoke(e.Result.Text);
64+
}
65+
66+
private void recognizer_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
67+
{
68+
69+
}
70+
71+
/// <summary>
72+
/// 录音并识别
73+
/// </summary>
74+
public void BeginRec()
75+
{
76+
Console.WriteLine("BeginRec");
77+
TurnSpeechRecognitionOn();
78+
TurnDictationOn();
79+
}
80+
81+
private void TurnDictationOn()
82+
{
83+
if (m_recognizer != null)
84+
{
85+
m_recognizer.LoadGrammar(m_grammar);
86+
//加载自然语法
87+
}
88+
else
89+
{
90+
Console.WriteLine("创建语音识别失败");
91+
}
92+
}
93+
94+
private void TurnSpeechRecognitionOn()//启动语音识别函数
95+
{
96+
if (m_recognizer != null)
97+
{
98+
m_recognizer.RecognizeAsync(RecognizeMode.Multiple);
99+
//识别模式为连续识别
100+
}
101+
else
102+
{
103+
Console.WriteLine("创建语音识别失败");
104+
}
105+
}
106+
107+
public void EndRec()//停止语音识别引擎
108+
{
109+
Console.WriteLine("EndRec");
110+
TurnSpeechRecognitionOff();
111+
}
112+
113+
private void TurnSpeechRecognitionOff()//关闭语音识别函数
114+
{
115+
if (m_recognizer != null)
116+
{
117+
m_recognizer.RecognizeAsyncStop();
118+
TurnDictationOff();
119+
}
120+
else
121+
{
122+
Console.WriteLine("创建语音识别失败");
123+
}
124+
}
125+
126+
private void TurnDictationOff()
127+
{
128+
if (m_grammar != null)
129+
{
130+
m_recognizer.UnloadGrammar(m_grammar);
131+
//卸载自然语法
132+
}
133+
else
134+
{
135+
Console.WriteLine("创建语音识别失败");
136+
}
137+
}
138+
139+
private Grammar CreateCustomGrammar(string[] fg) //创造自定义语法
140+
{
141+
var grammarBuilder = new GrammarBuilder();
142+
grammarBuilder.Append(new Choices(fg));
143+
return new Grammar(grammarBuilder);
144+
}
145+
}
146+
}

0 commit comments

Comments
 (0)