手把手教你用JAVA实现“声音复刻”功能(复刻你的声音)标贝科技

手把手教你用JAVA实现“声音复刻”功能(复刻你的声音)标贝科技


前言

什么是声音复刻?
使用少量的用户声音,短时间内快速为用户量身打造个人定制音色

一、内容太长不愿意看,直接使用系列

声音复刻分为两步
(1)定制模型
参数要求:
支持音频文件的编码格式及文件名的后缀: wav,pcm
支持音频文件的采样率: 16000Hz
支持音频文件的位深:16bits
支持的语言:中文
音频有效时长:不小于3分钟
音频的音质、音量均对模型效果有直接影响,请保证音频的录音环境相对安静、音频人声音量不能太小。
(2)定制声音合成
参数要求:
支持设置合成音频的格式: pcm,wav,mp3,alaw,ulaw
支持设置合成音频的采样率: 16000Hz
支持设置音量、语速、语调
支持语言: 中文(zh)
支持声音模型类型:普通音质、精品音质
确认无误后,直接执行 2.2获取权限+2.3.6完整代码示例

二、用JAVA调用标贝科技“声音复刻”接口使用流程

2.1.环境准备

java

2.2.获取权限

2.1.1.登录

地址:https://ai.data-baker.com/#/?source=qaz123
(注:填写邀请码hi25d7,每日免费调用量还可以翻倍)
​​​​​​在这里插入图片描述
在这里插入图片描述

点击上方地址登录,支持短信、密码、微信三种登录方式。

在这里插入图片描述
2.1.2.创建应用

登录后,点击创建应用,填写相关信息(未实名认证只能创建一个应用)
(注:实名认证后可获得创建多个应用的权限)
在这里插入图片描述
进入应用,其中包含的技术产品有:语音识别、语音合成、声音复刻、声音转换
页面中功能主要包括:服务用量管理、购买服务量管理、开发者文档、授权管理、套餐管理

在这里插入图片描述
2.1.3.获取token
点击声音复刻—>授权管理—>显示—>获取APISecret—>(获取访问令牌token)
在这里插入图片描述


2.3.代码实现

2.3.1.获取token

/*** 授权:需要在开放平台获取【https://ai.data-baker.com/#/?source=qaz123】*/private static final String clientId = "输入你的clientid";private static final String clientSecret = "输入你的clientsecret";/*** 获取token的地址信息*/public static String tokenUrl = "https://openapi.data-baker.com/oauth/2.0/token?grant_type=client_credentials&client_secret=%s&client_id=%s";public static String getAccessToken() {String accessToken = "";OkHttpClient client = new OkHttpClient();// request 默认是get请求String url = String.format(tokenUrl, clientSecret, clientId);Request request = new Request.Builder().url(url).build();JSONObject jsonObject;try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {// 解析String resultJson = response.body().string();jsonObject = JSON.parseObject(resultJson);accessToken = jsonObject.getString("access_token");}} catch (Exception e) {e.printStackTrace();}return accessToken;}

2.3.2.定制模型–提交复刻任务
参数说明:
access_token:鉴权token
originFiles:音频文件集合
mobile:手机号(用于模型训练之后短信提醒)
notifyUrl:回调url

private static void doSoundReproduction(String accessToken, List<File> originFiles, String mobile, String notifyUrl) {//创建连接OkHttpClient client = new OkHttpClient();//构建requestBody,传入参数MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);for (File file : originFiles) {RequestBody body = RequestBody.create(file, MediaType.parse("multipart/form-data"));String filename = file.getName();requestBody.addFormDataPart("originFiles", filename, body);}requestBody.addFormDataPart("access_token", accessToken);requestBody.addFormDataPart("mobile", mobile);requestBody.addFormDataPart("notifyUrl", notifyUrl);//构造requestRequest request = new Request.Builder().url(soundReproductionUrl).method("POST", requestBody.build()).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {System.out.println("调用成功,返回结果:" + response.body().string());} else {System.out.println("调用失败,返回结果:" + response.body().string());}} catch (Exception e) {e.printStackTrace();}}

2.3.3.定制模型-回调代码

@ApiOperation(value = "测试用回调接口", notes = "该链接由参数notifyUrl设置,如果链接无法访问,将无法接收到回调的push信息。")
@PostMapping("/notify")
public void synthesisNotify(HttpServletRequest request, HttpServletResponse response) {String resXml = "";InputStream inStream;try {inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}// 获取声音复刻api调用notifyUrl的返回信息String result = new String(outSteam.toByteArray(), "utf-8");log.info("dataBaker:声音复刻api返回结果 ----result---- =" + result);// 关闭流outSteam.close();inStream.close();// String转换为json对象,然后业务处理JSONObject jsonObject = JSON.parseObject(result);//该参数表示模型idString modelId = jsonObject == null ? "" : jsonObject.getString("modelId");//该参数表示模型当前状态:可能的值为success/fail, 其中,success=训练成功 fail=训练失败String modelStatus = jsonObject == null ? "" : jsonObject.getString("modelStatus");//该参数表示原因(文案可能会有变动),成功时为空字符串,失败时为失败原因说明String reason = jsonObject == null ? "" : jsonObject.getString("reason");//具体业务处理,例如尝试tts调用等(可先返回结果,然后异步去完成业务逻辑)//todo//根据情况,向结果中赋值:正常情况下,选择下面的resSuccess;如果选择resFail,将会视为推送失败,标贝服务端将重新推送一次相同的内容//     * 返回成功xml//     *///    String resSuccess = "<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>";//    /**//     * 返回失败xml//     *///    String resFail = "<xml><return_code>FAIL</return_code><return_msg>报文为空</return_msg></xml>";resXml = Constant.resSuccess;//记录日志log.info("dataBaker:声音复刻api回调返回模型  {}  的状态为:--->{}", modelId , modelStatus);} catch (Exception e) {log.error("dataBaker:声音复刻api回调异常:", e);} finally {try {// 处理业务完毕BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();} catch (IOException e) {log.error("dataBaker:声音复刻api回调异常:out:", e);}}}

2.3.4.定制声音合成-文本格式转换及地址参数拼接
参数说明:
voiceName:定制模型时返回的model_id
originText:合成文本
audioType:音频格式
speed:语速
volume:音量
filePath:输出文件路径

/*** 请求并获取音频流保存至本地文件:这里filePath为全路径** @param url* @param filePath* @throws IOException*/public static void fetchTtsResponse(String url, String filePath) throws IOException {OkHttpClient client = new OkHttpClient();//request 默认是get请求Request request = new Request.Builder().url(url).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {if (response.body() != null&& response.body().contentType().toString().startsWith("audio")) {//写入文件File targetFile = new File(filePath);Files.write(targetFile.toPath(), response.body().bytes());}}} catch (Exception e) {e.printStackTrace();}}

2.3.5.定制声音合成-调用语音合成接口合成音频

public static void doSynthesis(String accessToken, String voiceName, String originText, Integer audioType, Double speed, Double volume, String filePath) {//在非浏览器上操作,需要把合成文本转化为utf-8格式try {originText = URLEncoder.encode(originText, "utf-8");String synthesisUrl = String.format(ttsUrl, accessToken, audioType, voiceName, speed, volume, originText);fetchTtsResponse(synthesisUrl, filePath);} catch (Exception e) {e.printStackTrace();}}

2.3.6.完整代码事例
定制模型完整代码

package com.databaker.web.tts;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*** 声音复刻RESTFUL API接口调用示例* 附:声音复刻RESTFUL API文档 【https://www.data-baker.com/specs/file/reprint_api_restful】** 注意:仅作为demo示例,失败重试、token过期重新获取、日志打印等优化工作需要开发者自行完成** @author data-baker*/
public class TtsSoundReproductionApiDemo {/*** 授权:需要在开放平台获取【https://ai.data-baker.com/】*/private static final String clientId = "YOUR_CLIENT_ID";private static final String clientSecret = "YOUR_CLIENT_SECRET";/*** 获取token的地址信息*/public static String tokenUrl = "https://openapi.data-baker.com/oauth/2.0/token?grant_type=client_credentials&client_secret=%s&client_id=%s";/*** 声音复刻API地址*/public static String soundReproductionUrl = "https://openapi.data-baker.com/gramophone/v1/submit";/*** 音频列表,需满足一定条件:* 1.格式为pcm或wav* 2.采样率为16000hz,位深为16bit,单声道* 3.有效时长最好不小于3分钟(接口实际是以识别出的字数作为判定标准)*/public static List<File> originFiles = new ArrayList<>();public static void main(String[] args) {String accessToken = getAccessToken();if (StringUtils.isNotEmpty(accessToken)) {doSoundReproduction(accessToken, originFiles, "mobile", "https://openapi.data-baker.com/gramophone/v1/api/notify");}}/*** 提交复刻任务** 开发者需开发一个回调接口,接口地址作为参数notifyUrl,用来接收模型训练的结果,具体写法可参考接口文档【https://www.data-baker.com/specs/file/reprint_api_restful】中的回调部分*/private static void doSoundReproduction(String accessToken, List<File> originFiles, String mobile, String notifyUrl) {//创建连接OkHttpClient client = new OkHttpClient();//构建requestBody,传入参数MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);for (File file : originFiles) {RequestBody body = RequestBody.create(file, MediaType.parse("multipart/form-data"));String filename = file.getName();requestBody.addFormDataPart("originFiles", filename, body);}requestBody.addFormDataPart("access_token", accessToken);requestBody.addFormDataPart("mobile", mobile);requestBody.addFormDataPart("notifyUrl", notifyUrl);//构造requestRequest request = new Request.Builder().url(soundReproductionUrl).method("POST", requestBody.build()).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {System.out.println("调用成功,返回结果:" + response.body().string());} else {System.out.println("调用失败,返回结果:" + response.body().string());}} catch (Exception e) {e.printStackTrace();}}public static String getAccessToken() {String accessToken = "";OkHttpClient client = new OkHttpClient();//request 默认是get请求String url = String.format(tokenUrl, clientSecret, clientId);Request request = new Request.Builder().url(url).build();JSONObject jsonObject;try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {//解析String resultJson = response.body().string();jsonObject = JSON.parseObject(resultJson);accessToken = jsonObject.getString("access_token");}} catch (Exception e) {e.printStackTrace();}return accessToken;}
}

定制声音合成完整代码

package com.databaker.web.tts;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.lang3.StringUtils;import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;/*** 语音合成(个性化音色)RESTFUL API接口调用示例* 附:语音合成(个性化音色)RESTFUL API文档 【https://www.data-baker.com/specs/file/reprint_api_compose】** 注意:仅作为demo示例,失败重试、token过期重新获取、日志打印等优化工作需要开发者自行完成** @author data-baker*/
public class TtsPersonalRestApiDemo {/*** 授权:需要在开放平台获取【https://ai.data-baker.com/】*/private static final String clientId = "YOUR_CLIENT_ID";private static final String clientSecret = "YOUR_CLIENT_SECRET";/*** 获取token的地址信息*/public static String tokenUrl = "https://openapi.data-baker.com/oauth/2.0/token?grant_type=client_credentials&client_secret=%s&client_id=%s";/*** 合成使用的地址信息,rate、language等参数在本demo固定,开发者如需调整,参考https://www.data-baker.com/specs/file/reprint_api_compose*/public static String ttsUrl = "https://openapi.data-baker.com/tts_personal?access_token=%s&domain=1&audiotype=%s&language=zh&voice_name=%s&speed=%s&volume=%s&text=%s";/*** 仅作为demo示例* 失败重试、token过期重新获取、日志打印等优化工作需要开发者自行完成**/public static void main(String[] args) {String accessToken = getAccessToken();if (StringUtils.isNotEmpty(accessToken)) {//此处voiceName应传入已成功完成复刻过程的modelId(示例:YOUR_MODEL_ID = 5c97a06ce40cf69e33d2d05c25d4807f9f657)doSynthesis(accessToken, "YOUR_MODEL_ID", "测试文本", 6, 5.0, 5.0, "/home/tts/test.wav");}}public static void doSynthesis(String accessToken, String voiceName, String originText, Integer audioType, Double speed, Double volume, String filePath) {//在非浏览器上操作,需要把合成文本转化为utf-8格式try {originText = URLEncoder.encode(originText, "utf-8");String synthesisUrl = String.format(ttsUrl, accessToken, audioType, voiceName, speed, volume, originText);fetchTtsResponse(synthesisUrl, filePath);} catch (Exception e) {e.printStackTrace();}}/*** 请求并获取音频流保存至本地文件:这里filePath为全路径** @param url* @param filePath* @throws IOException*/public static void fetchTtsResponse(String url, String filePath) throws IOException {OkHttpClient client = new OkHttpClient();//request 默认是get请求Request request = new Request.Builder().url(url).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {if (response.body() != null&& response.body().contentType().toString().startsWith("audio")) {//写入文件File targetFile = new File(filePath);Files.write(targetFile.toPath(), response.body().bytes());}}} catch (Exception e) {e.printStackTrace();}}public static String getAccessToken() {String accessToken = "";OkHttpClient client = new OkHttpClient();//request 默认是get请求String url = String.format(tokenUrl, clientSecret, clientId);Request request = new Request.Builder().url(url).build();JSONObject jsonObject;try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {//解析String resultJson = response.body().string();jsonObject = JSON.parseObject(resultJson);accessToken = jsonObject.getString("access_token");}} catch (Exception e) {e.printStackTrace();}return accessToken;}
}

地址:https://ai.data-baker.com/#/?source=qaz123
(注:填写邀请码hi25d7,每日免费调用量还可以翻倍)
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/5fc12c005cbf468d849d22abd707d64c.png

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用20分钟语音数据进行语音复刻

最近做了一些tts方面的工作&#xff0c;其中一项就是音色克隆&#xff0c;调研了许多开源项目&#xff0c;经过对比发现百度的开源项目paddlespeech的效果还不错&#xff0c;项目的活跃度也很高&#xff0c;比较适合初学者或者感兴趣的同学入门。 一、语音克隆模型介绍 目前主…

一种不太聪明的电话语音识别方案

现如今ASR(语音识别技术)发展到什么阶段我不清楚&#xff0c;但识别率肯定是达不到100%的&#xff0c;识别率跟你所采用的识别模型&#xff0c;声音样本丰富程度&#xff0c;和语音文件的音质有关。 如果普通话标准&#xff0c;且语音文件质量可以的情况下&#xff0c;主流的几…

Android 集成科大讯飞语音并实现语音识别

前言&#xff1a;此博客内容有&#xff0c;集成讯飞语音sdk&#xff0c;实现了语音唤醒&#xff0c;在线语音识别&#xff0c;离线语音识别&#xff0c;更新本地离线语音词典 集成讯飞语音SDK 注册账号下载SDK 百度搜索科大讯飞&#xff0c;打开网站&#xff0c;没有账号的根…

语音合成 GAN Vocoders 总览

Loss 函数简称与全称的对应关系 Short NameFull Nameadvadversial lossFMFeature MatchingMSDMulti-Scale Discriminatormr-STFTMulti-resolution STFT lossfmr-STFTfull band Multi-resolution STFT losssmr-STFTsub band Multi-resolution STFT lossMelMel-Spectrogram Loss…

Photon01_Photon Voice 实现远程语音聊天功能

不废话&#xff0c;直接上步骤&#xff01; 第一步&#xff1a; 给预制体Player添加三个组件&#xff0c;参数设置如图所示&#xff1a; 第二步&#xff1a; 创建空物体Voice&#xff0c;给空物体添加两个组件&#xff0c;参数设置如图所示&#xff1a; 第三步&#xff1a; …

Android开发基于科大讯飞实现语音识别

简介 通过使用科大讯飞的API开发Android APP实现语音识别 下载相应SDK 访问https://www.xfyun.cn/?jumplogin进行注册&#xff0c;然后创建一个应用并进行相应SDK下载 添加相应的包 打开刚刚下载的SDK&#xff0c;找到libs&#xff0c;将两个jar包复制到Android工程里 …

手语翻译系统系列之使用旭日X3派实时识别播报手语

一、准备工作 硬件部分&#xff1a;旭日X3派&#xff0c;USB免驱摄像头&#xff0c;电源适配器&#xff0c;烧录Ubuntu系统的SD卡&#xff0c;USB扬声器&#xff0c;显示屏&#xff08;或者VNC/SSH远程连接&#xff09; 软件部分&#xff1a;Thonny IDE集成开发环境 首先&…

android 打字 语音,手机聊天神器不用手写打字 说话秒变文字 允许一点家乡口音 老年人爸妈必备语音输入法...

时代在进步&#xff0c;如今智能手机已风靡街头巷尾。不过老年人对于新生事物的接受能力较差&#xff0c;手机上网沟通交流成为他们“可望而不可及”的奢望&#xff0c;以往老年人对手机的使用仅局限于按键通话这么简单&#xff0c;是不太会用微信、QQ等沟通方式打字聊天的&…

AI读心术

近期&#xff0c;德克萨斯大学奥斯汀分校的神经科学家们展开了一场「AI」实验&#xff0c;利用人工智能聊天机器人ChatGPT&#xff0c;将大脑活动转化为文字信息。 参与实验的志愿者&#xff0c;在进行长达20小时的「训练」后&#xff0c;成功被「AI」识别出正在进行的活动。按…

chatgpt赋能python:Python反转句子——让你的程序搞定转化难题

Python反转句子——让你的程序搞定转化难题 Python作为一门优秀的编程语言&#xff0c;拥有强大的数据处理能力&#xff0c;常被用于数据清洗、数据分析、统计计算等领域。本文将介绍Python反转句子的实现方法&#xff0c;并讨论其在实际应用中的运用场景。 什么是Python反转…

chatgpt赋能python:Python提取名词:利用NLP技术进行文本分析的高效方法

Python提取名词&#xff1a;利用NLP技术进行文本分析的高效方法 当我们需要对大量文本数据进行分析时&#xff0c;提取其中的名词信息是一个很有用的技巧。 Python提供了各种工具和库来进行NLP自然语言处理&#xff0c;帮助我们快速地实现文本分析。 本文将讨论如何使用Python…

生成式人工智能时代:研究机构与工业机构的角色之争

来源&#xff1a;Illustration by IconScout Store from IconScout 作者&#xff1a;刘鹏飞 微软创始人比尔盖茨说人生中让他印象深刻的两次技术革命演示&#xff0c;一次是现在操作系统的先驱“图形用户界面”&#xff0c;另一个就是以ChatGPT为代表的生成式人工智能技术。 一…

chatgpt赋能python:Python有什么好玩的项目

Python 有什么好玩的项目 Python 是一种多用途的编程语言&#xff0c;被广泛应用于网站开发、数据分析、机器学习以及科学计算等领域。但是除了这些实用的场景&#xff0c;Python 也有很多有趣的项目。在这篇文章中&#xff0c;我将介绍几个有趣的 Python 项目&#xff0c;带你…

用 AI 生成漂亮小姐姐(一)——Stable Diffusion 小白搭建教程

最近 AIGC、ChatGPT 等话题持续发酵,热门程度不亚于之前的 “元宇宙”。抖音、小红书到处都是机器对话、AI 绘图的视频。我看见别人生成的漂亮小姐姐图片眼馋得不行,终于按捺不住自己的好奇心,也尝试一下搭建。本文只是简单记录一下搭建过程。 △ 别人生成的漂亮小姐姐 我使…

如何用 GPT-4 帮你写游戏(以24点游戏举例)

目录 给我一个24点游戏 游戏规则 GPT给的代码 ​改进 再改进 最近呢掀起了一阵GPT-4的热潮&#xff0c;很多人都想用GPT-4&#xff0c;这里呢我就打一个广告&#xff08;嘿嘿&#xff09;&#xff0c;如果不知道国内如何使用GPT的&#xff0c;可以看看这个博客&#xff1a;G…

发送Email、接收Email

邮件软件称为MUA&#xff1a;Mail User Agent&#xff0c;意思是给用户服务的邮件代理&#xff1b; 邮件服务器则称为MTA&#xff1a;Mail Transfer Agent&#xff0c;意思是邮件中转的代理&#xff1b; 最终到达的邮件服务器称为MDA&#xff1a;Mail Delivery Agent&#xff0…

Android studio通过lame生成把pcm转成MP3的so库以及音频的录制和播放附源码

1.先新建C项目 2. 在cpp目录下创建目录map3lame(名字随便起) &#xff0c;接下来要用到 3.下载lame 地址lame 最新版本是3.100&#xff0c;解压完成后如下图 把libmp3lame目录中的所有.c和.h文件(注意其他类型的文件和目录不需要)都复制到项目中新建的map3lame目录中&#xff…

香港金曲奖分析(1983-2017 by SIRMAN)

以前的金曲奖就是华语音乐的代表&#xff0c;特别是80、90年代&#xff0c;谭张争霸&#xff0c;四大天王等&#xff0c;虽然近来影响力已不如之前&#xff0c;但让我们来看看1983-2017的获奖名单。数据来源于百度百科“十大劲歌金曲颁奖典礼”&#xff0c;由于名单较多&#x…

Android中Pcm文件转换为Mp3

刚完成了一个pcm转成mp3的小工作&#xff0c;记录下自己解决这个问题的过程&#xff0c;以便以后可以参考。pcm转换mp3首选的就是lame这个开源框架&#xff0c;下载地址lame&#xff0c;下载完成后需要ndk编译lame。安卓ndk环境配置可以百度。下面记录下ndk编译lame的过程 首先…

NCM转MP3神奇的网页

由于毕业演出需要&#xff0c;下了QQ音乐上的一首需要会员的歌&#xff0c;发现是NCM格式&#xff0c;没有办法打开&#xff0c;于是在网上找方法&#xff0c;然后就发现了这个好方便的网页&#xff0c;直接线上转格式&#xff01;赶紧记下来&#xff0c;以备下次用&#xff01…