自学内容网 自学内容网

AI文本朗读应用(二)

调用api实现TTS

注:如对api的使用有任何疑问,可以查阅文本转语音 REST API

  1. 选择右侧“解决方案资源管理器”中的“TTS_Demo”,右键选择“添加”->“新建项”。

    选择“类”,名称为“Authentication.cs”,点击“添加”。

  2. Authentication.cs 文件中,引用如下命名空间。

    using System.Net.Http;
    using System.IO;

    添加如下代码。

    namespace TTS_Demo
    {
        public class Authentication
        {
            private string subscriptionKey;
            private string tokenFetchUri;
    ​
            public Authentication(string tokenFetchUri, string subscriptionKey)
            {
                if (string.IsNullOrWhiteSpace(tokenFetchUri))
                {
                    throw new ArgumentNullException(nameof(tokenFetchUri));
                }
                if (string.IsNullOrWhiteSpace(subscriptionKey))
                {
                    throw new ArgumentNullException(nameof(subscriptionKey));
                }
                this.tokenFetchUri = tokenFetchUri;
                this.subscriptionKey = subscriptionKey;
            }
    ​
            public async Task<string> FetchTokenAsync()
            {
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", this.subscriptionKey);
                    UriBuilder uriBuilder = new UriBuilder(this.tokenFetchUri);
    ​
                    var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null).ConfigureAwait(false);
                    return await result.Content.ReadAsStringAsync().ConfigureAwait(false);
                }
            }
    ​
        }
    }

  3. 同理,新建类文件 TTSApi.cs,并添加如下代码。

    namespace TTS_Demo
    {      
        class TTSApi
        {
            //语言配置信息
            string locale = "zh-CN";
            string voiceName = "Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)";
        
            string accessToken;
            Authentication auth = new Authentication("https://westus.api.cognitive.microsoft.com/sts/v1.0/issuetoken", "REPLACE_WITH_YOUR_KEY");
            string host = "https://westus.tts.speech.microsoft.com/cognitiveservices/v1";
    ​
            //转换文本并保存
            public async Task textToSpeechAsync(string text, string savePath)
            {
                try
                {
                    accessToken = await auth.FetchTokenAsync().ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
    ​
                string body = "<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='"+locale+"'>"
                +"<voice name='"+voiceName+"'>" + text + "</voice></speak>";
    ​
                using (var client = new HttpClient())
                {
                    using (var request = new HttpRequestMessage())
                    {
                        // Set the HTTP method
                        request.Method = HttpMethod.Post;
                        // Construct the URI
                        request.RequestUri = new Uri(host);
                        // Set the content type header
                        request.Content = new StringContent(body, Encoding.UTF8, "application/ssml+xml");
                        // Set additional header, such as Authorization and User-Agent
                        request.Headers.Add("Authorization", "Bearer " + accessToken);
                        request.Headers.Add("Connection", "Keep-Alive");
                        // Update your resource name
                        request.Headers.Add("User-Agent", "YOUR_RESOURCE_NAME");
                        request.Headers.Add("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm");
                        // Create a request
                        Console.WriteLine("Calling the TTS service. Please wait... \n");
                        using (var response = await client.SendAsync(request).ConfigureAwait(false))
                        {
                            response.EnsureSuccessStatusCode();
                            // Asynchronously read the response
                            using (var dataStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                            {
                                using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.Write))
                                {
                                    await dataStream.CopyToAsync(fileStream).ConfigureAwait(false);
                                    fileStream.Close();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    其中,需要特别注意以下代码片段:

            string locale = "zh-CN";
            string voiceName = "Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)";
        
            string accessToken;
            Authentication auth = new Authentication("https://westus.api.cognitive.microsoft.com/sts/v1.0/issuetoken", "REPLACE_WITH_YOUR_KEY"); //替换为你的终结点和Key
            string host = "https://westus.tts.speech.microsoft.com/cognitiveservices/v1";

    • 上述的初始化中,需要替换你在TTS-api中分配的终结点和Key。Authentication

    • 上述的和允许用户更改不同的语言及发音。具体可选值可以查阅标准语音locale``voiceName

      以中文为例,我们这里选择了“zh-CN”的“HuiHuiRUS”。 因此我们根据查表内容,将和变量设置成对应值。其中,可以选择“完全服务名称映射”或“短语音名称”。locale``voiceName``voiceName

  4. Form1.cs 中,添加如下代码至类。Form1

    string tempFile = "temp.wav"; //临时文件存储路径
    TTSApi tts = new TTSApi(); 

  5. Form1.cs[设计] 界面中双击“生成”按钮,会自动生成函数,该函数绑定了“生成”按钮的点击事件,当用户点击“生成”按钮时会自动调用该函数。transferButton_Click

    完成此函数代码。

    private async void transferButton_Click(object sender, EventArgs e)
        {
           string text = textBox1.Text; //获取用户输入
                
            if (text.Length > 0)
            {
                await tts.textToSpeechAsync(text, tempFile);        
            }
        }

  6. 同理,双击"播放"按钮,完成函数代码。playButton_Click

    private void playButton_Click(object sender, EventArgs e)
        {
            SoundPlayer playSound = new SoundPlayer(tempFile);
            playSound.Play();
        }

  7. 双击"保存"按钮,完成函数代码。saveButton_Click

    private void saveButton_Click(object sender, EventArgs e)
        {
            string filePath = "";
            //取前10个字符作为文件名
            string fileName = (textBox1.Text.Length < 10) ? textBox1.Text : textBox1.Text.Substring(0, 10);
    ​
            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.FileName = fileName;
            saveFile.Filter = "音频文件 (*.wav) | *.wav"; 
            saveFile.RestoreDirectory = true; //保存并显示上次打开的目录
    ​
            if (saveFile.ShowDialog() == DialogResult.OK)
            {
                filePath = saveFile.FileName.ToString(); 
    ​
                if (File.Exists(tempFile))
                {
                    File.Copy(tempFile, filePath, true);
                }
                else
                {
                    Console.WriteLine("音频文件不存在");
                }
            }
        }

至此,我们就构建好了整个窗体应用。按即可运行程序。F5

将待朗读的文章复制到文本框,点击"生成"按钮,等待片刻即可生成对应的语音,你可以直接保存生成的音频文件,以便自己使用或分享给家人朋友。

在教程中,我们省略了部分细节,更多内容可以查看源代码

作业和挑战

1. 程序复现

按照上述的教程,复现一遍文本朗读的桌面应用程序,要求实现输入文本后能够生成语音并保存到本地。

2. 增加从文件读取文本信息的功能

当前的程序需要手动输入或复制内容到文本框,再点击"生成"。但是,当我们需要让计算机朗读长文章时,手动复制内容会十分地麻烦。那么,是否能增加一个功能,从文本文件中读取内容到文本框呢?

可参考如下交互方式来实现。

  1. 点击按钮"打开文件"

  2. 选择文本文件

    3.根据选择的文件自动加载


原文地址:https://blog.csdn.net/2301_81887304/article/details/135467752

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!