AI文本朗读应用(二)
调用api实现TTS
注:如对api的使用有任何疑问,可以查阅文本转语音 REST API。
-
选择右侧“解决方案资源管理器”中的“TTS_Demo”,右键选择“添加”->“新建项”。
选择“类”,名称为“Authentication.cs”,点击“添加”。
-
在 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); ? ? ? ? ? } ? ? ? } ? ? } }
-
同理,新建类文件 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
-
-
在 Form1.cs 中,添加如下代码至类。
Form1
string tempFile = "temp.wav"; //临时文件存储路径 TTSApi tts = new TTSApi();
-
在 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); ? ? ? ? ? ? ? } ? }
-
同理,双击"播放"按钮,完成函数代码。
playButton_Click
private void playButton_Click(object sender, EventArgs e) ? { ? ? ? SoundPlayer playSound = new SoundPlayer(tempFile); ? ? ? playSound.Play(); ? }
-
双击"保存"按钮,完成函数代码。
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. 增加从文件读取文本信息的功能
当前的程序需要手动输入或复制内容到文本框,再点击"生成"。但是,当我们需要让计算机朗读长文章时,手动复制内容会十分地麻烦。那么,是否能增加一个功能,从文本文件中读取内容到文本框呢?
可参考如下交互方式来实现。
-
点击按钮"打开文件"
-
选择文本文件
3.根据选择的文件自动加载
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!