文字转语音播报模块(一):阿里云nls服务使用示例
一、业务场景
最近笔者在业务中涉及到语音告警的模块,需要讲告警内容以文件或流形式返回给前端进行语音播报,具体的分析与处理如下
二、业务分析
首先告警内容提示信息这里做的处理是通过专门字段去存储、编辑,根据拟定好的代码逻辑判断是否触发语音告警操作,比较重要的是考虑用那种api实现文字转语音功能,这里笔者选用的是阿里云的nls语音服务。
三、解决方案
1、pom文件引入
<dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-tts</artifactId><version>2.2.1</version>
</dependency>
2、yml文件配置添加
# nls语音配置
ali:nls:##产品相关信息app-key: access-key-id: access-key-secret: ##语音信息(声音类型、语速)voice: sijiapitch-rate: -68speech-rate: 0
3、实体类构建
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "ali.nls")
public class NlsProperties {private String appKey;private String accessKeyId;private String accessKeySecret;private String url;//发音人private String voice;//语调,范围是-500~500,可选,默认是0private Integer pitchRate;//语速,范围是-500~500,默认是0private Integer speechRate;}
4、config类构建
import com.demo.NlsProperties;
import com.demo.NlsTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;@Configuration
public class NlsAutoConfiguration {@Beanpublic NlsTemplate nlsTemplate(NlsProperties nlsProperties, StringRedisTemplate stringRedisTemplate){return new NlsTemplate(nlsProperties,stringRedisTemplate);}}
5、服务类构建
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.nls.client.AccessToken;
import com.alibaba.nls.client.protocol.OutputFormatEnum;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.demo.NlsProperties;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.io.*;
import java.util.Date;@Slf4j
@RequiredArgsConstructor
public class NlsTemplate {private final NlsProperties nlsProperties;private final StringRedisTemplate stringRedisTemplate;/*** HTTPS POST请求*/public byte[] processPOSTRequest(String text) {/*** 设置HTTPS POST请求:* 1.使用HTTPS协议* 2.语音合成服务域名:nls-gateway-cn-shanghai.aliyuncs.com* 3.语音合成接口请求路径:/stream/v1/tts* 4.设置必须请求参数:appkey、token、text、format、sample_rate* 5.设置可选请求参数:voice、volume、speech_rate、pitch_rate*/String url = "https://nls-gateway-cn-shenzhen.aliyuncs.com/stream/v1/tts";JSONObject taskObject = new JSONObject();taskObject.putOpt("appkey", nlsProperties.getAppKey());taskObject.putOpt("token", this.getToken());taskObject.putOpt("text", text);taskObject.putOpt("format", OutputFormatEnum.MP3.getName());taskObject.putOpt("voice", nlsProperties.getVoice());taskObject.putOpt("sample_rate", SampleRateEnum.SAMPLE_RATE_16K.value);// speech_rate 语速,范围是-500~500,可选,默认是0。taskObject.putOpt("speech_rate", nlsProperties.getSpeechRate());// pitch_rate 语调,范围是-500~500,可选,默认是0。taskObject.putOpt("pitch_rate", nlsProperties.getPitchRate());String bodyContent = JSONUtil.toJsonStr(taskObject);System.out.println("POST Body Content: " + bodyContent);RequestBody reqBody = RequestBody.create(MediaType.parse("application/json"), bodyContent);Request request = new Request.Builder().url(url).header("Content-Type", "application/json").post(reqBody).build();try {OkHttpClient client = new OkHttpClient();Response response = client.newCall(request).execute();String contentType = response.header("Content-Type");byte[] data = null;if ("audio/mpeg".equals(contentType)) {data = response.body().bytes();System.out.println("The POST request succeed!");} else {String errorMessage = response.body().string();System.out.println("The POST request failed: " + errorMessage);}response.close();if (data != null && data.length > 0) {// String filePath = "D:/test.wav"; //音频文件保存路径及文件名
// saveFile(data, filePath); //调用函数将音频保存到本地return data;}} catch (Exception e) {e.printStackTrace();}return null;}/*** token暂存redis中*** */@SneakyThrowsprivate String getToken() {String key = "NLS_TOKEN";Boolean hasKey = stringRedisTemplate.hasKey(key);if (BooleanUtil.isTrue(hasKey)) {return stringRedisTemplate.opsForValue().get(key);}AccessToken token = new AccessToken(nlsProperties.getAccessKeyId(), nlsProperties.getAccessKeySecret());token.apply();String accessToken = token.getToken();stringRedisTemplate.opsForValue().set(key, accessToken);stringRedisTemplate.expireAt(key, new Date(token.getExpireTime() * 1000));return accessToken;}/*** 文件转换与生成** */public static void saveFile(byte[] bytes, String filePath) {try {FileOutputStream fos = new FileOutputStream(new File(filePath));fos.write(bytes);fos.close();} catch (IOException e) {e.printStackTrace();}}}
具体的配置可以参考官方文档 https://help.aliyun.com/product/30413.html?spm=a2c4g.750001.0.0.61184fadyUJTlQ ;
如果服务会频繁使用,可以把获取到阿里云token暂存在redis使用。
四、尾言
以上是语音合成业务的大致实现方案,感谢聆听和指正。后续笔者尝试或有改进的方案也会同步上去。
相关文章:
文字转语音播报模块(一):阿里云nls服务使用示例
一、业务场景 最近笔者在业务中涉及到语音告警的模块,需要讲告警内容以文件或流形式返回给前端进行语音播报,具体的分析与处理如下 二、业务分析 首先告警内容提示信息这里做的处理是通过专门字段去存储、编辑,根据拟定好的代码逻辑判断是…...
Vscode配置C#编程环境(win10)
目录 1、安装好Vscode 2、下载安装.NetCore SDK 3、配置C#环境 3.1 打开Vscode并下载扩展 3.2 Vscode中打开文件夹并配置环境 3.3 调试运行 1、安装好Vscode 2、下载安装.NetCore SDK 官网如下,下载完成后双击打开一路走到底就行.NetCore SDK官网 软件显示安…...
python:xlrd 读取 Excel文件,显示在 tkinterTable 表格中
pip install xlrd xlrd-1.2.0-py2.py3-none-any.whl (103 kB) 摘要: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files pip install tkinterTable tkintertable-1.3.3.tar.gz (58 kB) 摘要: Extendable table class for Tkinter 源代…...
深度学习——深度学习计算一
深度学习——深度学习计算一 文章目录 前言一、层和块1.1. 自定义块1.2. 顺序块1.3. 在前向传播函数中执行代码1.4. 小结 二、参数管理2.1. 参数访问2.1.1. 目标参数2.1.2. 一次性访问所有参数2.1.3. 从嵌套块收集参数 2.2. 参数初始化2.2.1. 内置初始化2.2.2. 自定义初始化 2.…...
yolov5及yolov7实战之剪枝
之前有讲过一次yolov5的剪枝:yolov5实战之模型剪枝_yolov5模型剪枝-CSDN博客 当时基于的是比较老的yolov5版本,剪枝对整个训练代码的改动也比较多。最近发现一个比较好用的剪枝库,可以在不怎么改动原有训练代码的情况下,实现剪枝的…...
力扣第257题 二叉树的所有路径 c++ 树 深度优先搜索 字符串 回溯 二叉树
题目 257. 二叉树的所有路径 简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2-&g…...
保研之旅·终
一.背景 学校: 中211 通信工程专业 成绩: 绩点前3% 英语: CET4:523 CET6:505 竞赛:两个国奖,若干省奖 科研:两项校级大创,无论文产出 二.基本情况 夏令营入营: 哈工大…...
达梦数据库 视图 错误 [22003]: 数据溢出
今天通过DBeaver连接访问达梦数据库的一个视图,报错:错误 [22003]: 数据溢出 经过分析,原因是视图字段的数据类型和原表的数据类型不一致造成的...
【文献阅读】【NMI 2022】LocalTransform :基于广义模板的有机反应性准确预测图神经网络
预测有机反应产物是有机化学的一个基本问题。基于成熟有机化学知识,化学家现在能够设计实验来制造用于不同目的的新分子。但是,它需要经验丰富的专业化学家来准确预测化学反应的结果。为了进一步帮助有机化学家并在数字化学时代实现全自动发现࿰…...
QQ浏览器怎么才能设置默认搜索引擎为百度
问题: 打开QQ浏览器,搜索相关信息时发现总是默认为”搜狗搜索引擎“,想将其转为”百度搜索引擎“ 解决: 1、点击浏览器右侧”菜单“图标,选择”设置“,如下图所示: 2、在”常规设置“中的”搜…...
Go Gin Gorm Casbin权限管理实现 - 3. 实现Gin鉴权中间件
文章目录 0. 背景1. 准备工作2. gin中间件2.1 中间件代码2.2 中间件使用2.3 测试中间件使用结果 3. 添加权限管理API3.1 获取所有用户3.2 获取所有角色组3.3 获取所有角色组的策略3.4 修改角色组策略3.5 删除角色组策略3.6 添加用户到组3.7 从组中删除用户3.8 测试API 4. 最终目…...
js 封装一个异步任务函数
// 异步任务 封装 // 1,定义函数 // 2,使用核心api(queueMicrotask,MutationObserver,setTimeout) function runAsynctask (callback){if(typeof queueMicrotask "function" ){queueMicrotask(callback)}else if( typeof MutationObserver "functio…...
目标检测YOLO实战应用案例100讲-基于无人机航拍图像的目标检测
目录 前言 国内外研究现状 目标检测研究现状 无人机航拍目标检测研究现状...
PyQt5配置踩坑
安装步骤比较简单,这里只说一下我踩的坑,以及希望一些大佬可以给点建议。 一、QtDesigner 这个配置比较简单,直接就能用,我的配置如下图: C:\Users\lenovo\AppData\Roaming\Python\Python311\site-packages\qt5_app…...
内网渗透笔记之内网基础知识
0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…...
vue3+elementPlus:el-select选择器里添加按钮button
vue3elementPlus:el-select选择器里添加按钮button,在el-select的option后面添加button //html <el-select class"selectIcon" value-key"id" v-model"store.state.HeaderfilterText" multiple collapse-tagscollapse-…...
Android 模拟点击
Android 模拟点击 1.通过代码的方式实现 通过模拟MotionEvent的方式实现 //----------------模拟点击--------------------- private void simulateClick(View view, float x, float y) {long downTime SystemClock.uptimeMillis();final MotionEvent downEvent MotionEve…...
css自学框架之选项卡
这一节我们学习切换选项卡,两种切换方式,一种是单击切换选项,一种是鼠标滑动切换,通过参数来控制,切换方法。 一、参数 属性默认值描述tabBar.myth-tab-header span鼠标触发区域tabCon.myth-tab-content主体区域cla…...
Element Plus组件库中的input组件如何点击查看按钮时不可编辑,点击编辑时可编辑使用setup
如果你正在使用 Vue 3 和 Composition API,你可以使用 setup 函数来实现 Element Plus 的 Input 组件在点击查看按钮时不可编辑,点击编辑按钮时可编辑的功能。 以下是一个使用 setup 的示例代码: <template><div><el-input …...
小米、华为、iPhone、OPPO、vivo如何在手机让几张图拼成一张?
现在很多手机自带的相册APP已经有这个拼图功能了。 华为手机的拼图 打开图库,选定需要拼图的几张图片后,点击底部的【创作】,然后选择【拼图】就可以将多张图片按照自己想要的位置,组合在一起。 OPPO手机的拼图 打开相册&#…...
从羊肠小道到智能高速:HTTP1到HTTP3的演进之路
引言 计算机网络就像一张遍布全球的道路系统,服务器是一座座城市、村庄,客户端是穿梭其中的车辆,而HTTP协议,就是规范车辆通行、货物传递的交通规则。从HTTP1到HTTP3的演进,本质上就是这条“网络道路”的升级史——从泥…...
Kazumi WebDAV同步功能详解:实现跨设备番剧数据互通的无缝体验
Kazumi WebDAV同步功能详解:实现跨设备番剧数据互通的无缝体验 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi …...
eNSP安装避坑指南:WinPcap/Wireshark/VirtualBox依赖关系解析
eNSP安装避坑指南:WinPcap/Wireshark/VirtualBox依赖关系解析 当你第一次打开eNSP安装包时,可能会疑惑为什么需要同时安装WinPcap、Wireshark和VirtualBox这三个看似不相关的软件。这就像组装一台精密仪器——少了任何一个螺丝,整台机器都无法…...
Qwen3-TTS作品分享:听AI朗读你的日记、诗歌和故事
Qwen3-TTS作品分享:听AI朗读你的日记、诗歌和故事 1. 为什么你需要一个会"读心"的语音合成工具 想象一下这样的场景:深夜写完日记,点击播放键,听到一个温暖的声音将你的文字娓娓道来;创作完一首诗…...
Qwen3.5-2B轻量化技术解析:模型剪枝+KV Cache优化如何降低70%显存占用
Qwen3.5-2B轻量化技术解析:模型剪枝KV Cache优化如何降低70%显存占用 1. 轻量化模型的核心价值 在AI模型部署领域,大模型的资源消耗一直是阻碍其广泛应用的瓶颈。Qwen3.5-2B作为一款仅20亿参数的多模态基础模型,通过创新的轻量化技术实现了…...
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型 1. 前言:为什么选择本地部署? 在个人电脑上运行大语言模型听起来可能有些遥不可及,但随着模型量化技术的进步,现在即使是消费级显卡也能流畅运行14B参数…...
DLSS Swapper智能工具:游戏性能优化与版本管理完全指南
DLSS Swapper智能工具:游戏性能优化与版本管理完全指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的深度学习超级采样(DLSS)版本管理工具,能够自动扫描…...
YOLOv12模型轻量化实战:应对嵌入式设备资源约束
YOLOv12模型轻量化实战:应对嵌入式设备资源约束 最近几年,目标检测模型在精度上突飞猛进,但随之而来的是模型体积和计算量的急剧膨胀。当你兴冲冲地想把最新的YOLOv12模型部署到Jetson Nano或者树莓派上时,往往会发现现实很骨感&…...
Arduino智能小车避坑指南:从TB6612驱动到HC-05蓝牙,新手最容易搞错的5个硬件连接点
Arduino智能小车避坑实战:5个硬件连接致命细节与示波器级调试方案 刚拿到Arduino套件的新手们,总会在论坛里发出同样的灵魂拷问:"为什么我的小车要么瘫着不动,要么像醉汉一样乱撞?"这个问题背后,…...
推理神器Phi-4-mini-reasoning实测:解方程、逻辑题一键生成答案
推理神器Phi-4-mini-reasoning实测:解方程、逻辑题一键生成答案 1. 模型介绍与核心能力 Phi-4-mini-reasoning是一款专注于逻辑推理和数学计算的轻量级AI模型。与通用聊天模型不同,它被专门设计用于处理需要分步推理的任务,能够将复杂的解题…...
