关于百度、微软语音合成的实现案例
关键词
自助机产品、排队呼叫功能、网络喇叭、百度语音合成SDK、微软TTS
阅读建议
对自助机产品功能扩展感兴趣的读者、需要实现远程语音呼叫功能的开发者、想要了解网络喇叭选型及其使用的技术人员、对百度语音合成SDK和微软TTS感兴趣的开发者
阅读时长
预计阅读时长:15-20分钟。这个阅读时长是基于文章内容的详细程度和技术深度来预估的,读者可以在这个时间内较为全面地了解整个项目的需求、解决思路、准备工作以及具体的开发工作。


目录
需求
解决思路
准备工作
开发工作
准备
百度语音合成SDK(短文本)的使用
申请账号获得授权
调用百度语音合成SDK
微软TTS的使用
获取当前Windows中的发音人信息:
调用微软TTS
其他代码
需求
近日公司的自助机产品要在现有自助服务功能的基础上,增加一个排队呼叫功能。考虑到现有自助服务需要对申请人进行语音提示,新增的排队呼叫发声不能放在本地,应另外想办法。
解决思路
经研究采用了网络喇叭的方式:本地语音提示,仍然采用本机TTS并发声播放;另购入一个网络喇叭,在需要对排队人员进行呼叫时,本机从服务器获取呼叫信息(排队号、窗口),调用网络喇叭自带的TTS,或者使用互联网(如百度开放平台)的语音合成,实现远端(喇叭安装在等候区上方)播放。
准备工作
网络喇叭的选型:由于等候区上方的吊顶周边无电源,故选择了一款支持POE供电的网络喇叭。喇叭自带配套软件,可实现文本合成、实时采集等功能。
POE供电模块:网络喇叭功率20W,需要选择单口供电功率20W以上的POE交换机或者供电模块。
将POE交换机连接电源,自助机连接网线至POE交换机,再从该交换机引出一根网线,经由吊顶穿线,连接等候区上方的吊装网络喇叭。
开发工作
准备
在Visual Studio中,使用Nuget安装Baidu.Aip包
使用Nuget安装System.Speech包,并添加“using System.Speech.Synthesis;”的引用
百度语音合成SDK(短文本)的使用
申请账号获得授权
注册百度开发者平台账号,新建应用并申请百度云语音合成服务,最终得到API_KEY、Secret_KEY两个参数值。
调用百度语音合成SDK
var API_KEY = this.txtAppKey.Text;
var SECRET_KEY = this.txtSecreKey.Text;
var _ttsClient = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);
_ttsClient.Timeout = 60000; // 修改超时时间
// 可选参数
var option = new Dictionary < string,object > () {{"spd",GetStandardSpeed(this.trbSpeed.Value)}, // 语速,取值0-15,默认为5中语调{"vol",GetStandardVolume(this.trbVolume.Value)}, // 音量:基础音库取值0-9{"per",cbBaiduReader.SelectedIndex}, // 发音人:度小美=0,度小宇=1,度逍遥(基础)=3,度丫丫=4{"aue",6} //下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav};
// 使用提供的文本和可选参数进行语音合成
var result = _ttsClient.Synthesis(this.txtContent.Text.Trim(), option);
// 检查结果的错误代码,如果为0(或result.Success为真),表示合成成功
if (result.Success) // 或 result.ErrorCode为0
{ // 使用MemoryStream来读取合成后的语音数据 using (MemoryStream ms = new MemoryStream(result.Data)) { // 使用SoundPlayer来播放语音 using (System.Media.SoundPlayer sp = new System.Media.SoundPlayer(ms)) { sp.Play(); } }
}
注:由于System.Media.SoundPlayer仅能播放wav,故百度语音合成参数“aue”固定位6(wav格式)。
微软TTS的使用
获取当前Windows中的发音人信息:
// 使用SpeechSynthesizer类创建一个语音合成器实例,并确保在完成后释放资源
using (SpeechSynthesizer synthesizer = new SpeechSynthesizer())
{ // 遍历并获取系统已安装的所有语音 foreach (var voice in synthesizer.GetInstalledVoices()) { // 获取当前语音的详细信息 var info = voice.VoiceInfo; // 将语音的名称添加到comboBox1的下拉列表中,供用户选择 comboBox1.Items.Add(info.Name); }
}
调用微软TTS
// 使用SpeechSynthesizer类创建一个新的语音合成器实例
using(var synthesizer = new SpeechSynthesizer()) {// 将语音输出设置为默认音频设备 synthesizer.SetOutputToDefaultAudioDevice();// 从comboBox1中选择一个语音,这里的comboBox1可能是一个下拉列表,用于选择不同的语音 synthesizer.SelectVoice(comboBox1.Text);// 设置语音的音量,音量值通过调用GetStandardVolume函数和trbVolume控件的值来确定 synthesizer.Volume = GetStandardVolume(this.trbVolume.Value);// 设置语音的语速,语速值通过调用GetStandardSpeed函数和trbSpeed控件的值来确定 synthesizer.Rate = GetStandardSpeed(this.trbSpeed.Value);// 读取txtContent文本框中的内容,并去除首尾的空白字符,然后使用语音合成器朗读这段文本 synthesizer.Speak(this.txtContent.Text.Trim());
}
其他代码
另外,考虑到百度语音合成和微软TTS的音量、语速的取值范围不尽相同,故编写二者标准化方法进行转换:
// 定义了一个私有方法GetStandardVolume,用于根据当前的TTS引擎获取标准音量。
// 入参为微软tts要求的0-100
private int GetStandardVolume(int currentVolume)
{ // 判断当前的TTS引擎是否为百度。 // 如果是百度引擎(音量范围0-9),则将当前音量乘以0.09作为标准音量返回。 // 如果不是百度引擎,则直接返回当前音量。 return currentTTSEngine == CurrentTTSEngine.Baidu ? (int)(0.09 * currentVolume) : currentVolume;
} // 定义了一个私有方法GetStandardSpeed,用于根据当前的TTS引擎获取标准语速。
//入参为微软tts要求的-10~10
private int GetStandardSpeed(int currentSpeed)
{ // 判断当前的TTS引擎是否为百度。 // 如果是百度引擎(语速取值范围0-15),则计算标准语速,计算方式为:当前语速加10后乘以0.75,再加0.5,最后转换为整数返回。 // 如果不是百度引擎,则直接返回当前语速。 return currentTTSEngine == CurrentTTSEngine.Baidu ? (int)(0.75 * (currentSpeed + 10) + 0.5) : currentSpeed;
}
至于上面映射的线性关系参数的确定,让AI帮了忙:


相关文章:
关于百度、微软语音合成的实现案例
关键词 自助机产品、排队呼叫功能、网络喇叭、百度语音合成SDK、微软TTS 阅读建议 对自助机产品功能扩展感兴趣的读者、需要实现远程语音呼叫功能的开发者、想要了解网络喇叭选型及其使用的技术人员、对百度语音合成SDK和微软TTS感兴趣的开发者 阅读时长 预计阅读时长…...
二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印
1.把一棵二叉树转换为它的镜像树。 void mirror_tree(TreeNode *root) {if(rootNULL) return ;TreeNode *temproot->right;root->rightroot->left;root->lefttemp;mirror_tree(root->right);mirror_tree(root->left);}2、输入两棵二叉树A,B&…...
瑞秋,詹妮弗·安妮斯顿多年来与本·阿弗莱克保持着“调情”友谊 又一个詹妮弗
尽管所有迹象都表明本阿弗莱克和詹妮弗洛佩兹的婚姻即将走向离婚,但他尚未公开评论此事。不过,好莱坞圈内人士已经纷纷将他与另一位名人联系起来。事实上,是另一位詹妮弗。 一位消息人士向媒体透露,詹妮弗安妮斯顿和阿弗莱克一直都很有默契——无论是在银幕上还是在银幕外…...
指纹失效,忘记iPhone屏幕解锁密码怎么应对?
为保证手机的安全及隐私,我们会给手机设置屏幕锁屏密码,通过输入设置密码来解锁手机屏幕锁,但为了给大家提供快速便捷的解锁方式,苹果公司提供了指纹解锁,不仅解锁更便捷了还极大地增强了设备的安全性。但有时我们手指…...
09.XSS跨站脚本攻击(超详细!!!)
1、什么是XSS XSS(跨站脚本攻击):攻击者利用这个漏洞将恶意脚本注入到网页中,当其它用户浏览这些页面时,恶意脚本会在用户的浏览器中执行。XSS攻击允许攻击者在用户的浏览器上执行脚本,从而可能获取用户的…...
讲解人工智能在现代科技中的应用和未来发展趋势-水文
人工智能(Artificial Intelligence,简称AI)是一种模拟人类智能的科技领域,它通过计算机模拟人类的思维、学习、推理和决策能力,以便解决复杂的问题。近年来,人工智能技术的发展取得了惊人的进展,…...
2.2 QT 环境配置
2.2 QT环境配置 QT是一个1991年由QT Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可以用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器&…...
2.类和对象(上)
1. 类的定义 1.1 类定义格式 • class为定义类的关键字,Stack为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; (类和结构体非常像&#…...
【实际案例】服务器宕机情况分析及处理建议
了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器: Kunpeng 920 内存: 4 TiB BIOS版…...
Linux系统之ncdu命令的基本使用
Linux系统之ncdu命令的基本使用 一、ncdu命令命令介绍1.1 ncdu简介1.2 ncdu特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表 四、安装ncdu工具4.1 安装ncdu软件4.2 n…...
STM32L051K8U6-HAL-LED闪烁设计
HAL三步法: 1、配置下载线 2、配置晶振 3、配置时钟 注意:中断优先级(这里防止HAL_Delay卡死,详细请看 http://t.csdnimg.cn/NQhQV) 4、 配置灯引脚属性为输出模式。并设置标签为LED 生成代码:编写while里…...
记一次远程API调用失败
记一次远程API调用失败 最近开发忙,项目紧,系统出现一些忽隐忽现的问题,本地也不能复现,当时也无法理解,就先搁置了,现在回想起来,这里还是明智的。 这个bug很神奇 今天,原本好好的…...
【力扣】746.使用最小花费爬楼梯
题目描述 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例…...
06:【stm32】中断一:NVIC的配置
中断 1、中断的简介1.1、什么是中断1.2、为什么需要中断 2、中断的优先级2.1、中断优先级的表示方法 3、NVIC3.1、什么的NVIC3.2、NVIC的内部结构3.3、中断向量表3.4、程序实现①开启中断源②配置NVIC③中断响应函数 1、中断的简介 1.1、什么是中断 正在进行的事务被突发事件打…...
Flutter简介
Flutter是一个由Google开发的开源移动UI框架,它允许开发者使用Dart语言来构建高性能、高保真的iOS和Android应用。Flutter的设计理念是"编写一次,到处运行"(write once, run everywhere),这意味着开发者可以…...
WT2605C蓝牙语音芯片赋能对讲机新体验:无屏操控、音频解码与蓝牙音箱三合一
一、产品概况 对讲机市场是一个技术成熟且具有广泛应用前景的市场。对讲机作为无线通信设备的一种,在许多不同的领域和业务中发挥着重要作用。从技术发展角度来看,对讲机经历了从模拟到数字的转型,以及从简单通信工具向多功能设备的演进。当…...
ctfshow-web入门-sql注入(web191-web195)
目录 1、web191 2、web192 3、web193 4、web194 5、web195 1、web191 过滤了 ascii 使用 ord 代替: import requests import string url "http://a585c278-320a-40e7-841f-109b1e394caa.challenge.ctf.show/api/index.php" out for j in range(1…...
【ARM】v8架构programmer guide(3)_ARMv8的寄存器
目录 4.ARMv8 registers 4.1 AArch64 特殊寄存器 4.1.1 Zero register 4.1.2 Stack pointer (SP) 4.1.3 Program Counter (PC) 4.1.4 Exception Link Register(ELR) 4.1.5 Saved Process Status Register (SPSR) 4.2 Proc…...
SpringIOC整合dbUtil做的增删改查以及转账业务的实现
目录 一、xml方式实现 1.介绍lombok插件 2.功能 3.步骤 3.1 idea安装插件(只做一次) 3.2 添加坐标 3.3 编写注解 4.核心类 4.1 QueryRunner 4.2 query() 查询 4.3 update() 增删改 5.配置文件applicationContext.xml 6.junit测试 6.1使用步骤 6.1.1 坐标 6.1.2…...
【Nacos无压力源码领读】(二) 集成 LoadBanlancer 与 OpenFeign
上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
