/// <summary> /// 结束会话。 /// </summary> public string Finish() { StringBuilder lastResult = new StringBuilder(); int loop_count = 0; //获取余下的识别结果 EndPointStatusEnums ep_status = EndPointStatusEnums.ISR_EP_NULL; RecogStatusEnums rec_status = RecogStatusEnums.ISR_REC_NULL; ///最后一块数据发完之后,循环从服务器端获取结果 IsrInterop.AudioWrite(this.sessionId, IntPtr.Zero, 0, AudioStatus.ISR_AUDIO_SAMPLE_LAST, out ep_status, out rec_status); ///考虑到网络环境不好的情况下,需要对循环次数作限定 while (this.rslt_status != RecogStatusEnums.ISR_REC_STATUS_SPEECH_COMPLETE && loop_count++ < 30) { string str = null; try { str = IsrInterop.GetResult(sessionId, out rslt_status, waitTime); } catch (EngineNoDataException) { break; } if (!string.IsNullOrEmpty(str)) { this.result.Append(str); lastResult.Append(str); } System.Threading.Thread.Sleep(200); } return(lastResult.ToString()); }
protected override string RecognizeInternal(BackgroundWorker bw, string uriString) { bool finished = false; SpeechRecognitionSession session = null; EventHandler <WaveInEventArgs> handler = delegate(object sender, WaveInEventArgs e) { try { AudioStatus status = AudioStatus.ISR_AUDIO_SAMPLE_CONTINUE; EndPointStatusEnums ep_status = EndPointStatusEnums.ISR_EP_NULL; ///开始向服务器发送音频数据 string partResult = session.AppendAudio(e.Buffer, 0, e.BytesRecorded, status, out ep_status); if (!string.IsNullOrEmpty(partResult)) { this.OnResultArrived(new ResultArrivedEventArgs(partResult)); } if (ep_status == EndPointStatusEnums.ISR_EP_AFTER_SPEECH) {//检测到音频后端点,结束音频发送 finished = true; } } catch (Exception ex) { } finally { } }; try { session = client.CreateSession(); wis.DataAvailable += handler; wis.StartRecording(); while (true) { if (bw != null && bw.CancellationPending) { break; } if (finished) { break; } Thread.Sleep(200); } wis.DataAvailable -= handler; wis.StopRecording(); string lastResult = session.Finish(); if (!string.IsNullOrEmpty(lastResult)) { this.OnResultArrived(new ResultArrivedEventArgs(lastResult)); } string result = session.Result; return(result); } catch (Exception ex) { return(session.Result); } finally { if (session != null) { session.Dispose(); session = null; } } }
public static extern MspErrors QISRAudioWrite(string sessionID, IntPtr waveData, uint waveLen, AudioStatus audioStatus, out EndPointStatusEnums epStatus, out RecogStatusEnums recogStatus);
public static void AudioWrite(string sessionID, IntPtr waveData, uint waveLen, AudioStatus audioStatus, out EndPointStatusEnums epStatus, out RecogStatusEnums recogStatus) { MspErrors result = QISRAudioWrite(sessionID, waveData, waveLen, audioStatus, out epStatus, out recogStatus); CheckResult(result); }
/// <summary> /// 添加音频文件。 /// </summary> /// <param name="buffer"></param> /// <param name="offset"></param> /// <param name="length"></param> /// <param name="audio_status"></param> /// <param name="ep_status">端点检测(End-point detected)器所处的状态</param> public string AppendAudio(byte[] buffer, int offset, int length, AudioStatus audio_status, out EndPointStatusEnums ep_status) { if (length > BLOCK_LEN) { throw new ArgumentException("length超过了最大发送长度。", "length"); } //返回部分结果 string partResult = null; RecogStatusEnums rec_status;//识别器所处的状态 Marshal.Copy(buffer, 0, ptrBuffer, length); ///开始向服务器发送音频数据 IsrInterop.AudioWrite(sessionId, ptrBuffer, (uint)length, audio_status, out ep_status, out rec_status); ///服务器返回部分结果 if (rec_status == RecogStatusEnums.ISR_REC_STATUS_SUCCESS) {//已经有结果缓存在MSC中了,可以获取了 partResult = IsrInterop.GetResult(sessionId, out this.rslt_status, waitTime); if (!string.IsNullOrEmpty(partResult)) { this.result.Append(partResult); } } return(partResult); }