C#调用百度AI接口实现文本转音频

C#调用百度AI接口实现文本转音频

几个比较重要的点:
文件的传输:stream流对象的创建和使用;
服务器沟通:请求对象和响应对象的创建与使用
缓存文件的创建与写读(用来保存令牌)
下面上代码与窗体:
C#调用百度AI接口实现文本转音频_第1张图片
代码:(只需要在百度ai平台上申请密匙将我代码中的汉字替换掉即可)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using System.Net;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;

namespace 文字识别
{

    
    public partial class Form1 : Form
    {
        string token = File.ReadAllText(@"D:\Users\HongfengDu\Tr\token.txt", Encoding.Default);//读取缓存的服务端令牌,如果没有该文件则会报错
        string cuid = "789qwertyuiop456asdfghjkl";//唯一识别码
        public class BdTtsTokenModel//声明一个令牌json包模型,用来对json包反序列化解析令牌,有效期30天
        {
            public string access_token { get; set; }
            public string expires_in { get; set; }
            public string refresh_token { get; set; }
            public string scope { get; set; }
            public string session_key { get; set; }
            public string session_secret { get; set; }
        }
        public Form1()
        {
            InitializeComponent();
            string tokpath = @"D:\Users\HongfengDu\Tr\token.txt";
            if (File.Exists(tokpath)) File.Create(tokpath).Close();
        }
        private void Button1_Click(object sender, EventArgs e)
        {
            string url = "";//完整url路径
            string url1 = "http://tsn.baidu.com/text2audio?";//调用路径
                                                             //必须的几个参数
            string tex = textBox1.Text;
            //string tex = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");//本人懒省事,直接让他报现在的时间
            if (tex.Length >= 2048)//官方要求长度为小于2048位
            {
                MessageBox.Show("字符串过长!");
                return;
            }
            if (string.IsNullOrEmpty(token))
            {
                MessageBox.Show("未获取到Token,请检查!");
                return;
            }
            string vol = comboBox1.Text;
            string spd = comboBox2.Text;
            string pit = comboBox3.Text;
            string per = comboBox4.Text;
            url = url1 + "lan=zh&ctp=1&cuid=" + cuid + "&tok=" + token +"&tex="+tex +"&vol="+vol+"&per="+per+"&spd="+spd+"&pit="+pit+"&aue=3";
            System.Diagnostics.Process.Start(url);//这里我直接让浏览器读了
        }

        private void Button2_Click(object sender, EventArgs e)
        {
                //官网地址:https://aip.baidubce.com/oauth/2.0/token
                var APP_ID = "这个地方填你自己申请的";//百度账号应用密匙,var好像只能在函数里建立,而不能在string类里建立,不懂
                var API_KEY = "这个地方填你自己申请的";
                var SECRET_KEY = "这个地方填你自己申请的";
                var client = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);//Baidu.Aip.Speech.Tts是语音合成的交互类,应该是引用的aipSDK里的方法
                client.Timeout = 60000;  // 修改超时时间 
                string tokenURL = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY;//令牌换取地址
                //在Url里的client_id后输入你的APIKey,client_secret后输入你的SecretKey
                Encoding ec = Encoding.UTF8;//官方要求以UTF-8请求
                                            //请求出Json字符串
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(tokenURL);//请求对象只能用工厂方法创建,不能new实例化创建
                req.Timeout = 5000;
                req.Method = "POST";//推荐使用post方法上传
                string Nulldata = "";
                byte[] Postdata = Encoding.UTF8.GetBytes(Nulldata);//向服务器发送空字节以换取令牌包
                Stream reqStream = req.GetRequestStream();//post方法必须以流的方式写入,但发送一个空字节肯定有更简单的方式我还不知道
                reqStream.Write(Postdata, 0, Postdata.Length);//将Postdata的字节以流的形式写入到req的requeststream中
                reqStream.Close();
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();//接收服务器返回的数据包,这里报错的话请检查你的APIKey和SecretKey,一般是401,也就是服务器拒绝了你的请求
                Stream responseStream = rsp.GetResponseStream();
                StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8);
            string line = string.Empty;//一个字节长度的缓存,用以一个字节一个字节地读取流数据
            StringBuilder result = new StringBuilder();
            while (!readStream.EndOfStream)
            {
                line = readStream.ReadLine();
                result.Append(line);
            }
            readStream.Close();
            readStream.Dispose();
            string tokenJosn = result.ToString();
            responseStream.Close();
            responseStream.Dispose();
            BdTtsTokenModel b = JsonConvert.DeserializeObject<BdTtsTokenModel>(tokenJosn);//解析出Token
            token= b.access_token;
            StreamWriter sw = new StreamWriter(@"D:\Users\HongfengDu\Tr\token.txt", false, Encoding.Default);
            sw.Write(token);
            sw.Flush();
            sw.Close();
        }

        private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}

主要是练练手,所以鲁棒性很差,可以自己琢磨
如有不妥,欢迎指正

你可能感兴趣的:(语音合成,C#,软件开发)