/// <summary> /// 实时识别,可以一边输入音频,一边进行语音识别。 /// 整个会话时长最多持续60s,或者超过10s未发送数据服务器会自动断开连接。但是识别过程不会停止,会自动开启一个新的会话进行识别。 /// /// 分片大小建议至少在3000以上。小于1000就可能影响到识别速率(也取决于输入频率)。 /// </summary> static async void ASR() { string path = @"02.pcm"; //测试文件路径,自己修改 int frameSize = 3200; byte[] data = File.ReadAllBytes(path); try { ASRApi iat = new ApiBuilder() .WithAppSettings(new AppSettings() { ApiKey = "7b845bf729c3eeb97be6de4d29e0b446", ApiSecret = "50c591a9cde3b1ce14d201db9d793b01", AppID = "5c56f257" }) .UseError((sender, e) => { Console.WriteLine("错误:" + e.Message); }) .UseMessage((sender, e) => { Console.WriteLine("实时结果:" + e); }) .BuildASR(); //计算识别时间 Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < data.Length; i += frameSize) { //模拟说话暂停 await Task.Delay(100); iat.Convert(SubArray(data, i, frameSize)); } //结束本次会话 iat.Stop(); //等待本次会话结束 while (iat.Status != ServiceStatus.Stopped) { await Task.Delay(10); } sw.Stop(); Console.WriteLine($"总共花费{Math.Round(sw.Elapsed.TotalSeconds, 2)}秒。"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
static void ASRRecord() { try { Stopwatch sw = new Stopwatch(); sw.Start(); #region ASRApi ASRApi iat = new ApiBuilder() .WithAppSettings(new AppSettings() { ApiKey = "7b845bf729c3eeb97be6de4d29e0b446", ApiSecret = "50c591a9cde3b1ce14d201db9d793b01", AppID = "5c56f257" }) .WithVadEos(5000) //将静默检测超时设置为5s .UseError((sender, e) => { Console.WriteLine("错误:" + e.Message); }) .UseMessage((sender, e) => { Console.WriteLine("实时结果:" + e); }) .BuildASR(); #endregion #region Record using WaveInEvent wave = new WaveInEvent(); wave.WaveFormat = new WaveFormat(16000, 1); wave.BufferMilliseconds = 50; wave.DataAvailable += (s, a) => { byte[] buffer = SubArray(a.Buffer, 0, a.BytesRecorded); iat.Convert(buffer); if (sw.ElapsedMilliseconds / 1000 > 60) { wave.StopRecording(); } }; wave.RecordingStopped += (s, a) => { Console.WriteLine("退出..."); }; Console.WriteLine("开始识别..."); wave.StartRecording(); //注册退出事件 Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs eventArgs) => { bool state = iat.Stop(); if (state) { Console.WriteLine("语音识别已退出..."); } wave.StopRecording(); Console.WriteLine("`C"); }; //等待识别开始 while (iat.Status != ServiceStatus.Running) { Thread.Sleep(10); } #endregion //等待本次会话结束 while (iat.Status != ServiceStatus.Stopped) { Thread.Sleep(10); //注意:此处不能使用Task.Delay(); } wave.Dispose(); sw.Stop(); Console.WriteLine($"总共花费{Math.Round(sw.Elapsed.TotalSeconds, 2)}秒。"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }