初探机器学习之使用讯飞TTS服务实现在线语音合成

article/2025/8/22 13:17:35

最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍。

一、什么是语音合成(TTS)

1.1 What is 语音合成?

  

  将文字信息转化为声音信息,给应用配上“嘴巴”,这就是语音合成。

Note:语音合成和语音识别技术是实现人机语音通信,建立一个有听和讲能力的口语系统所必需的两项关键技术。使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞争市场。和语音识别相比,语音合成的技术相对说来要成熟一些,并已开始向产业化方向成功迈进,大规模应用指日可待。

1.2 语音合成的应用场景

  目前,语音合成技术在我们生活中具有广泛的应用,如机器人发声、有声读物制作、语音播报等等,这些应用场景都离不开语音合成。

  

Note:在语音导航应用、新闻类 APP 中,语音合成可以快速生成高质量的播报音频,实现在开车、走路等不方便阅读消息的情况下,音频消息的即时传达。

1.3 语音合成的基本原理

  这里借用网易智能的一篇文章中的介绍如下:

  

  简单来说语音合成分为文本分析、韵律分析和声学分析三个部分。通过文本分析提取出文本特征,在此基础上预测基频、时长、节奏等多种韵律特征,然后通过声学模型实现从前端参数到语音参数的映射,最后通过声码器合成语音。整个过程类似于“编码、信息匹配,解码的过程”。

  

  对语音合成有兴趣的朋友,可以阅读以下这篇文章《吴恩达盛赞的Deep Voice详解教程,教你快速理解百度的语音合成原理》。

二、使用.NET Core调用讯飞API

2.1 科大讯飞TTS服务

  讯飞提供了众多极具特色的发音人(音库)供您选择。其合成音在音色、自然度等方面的表现均接近甚至超过了人声。这种语音合成体验,达到了真正可商用的标准。在我对百度、阿里、腾讯及讯飞的TTS服务对比中,讯飞的TTS体验好一些,且发音人(音库)最为丰富,还有四川话(准确来说是成都话)音库,碉堡了。大家可以去讯飞TTS服务网页体验一下。

2.2 .NET Core调用示例

  (1)首先得去讯飞开放平台注册一个账号,并申请一个勾选有“在线语音合成”的应用

  

  这里主要是拿到AppID及ApiKey,并且可以通过发音人管理增加发音库,当然,高级版的音库都是要单独收费的。免费版本的每天有500次的免费API调用机会。

  (2)参考官方API文档和C# DEMO

  PS:由于讯飞官方提供的C# DEMO是一个基于.NET Framework的比较老的DEMO,在.NET Core下无法正常使用,我将其简单地改写成了.NET Core版本,并封装了一个XunFeiCloudTtsService类如下:(每个属性都有注释,不再赘述,只是对API调用需要的一些属性的简单封装)

    public class XunFeiCloudTtsService{// Header Type : audio/mpegprivate const string AUDIO_MPEG_TYPE = "audio/mpeg";// AppID, AppKey 从讯飞开放云平台获取public string AppID { get; set; } = "your AppID";public string ApiKey { get; set; } = "your ApiKey";// 要进行合成的文字public string TextToSpeech { get; set; } = "这是一段测试文字";// 讯飞TTS服务API地址public string ServiceUrl { get; set; } = "http://api.xfyun.cn/v1/service/v1/tts";// aue = raw, 音频文件保存类型为 wav// aue = lame, 音频文件保存类型为 mp3public string AUE { get; set; } = "raw";// 音频采样率,可选值:audio/L16;rate=8000,audio/L16;rate=16000public string AUF { get; set; } = "audio/L16;rate=16000";// 发音人,可选值:详见控制台-我的应用-在线语音合成服务管理-发音人授权管理public string VoiceName { get; set; } = "xiaoyan";// 引擎类型,可选值:aisound(普通效果),intp65(中文),intp65_en(英文),// mtts(小语种,需配合小语种发音人使用),x(优化效果),// 默认为intp65public string EngineType { get; set; } = "intp65";// 语速,可选值:[0-100],默认为50public string Speed { get; set; } = "50";// 音量,可选值:[0-100],默认为50public string Volume { get; set; } = "50";// 音高,可选值:[0-100],默认为50public string Pitch { get; set; } = "50";// URL加密后的TextToSpeechpublic string Bodys { get; set; }// 要保存的文件夹路径public string SavePath { get; set; } = "./Output/";// 要保存的文件名public string FileName { get; set; } = $"TTS-{ Guid.NewGuid().ToString() }";static XunFeiCloudTtsService(){Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);}public XunFeiCloudTtsService(){ }public XunFeiCloudTtsService(string appID, string apiKey, string serviceUrl){AppID = appID;ApiKey = apiKey;ServiceUrl = serviceUrl;}public string GetTtsResult(){SetTextDataBodys();string param = "{\"aue\":\"" + AUE + "\",\"auf\":\"" + AUF + "\",\"voice_name\":\"" + VoiceName + "\",\"engine_type\":\""+ EngineType + "\",\"speed\":\"" + Speed + "\",\"volume\":\"" + Volume + "\",\"pitch\":\"" + Pitch + "\"}";// 获取十位的时间戳TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);string curTime = Convert.ToInt64(ts.TotalSeconds).ToString();// 对参数先utf-8然后用base64编码byte[] paramData = Encoding.UTF8.GetBytes(param);string paraBase64 = Convert.ToBase64String(paramData);// 形成签名string checkSum = Md5(ApiKey + curTime + paraBase64);// 设置HttpHeadersvar ttsRequest = (HttpWebRequest)WebRequest.Create(ServiceUrl);ttsRequest.Method = "POST";ttsRequest.ContentType = "application/x-www-form-urlencoded";ttsRequest.Headers.Add("X-Param", paraBase64);ttsRequest.Headers.Add("X-CurTime", curTime);ttsRequest.Headers.Add("X-Appid", AppID);ttsRequest.Headers.Add("X-CheckSum", checkSum);using (Stream requestStream = ttsRequest.GetRequestStream()){using (StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.GetEncoding("gb2312"))){streamWriter.Write(Bodys);}}string responseText = string.Empty;HttpWebResponse ttsResponse = ttsRequest.GetResponse() as HttpWebResponse;using (Stream responseStream = ttsResponse.GetResponseStream()){using (StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8"))){string headerType = ttsResponse.Headers["Content-Type"];if (headerType.Equals(AUDIO_MPEG_TYPE)){responseText = GetSuccessResponseText(ttsResponse);}else{responseText = streamReader.ReadToEnd();}}}return responseText;}#region 私有辅助方法/// <summary>/// 获取请求成功的响应文本/// </summary>/// <param name="ttsResponse">HttpWebResponse</param>/// <returns>响应Headers文本</returns>private string GetSuccessResponseText(HttpWebResponse ttsResponse){string responseText = string.Empty;using (Stream stream = ttsResponse.GetResponseStream()){MemoryStream memoryStream = StreamToMemoryStream(stream);if (!Directory.Exists(SavePath)){Directory.CreateDirectory(SavePath);}string fileType = string.Empty;switch (AUE.ToLower()){case "raw":fileType = "wav";break;case "lame":fileType = "lame";break;}File.WriteAllBytes($"{SavePath}{FileName}.{fileType}", streamTobyte(memoryStream));responseText = ttsResponse.Headers.ToString();}return responseText;}/// <summary>///  对要合成语音的文字先用utf-8然后进行URL加密/// </summary>private void SetTextDataBodys(){byte[] textData = Encoding.UTF8.GetBytes(TextToSpeech);TextToSpeech = HttpUtility.UrlEncode(textData);Bodys = string.Format("text={0}", TextToSpeech);}/// <summary>/// 生成令牌 :X-CheckSum/// 计算方法:MD5(apiKey + curTime + param),三个值拼接的字符串,进行MD5哈希计算(32位小写),其中apiKey由讯飞提供,调用方管理。/// </summary>/// <param name="token">apiKey + curTime + param</param>/// <returns>X-CheckSum</returns>private string Md5(string token){MD5 md5 = new MD5CryptoServiceProvider();byte[] bytes = Encoding.UTF8.GetBytes(token);bytes = md5.ComputeHash(bytes);md5.Clear();StringBuilder sb = new StringBuilder();for (int i = 0; i < bytes.Length; i++){sb.Append(Convert.ToString(bytes[i], 16).PadLeft(2, '0'));}return sb.ToString().PadLeft(32, '0');}/// <summary>/// 将流转换为缓存流/// </summary>/// <param name="instream">输入流</param>/// <returns>输出流</returns>private MemoryStream StreamToMemoryStream(Stream instream){MemoryStream outstream = new MemoryStream();const int bufferLen = 4096;byte[] buffer = new byte[bufferLen];int count = 0;while ((count = instream.Read(buffer, 0, bufferLen)) > 0){outstream.Write(buffer, 0, count);}return outstream;}/// <summary>/// 把缓存流转换成字节组/// </summary>/// <param name="memoryStream">缓存刘</param>/// <returns>字节数组</returns>private byte[] streamTobyte(MemoryStream memoryStream){byte[] buffer = new byte[memoryStream.Length];memoryStream.Seek(0, SeekOrigin.Begin);memoryStream.Read(buffer, 0, buffer.Length);return buffer;}#endregion}

  *.由于.NET Core下Encoding默认不支持GB2312,因此需要事先引入一个包:System.Text.Encoding.CodePages,然后在程序启动时注册一下,这里已经封装静态构造函数里面了。

NuGet>Install-Package System.Text.Encoding.CodePages

  客户端调用:

    public class Program{public static void Main(string[] args){XunFeiCloudTtsService ttsService = new XunFeiCloudTtsService();ttsService.AppID = "5c3806f12121";ttsService.ApiKey = "a99fff9fc537d883a181231231a37bf56dc8f28";ttsService.TextToSpeech = "大家好我是第一个语音合成!";ttsService.SavePath = "./TTS-Result/";ttsService.FileName = "Hello-TTS";ttsService.Speed = "60";var result = ttsService.GetTtsResult();Console.WriteLine(result);Console.ReadKey();}}

  *.这里AppID和ApiKey请使用你自己的,我博文这里是乱写的。

  调用结果:

  (1)响应结果

  

  *.如果提示illegal client ip,请到控制台中加入白名单列表:

  

  (2)语音文件

  

  So,播放一下?

  

三、小结

  有了语音合成,我们可以在我们的业务系统或者App中有了更多的玩法,虽然我们不了解语音合成的具体实现原理。此文只是一个简单的使用示例,无更多的内容,希望对你有帮助,本文的示例代码可以点击这里。

参考资料

(1)科大讯飞开放云平台,《在线语音合成服务》

(2)科大讯飞TTS服务,API说明文档

(3)网易智能,《让机器说话更自然,语音合成还能干什么》

 

转载于:https://www.cnblogs.com/edisonchou/p/edc_machine_learning_xunfeicloud_online_tts_introduction.html


http://chatgpt.dhexx.cn/article/yiwxE5pO.shtml

相关文章

麒麟系统虚拟机安装教程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 1.首先得安装VM Ware软件。 2.打开VM Ware&#xff0c;点击“文件”->“新建虚拟机”。 3.进入新建虚拟机向导&#xff0c;点击下一步。如下图&…

史上最最详细的win10虚拟机安装教程,手把手从头到尾

史上最最详细的win10虚拟机安装教程 1.安装VMware 12Pro 前天我安装了VM12&#xff0c;并安装了win10系统的虚拟机。遇到了很多问题&#xff0c;我想拿出来和大家分享一下解决办法。 首先&#xff0c;第一步先上下载地址&#xff1a; VMware 12下载地址 大家下载时记得选择普…

虚拟机安装教程

虚拟机安装教程   vmware10虚拟机是个软件&#xff0c;安装后可用来创建虚拟机&#xff0c;在虚拟机上再安装系统&#xff0c;在这个虚拟系统上再安装应用软件&#xff0c;所有应用就像操作一台真正的电脑&#xff0c;因此&#xff0c;我们可以利用虚拟机学习安装操作系统、…

Fedora虚拟机安装教程

Fedora虚拟机安装教程 &#xff08;作者&#xff1a;Baron_wu 禁止转载&#xff09; 获取VMware14 链接&#xff1a; https://pan.baidu.com/s/1WQuajxl2KOtcn9WYendglQ 提取码&#xff1a;2K32获取Fedora安装镜像 64bit &#xff1a; https://download.fedoraproject.org/pu…

win10虚拟机安装教程

win10虚拟机安装 下载iso镜像文件win10镜像安装步骤拍摄快照 下载iso镜像文件 首先我们需要准备一个win10的iso镜像系统&#xff0c;下载地址&#xff1a;https://msdn.itellyou.cn/ 我们选择最新版本就可以了&#xff0c;选择consumer editions版本&#xff08;其实选择两个…

VMware16虚拟机安装教程

一、VMware下载 VMware下载地址&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 我的电脑是Windows电脑&#xff0c;所以选择Workstation 16 Pro for Windows下载&#xff0c;如果你的电脑事Linux系统&#xff0c;选择Work…

deepin虚拟机安装教程

deepinISO镜像&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1yzxtAetA9eccO6pNFO6wTg 提取码&#xff1a;az78 --来自百度网盘超级会员V5的分享 deepin是Linux内核的&#xff0c;里面附带办公软件&#xff0c;今天小编就在虚拟机上体验一波&#xff01;开车&#x…

CentOS7虚拟机安装教程

第一步&#xff1a;打开虚拟机找到创建新的虚拟机 第二步&#xff1a;进入向导选择典型 第三步&#xff1a;选择稍后添加操作系统 第四步&#xff1a;选择linux CentOS 7的版本 第五步&#xff1a;自定义虚拟机名称和安装地址 第六步&#xff1a;指定磁盘大小&#xff0c;默认选…

Ubuntu 20.04 虚拟机安装教程

首先你需要下载 VMware&#xff0c;建议不要放于C盘&#xff0c;不会下载的建议看 哔哩哔哩Frank。下载 Ubuntu 20.04 镜像&#xff0c;也是建议不放于C盘&#xff0c;我放在了 E:\Ubuntu 20.04 iso 完成上诉步骤&#xff0c;打开VMware&#xff0c;点击创建新的虚拟机。选择 自…

Linux虚拟机安装教程

一、虚拟机的创建 我们在工作中会需要用到Linux环境&#xff0c;但Linux系统毕竟没有Windows系统用起来顺手。处于这种考虑&#xff0c;我们可以在电脑上安装一个Linux虚拟机&#xff0c;在虚拟机上虚拟出一套电脑所需要的资源。现在就开始进行VMware的安装。 我们下载完VMw…

虚拟机安装(详细教程)

我这个主要是前期的下载安装&#xff0c;后面的操作大家可以参考VirtualBox 安装Kali linux最新版&#xff08;超详细&#xff09;_Jokong的博客-CSDN博客_virtualbox安装kali 这个作者写的超级详细&#xff0c;小白完全跟得上 目录 官网地址&#xff1a; VirtualBox6.1.3…

最强卸载神器,使你的Windows绝对干净

前言 Uninstall Tool 是一款超级强大的软件卸载工具&#xff0c;它完全可以替代您Windows自带的”添加/删除程序”功能&#xff0c;超强的卸载能力可以卸载您安装的任何第三方软件应用&#xff0c;也可卸载注册表相关项让你的系统更清洁干净&#xff0c;但它有一个更加强大的功…

2345文件粉碎,文件强力删除工具无捆绑纯净提取版

前言 对比起其余文件粉碎工具来说&#xff0c;这款速度更快&#xff0c;成功率也更高&#xff0c;还是不错的 这里提供无捆绑并且纯净的2345文件粉碎工具&#xff0c;除去AvShellExt64.dll和AvShellExt.dll修改过几处十六进制&#xff0c;其余都是软件原版文件&#xff0c;可…

彻底删除顽固dll文件

对于一些顽固的软件&#xff0c;在卸载之后会有残留的 dll 文件保留&#xff0c;而且这个 dll 文件并不能删除,有的会绑定到进程中(一般容易绑定到expore.exe进程中)随电脑开机一起启动,在删除文件的时候就会提示有程序占用(或服务在运行等) 下面介绍一种彻底删除顽固 dll 文件…

强大的万能删除代码,你也可以制作强力删除软件了

你有没有遇到下面的情况&#xff0c;在删除文件夹时出现 文件夹删除不了&#xff0c;这时候你会怎么办&#xff1f; 其实这一般是畸形文件夹&#xff0c;至于什么是畸形文件夹&#xff0c;自己百度一下&#xff0c;这种文件夹用普通方式是无法删除的&#xff0c; 或许你会选择…

彻底删除 Windows Defender 这个垃圾

彻底卸载&#xff1a; 把如下代码复制到文本中&#xff0c;后缀命名为cmd,右键&#xff0c;使用管理员方式打开&#xff0c;否则会报错 需要下载 install_wim_tweak.exe 这个软件&#xff0c;后面的压缩包有。 echo off cd /d "%~dp0" echo Uninstalling ... CLS i…

windows 强力 删除

昨天 在csdn上下载了几个文件 但是很奇怪 &#xff0c;都是后缀非常怪。 一个文件有两个这个&#xff0c;一个是0字节一个正常。 直接方法请空降到本文末尾。 我把显示信息3.8MB的改过来后好用。然后顺手删除另外一个0字节发现不好用。然后尝试各种删除的方法&#xff0c;…

Wise Force Deleter强制删除工具

强制删除工具 在使用电脑的过程中&#xff0c;你是否遇到过这样的情况&#xff0c;想删除一个文件&#xff0c;但是系统却弹出无法删除文件&#xff0c;遇到这种情况&#xff0c;我们通常就很烦恼。现在我们应该就不用烦了&#xff0c;因为Wise Force Deleter会帮我们解决这个…

彻底删除流氓软件

你的电脑是不是每次都会自动下载4个或8个流氓软件&#xff1f; 比如2345这些软件&#xff0c;废话不多说&#xff0c;直接上干货&#xff01; 浏览器搜索geek然后下载安装&#xff0c;打开geek找到你电脑中的流氓软件&#xff0c;然后卸载&#xff0c;顺便把注册表也删了。 …

几个Windows强力卸载工具软件推荐

对于我们有在使用Windows系统的时候&#xff0c;是不是会主动或者被动的安装一些软件和插件工具。殊不知日积月累之后&#xff0c;系统中的软件会越来越多&#xff0c;甚至有很多我们安装几个月甚至几年都不会用到的。这些软件&#xff0c;其实是可以卸载的。清理没用的或者不用…