nlsCsharpSdk/nlsCsharpSdkDemo/nlsCsharpSdkDemo.cs (1,223 lines of code) (raw):

using nlsCsharpSdk; using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Windows.Forms; namespace nlsCsharpSdkDemo { public struct RunParams { public bool send_audio_flag; public bool audio_loop_flag; }; public struct DemoSpeechTranscriberStruct { public SpeechTranscriberRequest stPtr; public Thread st_send_audio; public string uuid; }; public struct DemoSpeechRecognizerStruct { public SpeechRecognizerRequest srPtr; public Thread sr_send_audio; public string uuid; }; public struct DemoSpeechSynthesizerStruct { public SpeechSynthesizerRequest syPtr; public Thread sy_send_audio; public string uuid; }; public partial class nlsCsharpSdkDemo : Form { private NlsClient nlsClient; private static Dictionary<string, RunParams> globalRunParams = new Dictionary<string, RunParams>(); private LinkedList<DemoSpeechTranscriberStruct> stList = null; private LinkedList<DemoSpeechRecognizerStruct> srList = null; private LinkedList<DemoSpeechSynthesizerStruct> syList = null; private NlsToken tokenPtr; private UInt64 expireTime; private string appKey; private string akId; private string akSecret; private string token; private string url; static int max_concurrency_num = 200; /* 可设置的最大并发数 */ static bool running; /* 刷新Label的flag */ static string cur_st_result; static string cur_st_completed; static string cur_st_closed; static int st_concurrency_number = 1; static string cur_st_file_path = System.Environment.CurrentDirectory + @"\audio_files\test3.wav"; static string cur_sr_result; static string cur_sr_completed; static string cur_sr_closed; static int sr_concurrency_number = 1; static string cur_sr_file_path = System.Environment.CurrentDirectory + @"\audio_files\test1.wav"; static string cur_sy_completed; static string cur_sy_closed; static int sy_concurrency_number = 1; static string cur_sy_output; static string fileLinkUrl = "https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav"; public nlsCsharpSdkDemo() { InitializeComponent(); System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;/* 设置该属性为false */ nlsClient = new NlsClient(); } #region ShowTextIntoLab private void FlushLab() { while (running) { if (cur_st_result != null && cur_st_result.Length > 0) { stResult.Text = cur_st_result; } if (cur_st_completed != null && cur_st_completed.Length > 0) { stCompleted.Text = cur_st_completed; } if (cur_st_closed != null && cur_st_closed.Length > 0) { stClosed.Text = cur_st_closed; } if (cur_sr_result != null && cur_sr_result.Length > 0) { srResult.Text = cur_sr_result; } if (cur_sr_completed != null && cur_sr_completed.Length > 0) { srCompleted.Text = cur_sr_completed; } if (cur_sr_closed != null && cur_sr_closed.Length > 0) { srClosed.Text = cur_sr_closed; } if (cur_sy_completed != null && cur_sy_completed.Length > 0) { syCompleted.Text = cur_sy_completed; } if (cur_sy_closed != null && cur_sy_closed.Length > 0) { syClosed.Text = cur_sy_closed; } if (cur_sy_output != null && cur_sy_output.Length > 0) { syOutput.Text = cur_sy_output; } Thread.Sleep(200); } } #endregion #region SendAudioDataIntoNlsSDK /// <summary> /// 实时识别的音频推送线程. /// </summary> private void STAudioLab(object request) { DemoSpeechTranscriberStruct st_node = (DemoSpeechTranscriberStruct)request; System.Diagnostics.Debug.WriteLine("st audio file_name = {0}", cur_st_file_path); FileStream fs = new FileStream(cur_st_file_path, FileMode.Open, FileAccess.Read); if (fs.Length <= 0) { nlsResult.Text = "open" + cur_st_file_path + "failed"; return; } BinaryReader br = new BinaryReader(fs); /* * 通过编号uuid获取对应的状态机,uuid在创建此语音请求时生成 */ bool cur_audio_loop_flag = globalRunParams[st_node.uuid].audio_loop_flag; bool cur_send_audio_flag = globalRunParams[st_node.uuid].send_audio_flag; while (cur_audio_loop_flag) { if (cur_send_audio_flag) { byte[] byData = br.ReadBytes((int)3200); if (byData.Length > 0) { /* * 推送byData.Lenght字节PCM格式音频数据到SDK进行识别 */ st_node.stPtr.SendAudio(st_node.stPtr, byData, (UInt64)byData.Length, EncoderType.ENCODER_PCM); } else { /* * 音频推送完成,重新打开循环继续 */ br.Close(); fs.Dispose(); fs = new FileStream(cur_st_file_path, FileMode.Open, FileAccess.Read); br = new BinaryReader(fs); } } else { } /* * 上面推送3200字节音频数据,相当于模拟100MS的音频 */ Thread.Sleep(100); /* * 更新状态机 */ if (globalRunParams.ContainsKey(st_node.uuid)) { cur_audio_loop_flag = globalRunParams[st_node.uuid].audio_loop_flag; cur_send_audio_flag = globalRunParams[st_node.uuid].send_audio_flag; } else { cur_audio_loop_flag = false; cur_send_audio_flag = false; } } br.Close(); fs.Dispose(); } /// <summary> /// 一句话识别的音频推送线程. /// </summary> private void SRAudioLab(object request) { DemoSpeechRecognizerStruct sr_node = (DemoSpeechRecognizerStruct)request; System.Diagnostics.Debug.WriteLine("sr audio file_name = {0}", cur_sr_file_path); FileStream fs = new FileStream(cur_sr_file_path, FileMode.Open, FileAccess.Read); if (fs.Length <= 0) { nlsResult.Text = "open" + cur_sr_file_path + "failed"; return; } BinaryReader br = new BinaryReader(fs); /* * 通过编号uuid获取对应的状态机,uuid在创建此语音请求时生成 */ bool cur_audio_loop_flag = globalRunParams[sr_node.uuid].audio_loop_flag; bool cur_send_audio_flag = globalRunParams[sr_node.uuid].send_audio_flag; while (cur_audio_loop_flag) { if (cur_send_audio_flag) { byte[] byData = br.ReadBytes((int)3200); if (byData.Length > 0) { /* * 推送byData.Lenght字节PCM格式音频数据到SDK进行识别 */ sr_node.srPtr.SendAudio(sr_node.srPtr, byData, (UInt64)byData.Length, EncoderType.ENCODER_PCM); } else { /* * 音频推送完成,重新打开循环继续 */ br.Close(); fs.Dispose(); fs = new FileStream(cur_sr_file_path, FileMode.Open, FileAccess.Read); br = new BinaryReader(fs); } } else { } /* * 上面推送3200字节音频数据,相当于模拟100MS的音频 */ Thread.Sleep(100); /* * 更新状态机 */ if (globalRunParams.ContainsKey(sr_node.uuid)) { cur_audio_loop_flag = globalRunParams[sr_node.uuid].audio_loop_flag; cur_send_audio_flag = globalRunParams[sr_node.uuid].send_audio_flag; } else { cur_audio_loop_flag = false; cur_send_audio_flag = false; } } br.Close(); fs.Dispose(); } #endregion #region NlsSdkButton // open log private void button1_Click(object sender, EventArgs e) { int ret = nlsClient.SetLogConfig("nlsLog", LogLevel.LogDebug, 400, 10); if (ret == 0) nlsResult.Text = "OpenLog Success"; else nlsResult.Text = "OpenLog Failed"; } // get sdk version private void button1_Click_1(object sender, EventArgs e) { string version = nlsClient.GetVersion(); nlsResult.Text = version; } // start sdk workThread private void button1_Click_2(object sender, EventArgs e) { /* 设置套接口地址类型, 需要在StartWorkThread前调用, 默认可不调用此接口 */ //nlsClient.SetAddrInFamily("AF_INET4"); /* * 启动1个事件池。在多并发(上百并发)情况下,建议选择 4 。若单并发,则建议填写 1 。 */ nlsClient.StartWorkThread(1); nlsResult.Text = "StartWorkThread and init NLS success."; running = true; /* * 启动线程FlushLab,用于将一些text显示到UI上 */ Thread t = new Thread(FlushLab); t.Start(); btnInitNls.Enabled = false; btnDeinitNls.Enabled = true; btnCreateToken.Enabled = true; btnReleaseToken.Enabled = false; btnSTcreate.Enabled = true; btnSTstart.Enabled = false; btnSTstop.Enabled = false; btnSTrelease.Enabled = false; btnSRcreate.Enabled = true; btnSRstart.Enabled = false; btnSRstop.Enabled = false; btnSRrelease.Enabled = false; btnSYcreate.Enabled = true; btnSYstart.Enabled = false; btnSYcancel.Enabled = false; btnSYrelease.Enabled = false; button1.Enabled = true; } // release sdk private void button1_Click_3(object sender, EventArgs e) { nlsClient.ReleaseInstance(); nlsResult.Text = "Release NLS success."; btnInitNls.Enabled = true; btnDeinitNls.Enabled = false; btnCreateToken.Enabled = false; btnReleaseToken.Enabled = false; btnSTcreate.Enabled = false; btnSTstart.Enabled = false; btnSTstop.Enabled = false; btnSTrelease.Enabled = false; btnSRcreate.Enabled = false; btnSRstart.Enabled = false; btnSRstop.Enabled = false; btnSRrelease.Enabled = false; btnSYcreate.Enabled = false; btnSYstart.Enabled = false; btnSYcancel.Enabled = false; btnSYrelease.Enabled = false; button1.Enabled = false; } #endregion #region FillInUserInfo private void textBox1_TextChanged(object sender, EventArgs e) { akId = tAkId.Text; } private void tAppKey_TextChanged(object sender, EventArgs e) { appKey = tAppKey.Text; } private void tAkSecret_TextChanged(object sender, EventArgs e) { akSecret = tAkSecret.Text; } private void tToken_TextChanged(object sender, EventArgs e) { token = tToken.Text; } private void tUrl_TextChanged(object sender, EventArgs e) { url = tUrl.Text; } private void tInput1_TextChanged(object sender, EventArgs e) { cur_st_file_path = tInput1.Text; } private void tinput2_TextChanged(object sender, EventArgs e) { cur_sr_file_path = tinput2.Text; } #endregion #region TokenButton // create token private void button3_Click_1(object sender, EventArgs e) { int ret = -1; tokenPtr = nlsClient.CreateNlsToken(); if (tokenPtr.native_token != IntPtr.Zero) { if (akId == null || akId.Length == 0) { akId = tAkId.Text; } if (akSecret == null || akSecret.Length == 0) { akSecret = tAkSecret.Text; } if (akId != null && akSecret != null && akId.Length > 0 && akSecret.Length > 0) { tokenPtr.SetAccessKeyId(tokenPtr, akId); tokenPtr.SetKeySecret(tokenPtr, akSecret); ret = tokenPtr.ApplyNlsToken(tokenPtr); if (ret < 0) { System.Diagnostics.Debug.WriteLine("ApplyNlsToken failed"); nlsResult.Text = tokenPtr.GetErrorMsg(tokenPtr); } else { System.Diagnostics.Debug.WriteLine("ApplyNlsToken success"); btnCreateToken.Enabled = false; btnReleaseToken.Enabled = true; token = tokenPtr.GetToken(tokenPtr); tToken.Text = token; expireTime = tokenPtr.GetExpireTime(tokenPtr); nlsResult.Text = "ExpireTime:" + expireTime.ToString(); } } else { nlsResult.Text = "CreateToken Failed, akId or Secret is null"; } } else { nlsResult.Text = "CreateToken Failed"; } } // release token private void button4_Click(object sender, EventArgs e) { if (tokenPtr.native_token != IntPtr.Zero) { nlsClient.ReleaseNlsToken(tokenPtr); tokenPtr.native_token = IntPtr.Zero; nlsResult.Text = "ReleaseNlsToken Success"; } else { nlsResult.Text = "ReleaseNlsToken is nullptr"; } } #endregion #region FillInConcurrencyNumber private void textBox1_TextChanged_1(object sender, EventArgs e) { st_concurrency_number = Convert.ToInt32(textBox1.Text); if (st_concurrency_number < 1) { st_concurrency_number = 1; textBox1.Text = "1"; } else if (st_concurrency_number > max_concurrency_num) { st_concurrency_number = max_concurrency_num; textBox1.Text = Convert.ToString(max_concurrency_num); } } private void textBox2_TextChanged(object sender, EventArgs e) { sr_concurrency_number = Convert.ToInt32(textBox2.Text); if (sr_concurrency_number < 1) { sr_concurrency_number = 1; textBox2.Text = "1"; } else if (sr_concurrency_number > max_concurrency_num) { sr_concurrency_number = max_concurrency_num; textBox2.Text = Convert.ToString(max_concurrency_num); } } private void textBox3_TextChanged(object sender, EventArgs e) { sy_concurrency_number = Convert.ToInt32(textBox3.Text); if (sy_concurrency_number < 1) { sy_concurrency_number = 1; textBox3.Text = "1"; } else if (sy_concurrency_number > max_concurrency_num) { sy_concurrency_number = max_concurrency_num; textBox3.Text = Convert.ToString(max_concurrency_num); } } #endregion #region TranscriberCallback public CallbackDelegate DemoOnTranscriptionStarted = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionStarted user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionStarted msg = {0}", msg); cur_st_completed = "msg : " + msg; RunParams demo_params = new RunParams(); demo_params.send_audio_flag = true; demo_params.audio_loop_flag = globalRunParams[uuid].audio_loop_flag; globalRunParams.Remove(uuid); globalRunParams.Add(uuid, demo_params); }; public CallbackDelegate DemoOnTranscriptionClosed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionClosed user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionClosed msg = {0}", msg); cur_st_closed = "msg : " + msg; }; public CallbackDelegate DemoOnTranscriptionTaskFailed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionTaskFailed user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionTaskFailed msg = {0}", msg); cur_st_completed = "msg : " + msg; RunParams demo_params = new RunParams(); demo_params.send_audio_flag = false; demo_params.audio_loop_flag = false; globalRunParams.Remove(uuid); globalRunParams.Add(uuid, demo_params); }; private CallbackDelegate DemoOnTranscriptionResultChanged = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionResultChanged user uuid = {0}", uuid); string result = System.Text.Encoding.Default.GetString(e.result).TrimEnd('\0'); //System.Diagnostics.Debug.WriteLine("DemoOnTranscriptionResultChanged result = {0}", result); cur_st_result = "middle result : " + result; }; private CallbackDelegate DemoOnSentenceBegin = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnSentenceBegin user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnSentenceBegin msg = {0}", msg); cur_st_completed = "sentenceBegin : " + msg; }; private CallbackDelegate DemoOnSentenceEnd = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnSentenceEnd user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnSentenceEnd msg = {0}", msg); cur_st_completed = "sentenceEnd : " + msg; }; #endregion #region TranscriberButton // create transcriber private void button1_Click_4(object sender, EventArgs e) { if (stList == null) { stList = new LinkedList<DemoSpeechTranscriberStruct>(); } else { nlsResult.Text = "transcriber list is existed, release first..."; } for (int i = 0; i < st_concurrency_number; i++) { DemoSpeechTranscriberStruct stStruct; stStruct = new DemoSpeechTranscriberStruct(); stStruct.stPtr = nlsClient.CreateTranscriberRequest(); if (stStruct.stPtr.native_request != IntPtr.Zero) { nlsResult.Text = "CreateTranscriberRequest Success"; btnSTcreate.Enabled = false; btnSTstart.Enabled = true; btnSTrelease.Enabled = true; stStruct.uuid = System.Guid.NewGuid().ToString("N"); RunParams demo_params = new RunParams(); demo_params.send_audio_flag = false; demo_params.audio_loop_flag = false; globalRunParams[stStruct.uuid] = demo_params; } else { nlsResult.Text = "CreateTranscriberRequest Failed"; } stList.AddLast(stStruct); } cur_st_result = "null"; cur_st_closed = "null"; cur_st_completed = "null"; } // release transcriber private void button2_Click(object sender, EventArgs e) { if (stList == null) { nlsResult.Text = "transcriber list is null, create first..."; return; } else { int st_count = stList.Count; for (int i = 0; i < st_count; i++) { LinkedListNode<DemoSpeechTranscriberStruct> stStruct = stList.Last; DemoSpeechTranscriberStruct st = stStruct.Value; if (st.stPtr.native_request != IntPtr.Zero) { nlsClient.ReleaseTranscriberRequest(st.stPtr); st.stPtr.native_request = IntPtr.Zero; globalRunParams.Remove(st.uuid); nlsResult.Text = "ReleaseTranscriberRequest Success"; btnSTrelease.Enabled = false; btnSTcreate.Enabled = true; btnSTstart.Enabled = false; btnSTstop.Enabled = false; } else { nlsResult.Text = "TranscriberRequest is nullptr"; } stList.RemoveLast(); } stList.Clear(); } cur_st_result = "null"; cur_st_closed = "null"; cur_st_completed = "null"; } // start transcriber private void button3_Click(object sender, EventArgs e) { int ret = -1; if (stList == null) { nlsResult.Text = "transcriber list is null, create first..."; return; } else { if (File.Exists(cur_st_file_path)) { } else { cur_st_completed = "cannot open file: " + cur_st_file_path; return; } LinkedListNode<DemoSpeechTranscriberStruct> stStruct = stList.First; int st_count = stList.Count; for (int i = 0; i < st_count; i++) { DemoSpeechTranscriberStruct st = stStruct.Value; if (st.stPtr.native_request != IntPtr.Zero) { if (appKey == null || appKey.Length == 0) { appKey = tAppKey.Text; } if (token == null || token.Length == 0) { token = tToken.Text; } if (appKey == null || token == null || appKey.Length == 0 || token.Length == 0) { nlsResult.Text = "Start failed, token or appkey is empty"; return; } st.stPtr.SetAppKey(st.stPtr, appKey); st.stPtr.SetToken(st.stPtr, token); st.stPtr.SetUrl(st.stPtr, url); st.stPtr.SetFormat(st.stPtr, "pcm"); st.stPtr.SetSampleRate(st.stPtr, 16000); st.stPtr.SetIntermediateResult(st.stPtr, true); st.stPtr.SetPunctuationPrediction(st.stPtr, true); st.stPtr.SetInverseTextNormalization(st.stPtr, true); // 此处仅仅只是用unix时间戳作为每轮对话的session id Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; st.stPtr.SetSessionId(st.stPtr, unixTimestamp.ToString()); st.stPtr.SetOnTranscriptionStarted(st.stPtr, DemoOnTranscriptionStarted, st.uuid); st.stPtr.SetOnChannelClosed(st.stPtr, DemoOnTranscriptionClosed, st.uuid); st.stPtr.SetOnTaskFailed(st.stPtr, DemoOnTranscriptionTaskFailed, st.uuid); st.stPtr.SetOnSentenceBegin(st.stPtr, DemoOnSentenceBegin, st.uuid); st.stPtr.SetOnSentenceEnd(st.stPtr, DemoOnSentenceEnd, st.uuid); st.stPtr.SetOnTranscriptionResultChanged(st.stPtr, DemoOnTranscriptionResultChanged, st.uuid); ret = st.stPtr.Start(st.stPtr); if (ret != 0) { nlsResult.Text = "Transcriber Start failed"; } else { if (globalRunParams[st.uuid].audio_loop_flag == false) { RunParams demo_params = new RunParams(); demo_params.audio_loop_flag = true; demo_params.send_audio_flag = globalRunParams[st.uuid].send_audio_flag; globalRunParams.Remove(st.uuid); globalRunParams.Add(st.uuid, demo_params); st.st_send_audio = new Thread(new ParameterizedThreadStart(STAudioLab)); st.st_send_audio.Start((object)st); btnSTstart.Enabled = false; btnSTstop.Enabled = true; } nlsResult.Text = "Transcriber Start success"; } } else { } stStruct = stStruct.Next; if (stStruct == null) { break; } } } } // stop transcriber private void btnSTstop_Click(object sender, EventArgs e) { int ret = -1; if (stList == null) { nlsResult.Text = "transcriber list is null, create first..."; return; } else { LinkedListNode<DemoSpeechTranscriberStruct> stStruct = stList.First; int st_count = stList.Count; for (int i = 0; i < st_count; i++) { DemoSpeechTranscriberStruct st = stStruct.Value; if (st.stPtr.native_request != IntPtr.Zero) { if (st.stPtr.native_request != IntPtr.Zero) { RunParams demo_params = new RunParams(); demo_params.audio_loop_flag = globalRunParams[st.uuid].audio_loop_flag; demo_params.send_audio_flag = false; globalRunParams.Remove(st.uuid); globalRunParams.Add(st.uuid, demo_params); ret = st.stPtr.Stop(st.stPtr); } if (ret != 0) { nlsResult.Text = "Transcriber Stop failed"; } else { btnSTstop.Enabled = false; nlsResult.Text = "Transcriber Stop success"; } } else { } stStruct = stStruct.Next; if (stStruct == null) { break; } } } } #endregion #region SynthesizerCallback private CallbackDelegate DemoOnBinaryDataReceived = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnBinaryDataReceived uuid = {0}", uuid); System.Diagnostics.Debug.WriteLine("DemoOnBinaryDataReceived taskId = {0}", e.taskId); System.Diagnostics.Debug.WriteLine("DemoOnBinaryDataReceived dataSize = {0}", e.binaryDataSize); //cur_sy_completed = e.taskId + ", binaryDataSize : " + e.binaryDataSize; /* * 特殊注意:此回调频率较高,需要谨慎处理对收到音频数据的转存。 * 如下写入音频,容易出现多次回调同一时间同时操作同一个fs的问题。 */ #if TRUE FileStream fs; string filename = e.taskId + ".wav"; cur_sy_output = System.Environment.CurrentDirectory + @"\" + filename; System.Diagnostics.Debug.WriteLine("DemoOnBinaryDataReceived current filename = {0}", filename); if (File.Exists(filename)) { fs = new FileStream(filename, FileMode.Append, FileAccess.Write); } else { fs = new FileStream(filename, FileMode.Create, FileAccess.Write); } fs.Write(e.binaryData, 0, e.binaryDataSize); fs.Close(); #endif }; private CallbackDelegate DemoOnSynthesisClosed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnSynthesisClosed user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnSynthesisClosed msg = {0}", msg); cur_sy_closed = "msg : " + msg; }; private CallbackDelegate DemoOnSynthesisTaskFailed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnSynthesisTaskFailed user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnSynthesisTaskFailed msg = {0}", msg); cur_sy_completed = "msg : " + msg; }; private CallbackDelegate DemoOnSynthesisCompleted = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnSynthesisCompleted user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnSynthesisCompleted msg = {0}", msg); cur_sy_completed = "result : " + msg; }; private CallbackDelegate DemoOnMetaInfo = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnMetaInfo user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnMetaInfo msg = {0}", msg); //cur_sy_completed = "metaInfo : " + e.msg; }; #endregion #region SynthesizerButton // create synthesizer private void button12_Click(object sender, EventArgs e) { if (syList == null) { syList = new LinkedList<DemoSpeechSynthesizerStruct>(); } else { nlsResult.Text = "synthesizer list is existed, release first..."; } for (int i = 0; i < sy_concurrency_number; i++) { /* * 创建一个用户定义的结构体,传入SDK,后续可在回调中获取 */ DemoSpeechSynthesizerStruct syStruct; syStruct = new DemoSpeechSynthesizerStruct(); syStruct.syPtr = nlsClient.CreateSynthesizerRequest(TtsVersion.ShortTts); if (syStruct.syPtr.native_request != IntPtr.Zero) { nlsResult.Text = "CreateSynthesizerRequest Success"; btnSYcreate.Enabled = false; btnSYstart.Enabled = true; btnSYrelease.Enabled = true; /* * 结构体RunParams中创建uuid,用于状态机与此次请求的一一对应 */ syStruct.uuid = System.Guid.NewGuid().ToString("N"); RunParams demo_params = new RunParams(); demo_params.send_audio_flag = false; demo_params.audio_loop_flag = false; globalRunParams[syStruct.uuid] = demo_params; } else { nlsResult.Text = "CreateSynthesizerRequest Failed"; } syList.AddLast(syStruct); } cur_sy_closed = "null"; cur_sy_completed = "null"; } // start synthesizer private void button10_Click(object sender, EventArgs e) { int ret = -1; if (syList == null) { nlsResult.Text = "synthesizer list is null, create first..."; return; } else { LinkedListNode<DemoSpeechSynthesizerStruct> syStruct = syList.First; int sy_count = syList.Count; for (int i = 0; i < sy_count; i++) { DemoSpeechSynthesizerStruct sy = syStruct.Value; if (sy.syPtr.native_request != IntPtr.Zero) { if (appKey == null || appKey.Length == 0) { appKey = tAppKey.Text; } if (token == null || token.Length == 0) { token = tToken.Text; } if (appKey == null || token == null || appKey.Length == 0 || token.Length == 0) { nlsResult.Text = "Start failed, token or appkey is empty"; return; } string text = "今天天气真不错,我想去操场踢足球。"; sy.syPtr.SetAppKey(sy.syPtr, appKey); sy.syPtr.SetToken(sy.syPtr, token); sy.syPtr.SetUrl(sy.syPtr, url); sy.syPtr.SetText(sy.syPtr, text); sy.syPtr.SetVoice(sy.syPtr, "siqi"); sy.syPtr.SetVolume(sy.syPtr, 50); sy.syPtr.SetFormat(sy.syPtr, "wav"); sy.syPtr.SetSampleRate(sy.syPtr, 16000); sy.syPtr.SetSpeechRate(sy.syPtr, 0); sy.syPtr.SetPitchRate(sy.syPtr, 0); sy.syPtr.SetEnableSubtitle(sy.syPtr, true); sy.syPtr.SetOnSynthesisCompleted(sy.syPtr, DemoOnSynthesisCompleted, sy.uuid); sy.syPtr.SetOnBinaryDataReceived(sy.syPtr, DemoOnBinaryDataReceived, sy.uuid); sy.syPtr.SetOnTaskFailed(sy.syPtr, DemoOnSynthesisTaskFailed, sy.uuid); sy.syPtr.SetOnChannelClosed(sy.syPtr, DemoOnSynthesisClosed, sy.uuid); sy.syPtr.SetOnMetaInfo(sy.syPtr, DemoOnMetaInfo, sy.uuid); ret = sy.syPtr.Start(sy.syPtr); if (ret != 0) { nlsResult.Text = "Synthesizer Start failed."; } else { nlsResult.Text = "Transcriber Start success."; btnSYstart.Enabled = false; btnSYcancel.Enabled = true; } } else { } syStruct = syStruct.Next; if (syStruct == null) { break; } } } } // cancel synthesizer private void button9_Click(object sender, EventArgs e) { int ret = -1; if (syList == null) { nlsResult.Text = "synthesizer list is null, create first..."; return; } else { LinkedListNode<DemoSpeechSynthesizerStruct> syStruct = syList.First; int sy_count = syList.Count; for (int i = 0; i < sy_count; i++) { DemoSpeechSynthesizerStruct sy = syStruct.Value; if (sy.syPtr.native_request != IntPtr.Zero) { if (sy.syPtr.native_request != IntPtr.Zero) { ret = sy.syPtr.Cancel(sy.syPtr); } if (ret != 0) { nlsResult.Text = "Synthesizer Cancel failed"; } else { btnSYcancel.Enabled = false; nlsResult.Text = "Synthesizer Cancel success"; } } else { } syStruct = syStruct.Next; if (syStruct == null) { break; } } } } // release synthesizer private void btnSYrelease_Click(object sender, EventArgs e) { if (syList == null) { nlsResult.Text = "synthesizer list is null, create first..."; return; } else { int sy_count = syList.Count; for (int i = 0; i < sy_count; i++) { LinkedListNode<DemoSpeechSynthesizerStruct> syStruct = syList.Last; DemoSpeechSynthesizerStruct sy = syStruct.Value; if (sy.syPtr.native_request != IntPtr.Zero) { nlsClient.ReleaseSynthesizerRequest(sy.syPtr); sy.syPtr.native_request = IntPtr.Zero; globalRunParams.Remove(sy.uuid); nlsResult.Text = "ReleaseSynthesizerRequest Success"; btnSYrelease.Enabled = false; btnSYcreate.Enabled = true; btnSYstart.Enabled = false; btnSYcancel.Enabled = false; } else { nlsResult.Text = "ReleaseSynthesizerRequest is nullptr"; } syList.RemoveLast(); } syList.Clear(); } cur_sy_closed = "null"; cur_sy_completed = "null"; } #endregion #region RecognizerCallback private CallbackDelegate DemoOnRecognitionStarted = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnRecognitionStarted user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnRecognitionStarted msg = {0}", msg); cur_sr_completed = "msg : " + msg; /* * 更新状态机send_audio_flag为true,表示请求成功,可以开始传送音频 */ RunParams demo_params = new RunParams(); demo_params.send_audio_flag = true; demo_params.audio_loop_flag = globalRunParams[uuid].audio_loop_flag; globalRunParams.Remove(uuid); globalRunParams.Add(uuid, demo_params); }; private CallbackDelegate DemoOnRecognitionClosed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnRecognitionClosed = {0}", msg); cur_sr_closed = "msg : " + msg; /* * 这里可更新状态机为false,表示请求完成,可以停止传递音频和推出传递音频的线程 * 此处demo为循环运行,没有做停止此次请求的处理 */ }; private CallbackDelegate DemoOnRecognitionTaskFailed = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnRecognitionTaskFailed user uuid = {0}", uuid); string msg = System.Text.Encoding.Default.GetString(e.msg).TrimEnd('\0'); System.Diagnostics.Debug.WriteLine("DemoOnRecognitionTaskFailed = {0}", msg); cur_sr_completed = "msg : " + msg; /* * 更新状态机为false,表示请求完成,可以停止传递音频和推出传递音频的线程 */ RunParams demo_params = new RunParams(); demo_params.send_audio_flag = false; demo_params.audio_loop_flag = false; globalRunParams.Remove(uuid); globalRunParams.Add(uuid, demo_params); }; private CallbackDelegate DemoOnRecognitionResultChanged = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnRecognitionResultChanged user uuid = {0}", uuid); string result = System.Text.Encoding.Default.GetString(e.result).TrimEnd('\0'); //System.Diagnostics.Debug.WriteLine("DemoOnRecognitionResultChanged result = {0}", result); cur_sr_result = "middle result : " + result; }; private CallbackDelegate DemoOnRecognitionCompleted = (ref NLS_EVENT_STRUCT e, ref string uuid) => { System.Diagnostics.Debug.WriteLine("DemoOnRecognitionCompleted user uuid = {0}", uuid); string result = System.Text.Encoding.Default.GetString(e.result).TrimEnd('\0'); //System.Diagnostics.Debug.WriteLine("DemoOnRecognitionCompleted result = {0}", result); cur_sr_completed = "final result : " + result; }; #endregion #region RecognizerButton // create recognizer private void button8_Click(object sender, EventArgs e) { if (srList == null) { srList = new LinkedList<DemoSpeechRecognizerStruct>(); } else { nlsResult.Text = "recognizer list is existed, release first..."; } for (int i = 0; i < sr_concurrency_number; i++) { DemoSpeechRecognizerStruct srStruct; srStruct = new DemoSpeechRecognizerStruct(); srStruct.srPtr = nlsClient.CreateRecognizerRequest(); if (srStruct.srPtr.native_request != IntPtr.Zero) { nlsResult.Text = "CreateRecognizerRequest Success"; btnSRcreate.Enabled = false; btnSRstart.Enabled = true; btnSRrelease.Enabled = true; srStruct.uuid = System.Guid.NewGuid().ToString("N"); RunParams demo_params = new RunParams(); demo_params.send_audio_flag = false; demo_params.audio_loop_flag = false; globalRunParams[srStruct.uuid] = demo_params; } else { nlsResult.Text = "CreateRecognizerRequest Failed"; } srList.AddLast(srStruct); } cur_sr_result = "null"; cur_sr_closed = "null"; cur_sr_completed = "null"; } // start recognizer private void button6_Click(object sender, EventArgs e) { int ret = -1; if (srList == null) { nlsResult.Text = "recognizer list is null, create first..."; return; } else { if (File.Exists(cur_sr_file_path)) { } else { cur_sr_completed = "cannot open file: " + cur_sr_file_path; return; } LinkedListNode<DemoSpeechRecognizerStruct> srStruct = srList.First; int sr_count = srList.Count; for (int i = 0; i < sr_count; i++) { DemoSpeechRecognizerStruct sr = srStruct.Value; if (sr.srPtr.native_request != IntPtr.Zero) { if (appKey == null || appKey.Length == 0) { appKey = tAppKey.Text; } if (token == null || token.Length == 0) { token = tToken.Text; } if (appKey == null || token == null || appKey.Length == 0 || token.Length == 0) { nlsResult.Text = "Start failed, token or appkey is empty"; return; } sr.srPtr.SetAppKey(sr.srPtr, appKey); sr.srPtr.SetToken(sr.srPtr, token); sr.srPtr.SetUrl(sr.srPtr, url); sr.srPtr.SetFormat(sr.srPtr, "pcm"); sr.srPtr.SetSampleRate(sr.srPtr, 16000); sr.srPtr.SetIntermediateResult(sr.srPtr, true); sr.srPtr.SetPunctuationPrediction(sr.srPtr, true); sr.srPtr.SetInverseTextNormalization(sr.srPtr, true); sr.srPtr.SetOnRecognitionStarted(sr.srPtr, DemoOnRecognitionStarted, sr.uuid); sr.srPtr.SetOnChannelClosed(sr.srPtr, DemoOnRecognitionClosed, sr.uuid); sr.srPtr.SetOnTaskFailed(sr.srPtr, DemoOnRecognitionTaskFailed, sr.uuid); sr.srPtr.SetOnRecognitionResultChanged(sr.srPtr, DemoOnRecognitionResultChanged, sr.uuid); sr.srPtr.SetOnRecognitionCompleted(sr.srPtr, DemoOnRecognitionCompleted, sr.uuid); ret = sr.srPtr.Start(sr.srPtr); if (ret != 0) { nlsResult.Text = "recognizer Start failed"; } else { if (globalRunParams[sr.uuid].audio_loop_flag == false) { RunParams demo_params = new RunParams(); demo_params.audio_loop_flag = true; demo_params.send_audio_flag = globalRunParams[sr.uuid].send_audio_flag; globalRunParams.Remove(sr.uuid); globalRunParams.Add(sr.uuid, demo_params); sr.sr_send_audio = new Thread(new ParameterizedThreadStart(SRAudioLab)); sr.sr_send_audio.Start((object)sr); btnSRstart.Enabled = false; btnSRstop.Enabled = true; } nlsResult.Text = "Recognizer Start success"; } } else { } srStruct = srStruct.Next; if (srStruct == null) { break; } } } } // stop recognizer private void button5_Click(object sender, EventArgs e) { int ret = -1; if (srList == null) { nlsResult.Text = "recognizer list is null, create first..."; return; } else { LinkedListNode<DemoSpeechRecognizerStruct> srStruct = srList.First; int sr_count = srList.Count; for (int i = 0; i < sr_count; i++) { DemoSpeechRecognizerStruct sr = srStruct.Value; if (sr.srPtr.native_request != IntPtr.Zero) { if (sr.srPtr.native_request != IntPtr.Zero) { RunParams demo_params = new RunParams(); demo_params.audio_loop_flag = globalRunParams[sr.uuid].audio_loop_flag; demo_params.send_audio_flag = false; globalRunParams.Remove(sr.uuid); globalRunParams.Add(sr.uuid, demo_params); ret = sr.srPtr.Stop(sr.srPtr); } if (ret != 0) { nlsResult.Text = "Recognizer Stop failed"; } else { btnSRstop.Enabled = false; nlsResult.Text = "Recognizer Stop success"; } } else { } srStruct = srStruct.Next; if (srStruct == null) { break; } } } } // release recognizer private void button7_Click(object sender, EventArgs e) { if (srList == null) { nlsResult.Text = "recognizer list is null, create first..."; return; } else { int sr_count = srList.Count; for (int i = 0; i < sr_count; i++) { LinkedListNode<DemoSpeechRecognizerStruct> srStruct = srList.Last; DemoSpeechRecognizerStruct sr = srStruct.Value; if (sr.srPtr.native_request != IntPtr.Zero) { nlsClient.ReleaseRecognizerRequest(sr.srPtr); sr.srPtr.native_request = IntPtr.Zero; globalRunParams.Remove(sr.uuid); nlsResult.Text = "ReleaseRecognizerRequest Success"; btnSRrelease.Enabled = false; btnSRcreate.Enabled = true; btnSRstart.Enabled = false; btnSRstop.Enabled = false; } else { nlsResult.Text = "RecognizerRequest is nullptr"; } srList.RemoveLast(); } srList.Clear(); } cur_sr_result = "null"; cur_sr_closed = "null"; cur_sr_completed = "null"; } #endregion #region FileTransferButton private void button1_Click_5(object sender, EventArgs e) { FileTransferRequest request = nlsClient.CreateFileTransferRequest(); request.SetAccessKeyId(request, akId); request.SetKeySecret(request, akSecret); request.SetAppKey(request, appKey); request.SetFileLinkUrl(request, fileLinkUrl); int ret = request.ApplyFileTrans(request); if (ret < 0) { string ft_error_msg = request.GetErrorMsg(request); System.Diagnostics.Debug.WriteLine("FileTransfer get error msg = {0}", ft_error_msg); ftResult.Text = ft_error_msg; } else { string ft_result_msg = request.GetResult(request); System.Diagnostics.Debug.WriteLine("FileTransfer get result msg = {0}", ft_result_msg); ftResult.Text = ft_result_msg; } nlsClient.ReleaseFileTransferRequest(request); } private void textBox4_TextChanged(object sender, EventArgs e) { fileLinkUrl = tFileLinkUrl.Text; } #endregion #region Useless private void label1_Click(object sender, EventArgs e) { } private void nlsCsharpSdkDemo_Load(object sender, EventArgs e) { } private void label6_Click(object sender, EventArgs e) { } private void label21_Click(object sender, EventArgs e) { } private void label14_Click(object sender, EventArgs e) { } private void syCompleted_Click(object sender, EventArgs e) { } private void srCompleted_Click(object sender, EventArgs e) { } private void label6_Click_1(object sender, EventArgs e) { } private void ftResult_Click(object sender, EventArgs e) { } private void label16_Click(object sender, EventArgs e) { } private void label21_Click_1(object sender, EventArgs e) { } #endregion } }