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();
        }
    }









}
`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是一家提供语音识别和自然语言处理技术的公司,它的实时语音转写功能可以将语音实时转化为文本。使用实时语音转写需要以下步骤: 第一步,创建开放平台账号并在平台上申请相应的应用ID和secret key。 第二步,安装Python SDK并导入依赖包,例如:requests、json。 第三步,通过实时语音转写接口发送请求,传递相关参数,从而获得转写结果。 下面是一个基于Python SDK开发实时语音转写示例代码: ```python # 导入依赖包 import websocket import requests import time import hashlib import base64 import json # API身份验证 APPID = '你的应用ID' API_SECRET = '你的APISecret' API_KEY = '你的APIKey' # 获取时间戳和鉴权参数 def getHeaderParam(): curTime = str(int(time.time())) param = { "engine_type": "sms16k", "aue": "raw", "sample_rate": "16000", "param": "aue=raw,engine_type=sms16k,sample_rate=16000" } paramStr = json.dumps(param) paramBase64 = str(base64.b64encode(paramStr.encode('utf-8')), 'utf-8') checkSum = hashlib.md5((API_KEY + curTime + paramBase64).encode('utf-8')).hexdigest() header = { 'X-CurTime':curTime, 'X-Param':paramBase64, 'X-Appid':APPID, 'X-CheckSum':checkSum } return header # 处理结果 def on_message(ws, message): messageDict = json.loads(message) code = messageDict['code'] if code != 0: print("请重新开始录音") else: result = messageDict['data']['result'] print(result) # 主函数 if __name__ == '__main__': # 通过REST API获取实时语音转写WebSocket地址和token response = requests.post('http://api.xfyun.cn/v1/service/v1/iat', headers=getHeaderParam()) responseDict = json.loads(response.text) if responseDict['code'] != '0': print(responseDict['message']) else: address = responseDict['data']['url'] token = responseDict['data']['token'] # 创建WebSocket连接 ws = websocket.WebSocketApp(address, on_message=on_message, on_error=on_error, on_close=on_close) # 添加鉴权信息 ws.headers = { 'Authorization': token } # 开始录音 ws.send(json.dumps({'common': {'app_id': APPID}})) ws.send(json.dumps({'business': {'language': 'zh_cn','domain': 'iat','accent': 'mandarin','vad_eos': 10000},'data': {'status': 0}})) # 持续录音并发送转写请求 while(True): audio = input("请输入:") # 实现语音输入(如需使用麦克风录音?) if audio == '': break else: ws.send(audio.encode("utf-8")) # 结束录音 ws.send(json.dumps({'business': {'cmd': 'auw', 'aus': '00'}})) ws.close() ``` 注意,该示例代码采用的是模拟语音输入的方式,可以通过实现语音输入并将其转为byte字符串的方式替换。另外,在处理结果的函数内应该添加一些错误处理,以防出现意外情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值