c# core 6讯飞实时语音转写

实时语音转写 API 文档 : https://www.xfyun.cn/doc/asr/rtasr/API.html#%E6%8E%A5%E5%8F%A3demo


```csharp`
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using WebSocket4Net;
using System.IO;
using System.Formats.Asn1;
using System.Threading;

namespace ConsoleApp2
{
  public  class Program444实时语音转写
    {
        private const String hostUrl = "wss://rtasr.xfyun.cn/v1/ws?"; //http url 不支持解析 ws/wss schema    
        private const String appid = "";//到控制台-语音合成页面获取
        private const String APIKey = "";//到控制台-语音合成页面获取

        private const String fileurl = @"C:\iat_pcm_16k.pcm";

        private  WebSocket webSocket;
         MemoryStream pcmStream = new MemoryStream();
        public string result = "";
        public Program444()
        {
            string uri = GetAuthUrl(hostUrl, APIKey);
            webSocket = new WebSocket(uri);
            webSocket.Opened += OnOpened;
            webSocket.Closed += OnClosed;
            webSocket.Error += OnError;
            webSocket.MessageReceived += OnMessageReceived;
            webSocket.Open();

        }

        private  void OnError(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
        }
        public  StringBuilder retsb = new StringBuilder();
        private  void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            Console.WriteLine("OnMessageReceived");
            dynamic msg = JsonConvert.DeserializeObject(e.Message);
            if (msg.action == "result")
            {

                var adsfas = JsonConvert.DeserializeObject<Root>(JObject.Parse(e.Message).SelectToken("data").ToString());
                foreach (var item in adsfas.cn.st.rt)
                {
                    foreach (var item1 in item.ws)
                    {

                        foreach (var item3 in item1.cw)
                        {
                            retsb.Append(item3.w);
                        }
                    }
                }
                if (adsfas.ls == "true")
                {
                    ///结果识别结果
                     result = retsb.ToString();
                }


            }


        }

        private  void OnClosed(object sender, EventArgs e)
        {
            Console.WriteLine("OnClosed");
            //dynamic msg = JsonConvert.DeserializeObject(retsb.ToString());
            //retsb.Clear();
            //foreach (var item in msg.cn.st.rt.ws)
            //{
            //    retsb.Append(item.cw.w);
            //}

            string adsf = retsb.ToString();
            Console.WriteLine("OnClosed+结果" + adsf);
        }

        private  void OnOpened(object sender, EventArgs e)
        {
            Console.WriteLine("OnOpened");


            var filestream = File.Open(fileurl, FileMode.Open);
            while (true)
            {
                byte[] buffer = new byte[1280];//一次读取5M内容
                int r = filestream.Read(buffer, 0, buffer.Length);//实际读取的有效字节数

                if (r == 0)//读到最后内容
                {
                    break;
                }

                //以ANSI默认格式读取文本内容
                //string tempStr = Encoding.Default.GetString(buffer, 0, r);
                //Console.WriteLine(tempStr);

                webSocket.Send(buffer, 0, buffer.Length);
            }



            webSocket.Send("{\"end\": true}");


        }

        public  string MD5Hash(string source)
        {
            using (MD5 md5 = MD5.Create())
            {
                byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(source));

                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    stringBuilder.Append(data[i].ToString("x2"));
                }
                return stringBuilder.ToString();
            }
        }

        public  string ToBase64hmac(string strText, string strKey)

        {

            HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));

            byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));

            return System.Convert.ToBase64String(byteText);

        }
        private  String GetAuthUrl(String hostUrl, String apiKey)
        {
            Uri url = new Uri(hostUrl);
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            var tt1 = Convert.ToInt64(ts.TotalSeconds).ToString();

            string tt = appid + tt1;
            var tt5 = MD5Hash(tt);

            string signa = ToBase64hmac(tt5, apiKey);




            UriBuilder builder = new UriBuilder()
            {
                Scheme = "wss",
                Host = url.Host,
                Path = url.AbsolutePath,
                Query = $"?appid={appid}&ts={System.Net.WebUtility.UrlEncode(tt1)}&signa={signa}",
            };
            return builder.ToString();
        }

        public  void Play()
        {

            string aftee23 = retsb.ToString();


            pcmStream.Seek(0, SeekOrigin.Begin);

            using (var fs = File.Create("test.pcm"))
            {
                pcmStream.WriteTo(fs);//保存为语音文件



                FileStream fileStream = new FileStream("ptest111.wav", FileMode.Create);
                pcmStream.WriteTo(fileStream);
                pcmStream.Close();
                fileStream.Close();
            }
            //WaveOutEvent waveOutEvent = new WaveOutEvent();
            //waveOutEvent.Init(new RawSourceWaveStream(pcmStream, new WaveFormat(16000, 1)));
            //waveOutEvent.Play();
            Console.WriteLine("正在播放,按回车键停止");
            Console.ReadLine();
           // waveOutEvent.Stop();
            pcmStream.Close();
        }
    }









}
`

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值