• 基于百度云实现微信服务号内文字语音互转STT TTS


    先上效果图:

    使用百度语音识别和语音合成两个接口实现

    1.语音识别STT

    用户微信输入,调用百度api,得到识别文本。

    2.语音合成TTS

    用户输入问题,调用百度api,得到mps音频,使用开源转码工具ffmpeg,转成微信音频格式amr

    代码

    使用基于.net的NorWeChat开源微信框架

            [HttpPost]
            [ActionName("Callback")]
            public ActionResult Post(string msg_signature, string timestamp, string nonce)
            {
                try
                {
                    string obj = wx.GetMsgStr(Request.InputStream, msg_signature, timestamp, nonce);
                    ReceiveMsg obj = ReceiveMsg.GetMsgObj(msg.Text);
                    if (obj != null)
                    {
                        WeChat wx = WXClient.GetWXAPI();
                        var resStr = string.Empty;
                        switch (obj.MsgType)
                        {
                            case "text":
                                RceMsgText ttobj = (RceMsgText)obj;
                                TextToVoice.Send(ttobj);
    
                                break;
                            case "voice":
                                RceMsgVoice rmvobj = (RceMsgVoice)obj;
                                VoiceToText.Send(rmvobj);
                                break;
                        }
                }
                catch (Exception ex)
                {
                    fileLog.Error(ex.Message);
                    fileLog.Error(ex.StackTrace);
                    fileLog.Error(ex.ToString());
                }          
                return Content(null);
            }

    /// <summary>
    /// 处理发送的消息
    /// </summary>
    /// <param name="obj">发送消息</param>
    public static void Send(RceMsgText obj)
    {
    // 设置APPID/AK/SK
    var APP_ID = "你的xxx";
    var API_KEY = "你的xxx";
    var SECRET_KEY = "你的xxx";
    //1.调用百度语音合成接口,生成音频文件mp3
    var client = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);
    // 可选参数
    var option = new Dictionary<string, object>()
    {
    {"spd", 5}, // 语速
    {"vol", 7}, // 音量
    {"per", 1} // 发音人,4:情感度丫丫童声
    };

    
    

    string name = DateTime.Now.ToString("yyyyMMddhhmmssttt");

    
    

    var result = client.Synthesis(obj.Content, option);

    
    

    if (result.ErrorCode == 0) // 或 result.Success
    {
    File.WriteAllBytes(@"D:amrffmpegmp3" + name + ".mp3", result.Data);
    //mp3转amr
    //ffmpeg -i 5.mp3 -ar 8000 -ab 12.2k -ac 1 6.amr
    VideoConvertFlv(@"D:amrffmpegmp3" + name + ".mp3", @"D:amrffmpegamr" + name + ".amr");
    //amr上传到微信临时素材
    WeChat wc = new WeChat(WeChatParameter.CorpID, WeChatParameter.Secret, WeChatParameter.AgentID);
    UploaMedia media = wc.mediaTemp(wc.GetAccessTokenVal(), "voice", @"D:amrffmpegamr" + name + ".amr");
    if (media != null && media.errcode == 0)
    {
    //发送临时素材
    string res = wc.SendVoice(wc.GetAccessTokenVal(), obj.FromUserName, "", "", obj.AgentID, media.media_id, "0");
    }
    }
    }

    
    

    public static void VideoConvertFlv(string FromName, string ExportName)
    {

    
    

    string ffmpeg = @"D:amrffmpegffmpeg.exe";
    //FromName = "";
    //ExportName = "";
    string Command = " -i " + FromName + " -ar 8000 -ab 12.2k -ac 1 " + ExportName; //Flv格式
    //string Command = " -i "test.wmv" -y -ab 32 -ar 22050 -b 800000 -s 320*240 "2.flv"";

    
    

    //string Command = "E:\FFmpeg\ffmpeg.exe -i E:\ClibDemo\VideoPath\admin\a.wmv -y -ab 56 -ar 22050 -b 500 -r 15 -s 320*240 " ExportName;
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.FileName = ffmpeg;
    p.StartInfo.Arguments = Command;
    p.StartInfo.WorkingDirectory = @"D:amrffmpeg";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.CreateNoWindow = false;
    //开始执行
    p.Start();
    p.BeginErrorReadLine();
    p.WaitForExit();
    p.Close();
    p.Dispose();
    }

    public static void Send(RceMsgVoice obj)
    {
    string returnText = string.Empty;

    //组装下载链接
    string downloadurl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", wx.GetAccessTokenVal(), obj.MediaId);

    System.Net.WebClient _WebClient = new System.Net.WebClient();

    _WebClient.DownloadFile(downloadurl, @"D:amr" + obj.MediaId + ".amr");

    // 设置APPID/AK/SK
    var APP_ID = "11059149";
    var API_KEY = "0i6s4Z7Rj4HVwYSi324mXhN1";
    var SECRET_KEY = "InmF5wDHuQl7gyLbMc7hNuyiM3rWt5Vf";

    var client = new Baidu.Aip.Speech.Asr(API_KEY, SECRET_KEY);

    var data = File.ReadAllBytes(@"D:amr" + obj.MediaId + ".amr");
    JObject mObj = client.Recognize(data, "amr", 8000);

    int id = Convert.ToInt32(mObj["err_no"]);
    string err_msg = mObj["err_msg"].ToString();
    string result = string.Empty;
    if (mObj["result"] != null)
    {
    JToken arr = mObj["result"];//获取Json里的数组 {arr:[{yy:1,zz:2},{yy:3,zz:4}]}

    foreach (JToken baseJ in arr)//遍历数组
    {
    result = baseJ.Value<string>();
    }
    }

    if (mObj != null && id == 0)
    {
    returnText = result;
    }
    else
    {
    returnText = err_msg;
    }


    //发送消息
    wx.SendText(wx.GetAccessTokenVal(), obj.FromUserName, "", "", obj.AgentID, returnText, "0");
    }

     
  • 相关阅读:
    [转]暴风电视开机卡死、闪屏怎么办
    暴风电视快速查询机器型号及平台
    暴风电视风行系统FUNOS插入U盘、移动硬盘不能写入文件。
    yum版本号前有:冒号 指的是依赖版本号,默认0不显示
    yum多个源repo安装指定版本docker
    [转]YUM的工作机制与配置
    yum!base仓库里的repo id(源标识)前有叹号
    Docker新旧版本号下载
    yum没有可用软件包 docker。错误:无须任何处理CentOS-Media.repo仓库
    【笔记整理】之 servlet
  • 原文地址:https://www.cnblogs.com/yilanyang/p/8918754.html
Copyright © 2020-2023  润新知