AI文本朗读应用(二)

2024-01-10 16:12:08

调用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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。