手把手教你用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,每日免费调用量还可以翻倍)

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

  1. 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技

    手把手教你用JAVA调用Websocket实现"声音转换"功能(变声)标贝科技 前言 什么是声音转换? 基于深度学习和迁移学习技术,精准将原说话人的声音转换为目标说话人,同时保留原 ...

  2. 手把手教你用JAVA实现“语音合成”功能(文字转声音)标贝科技

    手把手教你用JAVA实现"语音合成"功能(文字转声音)标贝科技 前言 什么是语音合成? 将文本转换成自然流畅的语音,本篇文章将介绍"实时在线合成"(文本长度不得 ...

  3. 手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技

    手把手教你用JAVA实现"语音识别"功能(声音转文字)标贝科技 前言 什么是语音识别? 将自然语音转换为文本信息,本篇文章将介绍"一句话识别"(对60秒以内的语 ...

  4. 手把手教你用java发送邮件

    手把手教你用java发送邮件 一.学习目的 1.学会用jmail发送邮件 2.学会自动发送邮件需要的一些设置 二.准备内容(以163邮箱示范) 1.个人邮箱 首先登录163个人邮箱,然后在个人页面-设 ...

  5. 培训讲师的自我修养——《手把手教你学Java》

    当前,人才是困扰IT企业发展的第一大问题,企业间竞争的本质就是人才的竞争.然而人才却有"结构性过剩"的问题,就是因为有高深的理论.尖端的技术.耀眼的学位的"人材" ...

  6. 手把手教你搭建java接口自动化测试框架(四):断言、生成测试报告

    手把手教你搭建java接口自动化测试框架(四):断言.生成测试报告 上一集说到post和Get请求,请求后得到的响应(即接口返回值)是我们想要的吗 比如网站上get接口文档说明 : "dat ...

  7. 手把手教大家搭建微信公众号查题功能

    手把手教大家搭建微信公众号查题功能 本平台优点: 多题库查题.独立后台.响应速度快.全网平台可查.功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转) ...

  8. 标贝科技声音克隆技术赋能 定制语音功能让陪伴触手可及

    "常回家看看,回家看看,哪怕帮妈妈刷刷筷子洗洗碗......"这首脍炙人口的老歌道出了多少父母的期盼,又是多少儿女的遗憾.因为生活,因为工作,我们总是很忙,忙得没有时间回家,甚至打 ...

  9. 首发 | 用声音改变生活,标贝科技完成 A 轮 5000 万人民币融资

    AI科技大本营获悉,日前,专注于智能语音交互技术及数据的"标贝科技"完成 A 轮 5000 万元人民币融资,本轮投资由深创投领投,恒生电子跟投. 值得注意的是,本轮的领投方深创投在 ...

最新文章

  1. CSP认证201503-4 网络延时[C++题解]:树的直径
  2. IOCP之accept、AcceptEx、WSAAccept的区别
  3. mongodb查询不带表名_原创 | MongoDB常用指令
  4. 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)
  5. 关于Istio 1.1,你所不知道的细节
  6. ArcGIS API for JavaScript实现分图层显示
  7. 用python画椭圆解释_怎么用python画椭圆?
  8. Android APK 反编译
  9. google浏览器添加抓包插件
  10. muma很可能在陪你玩游戏
  11. 聊城大学计算机专业在全国排名,聊城大学排名
  12. CTF-BeesCMS系统漏洞分析溯源
  13. 【kali】一款黑客们都在使用的操作系统
  14. 计算机七进制乘法,编程达人
  15. performance 优化
  16. 【两周快速入门pr】三、定格动画制作-基础操作成就你的脑洞
  17. 上有尧舜之君,下有尧舜之民
  18. Monthly Expense(二分专题)
  19. 【论文分享】UMVD-FSL:Unseen Malware Variants Detection Using Few-Shot Learning
  20. 解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题

热门文章

  1. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)...
  2. 锐龙cpu能装linux吗,AMD CPU怎么安装?AMD锐龙处理器与主板安装图解教程
  3. 苹果手机电池怎么保养_手机电池损耗检测,电池修复软件
  4. 计算机的运行英文表示,电脑一些英文表示什么格式
  5. Windows平台视频显示问题
  6. 微信小程序中使用画布canvas实现动态心电图绘制
  7. C语言中getch()的用法
  8. 【艾琪出品】-【计算机】《办公自动化基础》-韩伟颖(2002)南开离线作业学习资料
  9. 2020年如何写一个现代的JavaScript库
  10. Stream流的方式遍历map,筛选数据