Пример #1
0
        /// <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());
        }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
 public static extern MspErrors QISRAudioWrite(string sessionID, IntPtr waveData, uint waveLen, AudioStatus audioStatus, out EndPointStatusEnums epStatus, out RecogStatusEnums recogStatus);
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }