关于百度、微软语音合成的实现案例

news2024/9/20 8:37:29

关键词

自助机产品、排队呼叫功能、网络喇叭、百度语音合成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的音量、语速的取值范围不尽相同,故编写二者标准化方法进行转换:

/// <summary>
/// 输入是微软TTS的值(在0到100之间)
/// </summary>
/// <param name="currentvolume"></param>
/// <returns></returns>
private int GetStandardVolume(int currentVolume) {
    int volume = 0;
    if (currentTTSEngine == CurrentTTSEngine.Baiddu)
        volume = (int)(0.09 * currentVolume); // 将输入映射到0到9之间
    else
        volume = currentVolume;
    return volume;
}
/// <summary>
/// 输入是微软TTS的值(在-10到10之间)
/// </summary>
/// <param name="currentSpeed"></param>
/// <returns></returns>
private int GetStandardSpeed(int currentSpeed) {
    int speed = 0;
    if (currentTTSEngine == CurrentTTSEngine.Baiddu)
        speed = (int)(0.75 * (currentSpeed + 10) + 0.5); //将输入映射到0到15之间
    else
        speed = currentSpeed;

    return speed;
}

至于上面映射的线性关系参数的确定,让AI帮了忙:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智谱AI正式开源CogVideoX:视频生成技术的新里程碑

前沿科技速递&#x1f680; 随着大型模型技术的持续发展&#xff0c;视频生成技术正在逐步走向成熟。智谱AI团队宣布开源其创新的视频生成模型CogVideoX系列&#xff0c;这标志着视频内容创作的一个新里程碑。通过此次开源&#xff0c;智谱AI旨在让每一位开发者、每一家企业都能…

spring+SSM+Mybatis面试题(上)(30道)

目录 1. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?2. Spring IOC 如何理解?3. Spring DI 如何理解?4. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?1.配置作用域需要注解Scope(“Singleton”)2.开启延迟加载&#xff1a;La…

AWS云账号注销还能重新注册吗

注销了AWS云账号后&#xff0c;是否还能重新注册&#xff0c;这是许多用户关心的问题。今天九河云和大家来详细探讨一下这个话题。 重新注册AWS账号的可能性 一旦你注销了AWS账号&#xff0c;意味着你已经彻底删除了该账户及其所有关联的资源和数据。因此&#xff0c;注销的A…

基于ENVI遥感解译的区域生态环境评价分析

原文链接&#xff1a;基于ENVI遥感解译的区域生态环境评价案例分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247611979&idx4&sn9239197610eff7d5ef75a625dcbb5315&chksmfa8277accdf5febaf916e044bf9f0fb23c31ca92ca2a3086ecf435f94a1503fcd59085f…

Mysql 脚本转换为drawio ER 脚本

Navicat 导出数据库脚本 通过代码转换脚本 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** SQL 脚本转换为 drawio ER 脚本*/ pu…

ArkTS和TypeScript区别

一、对象字面量须标注类型 const point {x: 100,y: 100 }console.log(point) 运行之后会输出 { x: 100, y: 100 } 以上TS代码片段展示了没有类型的场景。如果编译器不知道变量point的确切类型&#xff0c;由于对象布局不能确定&#xff0c;编译器无法深度地优化这段代码&am…

gradle全局配置

搭建spring boot3.x开发环境的先决条件&#xff0c;咱们已经完成了JDK17安装与配置&#xff0c;然后就是项目构建工具&#xff0c;我们使用现在很流行的gradle&#xff0c;进行下全局配置&#xff0c;以方便和加速后续spring boot项目构建。 配置一个GRADLE_USER_HOME环境变量&…

【密码学】密码协议的安全性

密码协议是用来在不安全的网络环境中建立安全通信通道的方法。虽然密码协议中仅有很少的几组消息传输&#xff0c;但其中每条消息的组成都是经过巧妙的设计&#xff0c;而这些协议之间有着复杂的相互作用和制约。 若如果协议涉及上出现漏洞&#xff0c;那么协议将存在验证的安全…

【JAVA多线程】AQS,JAVA并发包的核心

目录 1.概述 1.1.什么是AQS 1.2.AQS和BlockQueue的区别 1.3.AQS的结构 2.源码分析 2.1.CLH队列 2.2.模板方法的实现 2.2.1.独占模式 1.获取资源 2.释放资源 2.2.2.共享模式 1.概述 1.1.什么是AQS AQS非常非常重要&#xff0c;可以说是JAVA并发包&#xff08;java.…

MES是什么?MES系统主要包括哪些功能?

一、MES系统是什么&#xff1f; MES是&#xff08;Manufacturing Execution System&#xff09;的缩写&#xff0c;中文名称叫做制造企业生产过程执行管理系统&#xff0c;是一套整体的面向制造企业车间执行层生产信息化管理的解决方案。MES系统经历了若干个发展阶段&#xff…

PHP简单零售收银台系统源码小程序

&#x1f6d2;轻松上手&#xff01;简单零售收银台系统&#xff0c;让经营更省心&#x1f4b8; &#x1f680; 开篇&#xff1a;告别繁琐&#xff0c;拥抱高效收银新时代 嘿&#xff0c;小店主们&#xff01;&#x1f44b; 还在为每天繁琐的收银工作头疼吗&#xff1f;是时候…

探索腾讯云AI代码助手:智能编程的新时代

智能编程的新时代 前言开发环境介绍腾讯云 AI 代码助手使用实例生成文档解释代码生成测试修复代码人工智能技术对话 智能编程获得的帮助与提升对腾讯云AI代码助手的建议结语 前言 hello&#xff0c;大家好我是恒川&#xff0c;今天我来给大家安利一款非常好用的AI 代码助手&…

JVM(面试用)

目录 一、JVM运行时数据区 二、JVM类加载 类加载过程 1、加载&#xff08;loading&#xff09; 2、验证&#xff08;Verification&#xff09; 3、准备&#xff08;Perparation&#xff09; 4、解析&#xff08;Resolution&#xff09; 5、初始化&#xff08;Initializ…

Linux 驱动开发究竟在开发什么?

文章目录 1 Linux 驱动开发架构图2 更具体的例子&#xff1a;LED 驱动程序2.1 硬件层&#xff08;Hardware Layer&#xff09;2.2 固件层&#xff08;Firmware Layer&#xff09;2.3 驱动程序层&#xff08;Driver Layer&#xff09;2.4 操作系统内核&#xff08;Kernel Layer&…

【全国大学生电子设计竞赛】2021年A题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~

2024年睿抗机器人开发者大赛(RAICOM)国赛题解

目录 RC-u1 大家一起查作弊 分数 15 RC-u2 谁进线下了&#xff1f;II 分数 20 RC-u3 势均力敌 分数 25 RC-u4 City 不 City 分数 30 RC-u5 贪心消消乐 分数 30 RC-u1 大家一起查作弊 分数 15 简单模拟题&#xff0c;对于多行读入使用while(getline(cin…

切割 Nginx 日志

目录 方式一&#xff1a;自定义脚本 方式二&#xff1a;logrotate crontab 讲解 centos 容器安装 crontab centos 容器 systemctl 命令执行异常 切割理由&#xff1a;假设一个网站访问量特别大&#xff0c;每天 access_log 文件有 2 个 G&#xff0c;如果想从文件中查找…

基于QCustomPlot实现色条(ColorBar)

一、简介 通过QCustomPlot实现ColorBar&#xff0c;直观显示各个位置的异常情况。实现效果如下&#xff0c; 二、源码 CPColorBar.hpp // CPColorBar.hpp #pragma once #include "qcustomplot.h"#include <QHash>class QCP_LIB_DECL CPColorBarData { pub…

使用 MRI 构建的大脑连接网络预测帕金森病萎缩进展模式| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Brain Connectivity Networks Constructed Using MRI for Predicting Patterns of Atrophy Progression in Parkinson Disease 使用 MRI 构建的大脑连接网络预测帕金森病萎缩进展模式 Background 背景 Whether connectome mapping of structural and across …

全志T527-TP9930-Camera

一、简介 1、TP9930 TP9930 驱动模块主要实现将 4 路的 Camera 的数据转换为 BT656/BT1120 数据&#xff0c;从而实现在 T527 端来对数据进行处理和送显。 2、BT656/BT1120简介 BT656主要是针对PAL/NTSC等标清视频。随着高清视频的发展需要&#xff0c;又推出了BT1120标准&…