环境依赖
安装 SDK
<dependency><groupId>com.tencentcloudapi</groupId><!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. --><!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本 --><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.828</version></dependency>
<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-common</artifactId><version>3.1.828</version></dependency><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-soe</artifactId><version>3.1.828</version></dependency><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-sts</artifactId><version>3.1.828</version></dependency>
安装 SDK 示例
在 Build system 中选择 Maven,选择自己安装的 JDK。单击 Create。
右击 pom.xml,选择 Maven下的 Reload project 安装 SDK。
使用 SDK
本地音频文件评测
package soe.v20180724;import java.nio.file.Files;import java.nio.file.Paths;import javax.xml.bind.DatatypeConverter;import java.util.UUID;import com.tencentcloudapi.common.Credential;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.soe.v20180724.SoeClient;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitRequest;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitResponse;public class TransmitOralProcessWithInit {public static void main(String[] args) throws Exception {try {// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取Credential cred = new Credential("SecretId", "SecretKey");// 实例化soe的client对象SoeClient client = new SoeClient(cred, "");// 实例化发音数据传输接口请求对象TransmitOralProcessWithInitRequest req = new TransmitOralProcessWithInitRequest();// 请求参数赋值String sessionId = UUID.randomUUID().toString();// 将文件转换成base64,本地音频文件路径替换apple.mp3String AUDIO_FOR_ONCE = "SOEMUSIC/apple.mp3";byte[] buf = Files.readAllBytes(Paths.get(AUDIO_FOR_ONCE));String base64Str = DatatypeConverter.printBase64Binary(buf);req.setUserVoiceData(base64Str);req.setVoiceEncodeType(1L); // 语音数据类型1:pcmreq.setVoiceFileType(3L); // 语音文件类型req.setSessionId(sessionId); // 唯一标识req.setRefText("apple"); // 文本req.setWorkMode(0L); // 0,流式分片,1一次性评测req.setEvalMode(0L); // 评估模式,0,单词.1,句子,2,段落,3自由说,4单词纠错req.setScoreCoeff(1.0f); // 评估难度req.setServerType(0L); // 服务类型.0英文,1中文req.setIsAsync(0L); // 异步req.setIsQuery(0L); // 轮询req.setTextMode(0L); // 文本格式.0普通文本 1,音素结构req.setIsEnd(1L);req.setSeqId(1L);req.setSentenceInfoEnabled(1L);// 通过client对象调用TransmitOralProcessWithInit方法发起请求TransmitOralProcessWithInitResponse resp = client.TransmitOralProcessWithInit(req);// 输出json格式的字符串回包System.out.println(TransmitOralProcessWithInitResponse.toJsonString(resp));} catch (TencentCloudSDKException e) {System.out.println(e);}}}
评测超时处理
如果本地文件过大,可能会导致评测超时。可以选用如下方案:
1. 流式分片传输:将发音数据进行分片处理,减少每次评测的时间。
2. 异步查询:使用异步功能将发音数据先上传,然后使用查询功能查询结构。
package soe.v20180724;import java.nio.file.Files;import java.nio.file.Paths;import javax.xml.bind.DatatypeConverter;import java.util.UUID;import java.util.Arrays;import com.tencentcloudapi.common.Credential;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.soe.v20180724.SoeClient;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitRequest;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitResponse;public class OralevaluationStream {public static final String sessionId = UUID.randomUUID().toString();public static final String AUDIO_FOR_ONCE = "SOEMUSIC/apple.mp3";public static final int PKG_SIZE = 100 * 1024; // 分片大小public static void main(String[] args) throws Exception {try {// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取Credential cred = new Credential("SecretId", "SecretKey");// 实例化soe的client对象SoeClient client = new SoeClient(cred, "");// 实例化发音数据传输接口请求对象TransmitOralProcessWithInitRequest req = new TransmitOralProcessWithInitRequest();// 请求参数赋值req.setVoiceEncodeType(1L); // 语音数据类型1:pcmreq.setVoiceFileType(3L); // 语音文件类型req.setSessionId(sessionId); // 唯一标识req.setRefText("apple"); // 文本req.setWorkMode(0L); // 0,流式分片,1一次性评测req.setEvalMode(0L); // 评估模式,0,单词.1,句子,2,段落,3自由说,4单词纠错req.setScoreCoeff(1.0f); // 评估难度req.setServerType(0L); // 服务类型.0英文,1中文req.setIsAsync(0L); // 异步req.setIsQuery(0L); // 轮询req.setTextMode(0L); // 文本格式.0普通文本 1,音素结构// 将文件转换成base64,本地音频文件路径替换apple.mp3byte[] data = Files.readAllBytes(Paths.get(AUDIO_FOR_ONCE));int pkgNum = (int) Math.ceil((double) data.length / PKG_SIZE);for (int i = 1; i <= pkgNum; i++) {int lastIndex = i * PKG_SIZE;if (i == pkgNum) {lastIndex = data.length;}byte[] buf = Arrays.copyOfRange(data, (i - 1) * PKG_SIZE, lastIndex);String base64Str = DatatypeConverter.printBase64Binary(buf);req.setUserVoiceData(base64Str);req.setSeqId((long) i);if (i == pkgNum) {req.setIsEnd(1L);} else {req.setIsEnd(0L);}// 通过client对象调用TransmitOralProcessWithInit方法发起请求TransmitOralProcessWithInitResponse resp = client.TransmitOralProcessWithInit(req);// 输出json格式的字符串回包System.out.println(TransmitOralProcessWithInitResponse.toJsonString(resp));}} catch (TencentCloudSDKException e) {System.out.println(e);}}}
package soe.v20180724;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;import java.util.UUID;import javax.xml.bind.DatatypeConverter;import com.tencentcloudapi.common.Credential;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.soe.v20180724.SoeClient;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitRequest;import com.tencentcloudapi.soe.v20180724.models.TransmitOralProcessWithInitResponse;public class OralevaluationAsync {public static void main(String[] args) throws InterruptedException {try {// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取Credential cred = new Credential("SecretId", "SecretKey");// 实例化soe的client对象SoeClient client = new SoeClient(cred, "");// 实例化发音数据传输接口请求对象TransmitOralProcessWithInitRequest req = new TransmitOralProcessWithInitRequest();// 请求参数赋值String sessionId = UUID.randomUUID().toString();// 将文件转换成base64,本地音频文件路径替换apple.mp3String AUDIO_FOR_ONCE = "SOEMUSIC/para.mp3";byte[] buf = Files.readAllBytes(Paths.get(AUDIO_FOR_ONCE));String base64Str = DatatypeConverter.printBase64Binary(buf);req.setUserVoiceData(base64Str);req.setVoiceEncodeType(1L); // 语音数据类型1:pcmreq.setVoiceFileType(3L); // 语音文件类型req.setSessionId(sessionId); // 唯一标识req.setRefText("apple"); // 文本req.setWorkMode(0L); // 0,流式分片,1一次性评测req.setEvalMode(2L); // 评估模式,0,单词.1,句子,2,段落,3自由说,4单词纠错req.setScoreCoeff(1.0f); // 评估难度req.setServerType(0L); // 服务类型.0英文,1中文req.setIsAsync(0L); // 异步req.setIsQuery(0L); // 轮询req.setTextMode(0L); // 文本格式.0普通文本 1,音素结构req.setIsEnd(1L);req.setSeqId(1L);req.setIsAsync(1L);req.setSentenceInfoEnabled(1L);// 轮询for (int i = 0; i < 60; i++) {System.out.println("查询结果:");TransmitOralProcessWithInitResponse res = client.TransmitOralProcessWithInit(req);System.out.println(TransmitOralProcessWithInitResponse.toJsonString(res));if (res.getStatus().equals("Finished") || res.getStatus().equals("Failed")) {System.out.println("exit");break;} else {req.setIsQuery(1L); // 设置为查询标识}Thread.sleep(1000); // 时间间隔}} catch (TencentCloudSDKException | IOException e) {e.printStackTrace();}}}
使用方法说明
1. SessionID:使用 uuid 来作为 SessionID,用于区分不同的音频。
2. base64 转换:读取本地音频文件,转换成 base64 数据进行评测。
3. 流式分片 base64 转换:读取本地音频文件,将音频进行分片,转换成 base64 数据进行评测。
4. 异步轮询:使用 json 反序列化,获取评测结果,判断是否查询到最终结果。
import java.util.UUID;String SessionId = UUID.randomUUID().toString();
import java.nio.file.Files;import java.nio.file.Paths;import javax.xml.bind.DatatypeConverter;byte[] buf = Files.readAllBytes(Paths.get("apple.mp3"));String base64Str = DatatypeConverter.printBase64Binary(buf);
import java.nio.file.Files;import java.nio.file.Paths;import javax.xml.bind.DatatypeConverter;byte[] data = Files.readAllBytes(Paths.get(AUDIO_FOR_ONCE));int pkgNum = (int) Math.ceil((double) data.length / PKG_SIZE);for (int i = 1; i <= pkgNum; i++) {int lastIndex = i * PKG_SIZE;if (i == pkgNum) {lastIndex = data.length;}byte[] buf = Arrays.copyOfRange(data, (i - 1) * PKG_SIZE, lastIndex);String base64Str = DatatypeConverter.printBase64Binary(buf);
for (int i = 0; i < 60; i++) {System.out.println("查询结果:");TransmitOralProcessWithInitResponse res = client.TransmitOralProcessWithInit(req);System.out.println(TransmitOralProcessWithInitResponse.toJsonString(res));if (res.getStatus().equals("Finished") || res.getStatus().equals("Failed")) {System.out.println("exit");break;} else {req.setIsQuery(1L); // 设置为查询标识}Thread.sleep(1000); // 时间间隔}
临时授权凭证
package soe.v20180724;import com.tencentcloudapi.common.Credential;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.sts.v20180813.StsClient;import com.tencentcloudapi.sts.v20180813.models.*;public class GetFederationToken {public static void main(String[] args) {try {// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取Credential cred = new Credential("SecretId", "SecretKey");// 实例化sts的client对象StsClient client = new StsClient(cred, "ap-beijing");// 实例化一个请求对象,每个接口都会对应一个request对象GetFederationTokenRequest req = new GetFederationTokenRequest();// 请求参数赋值// soe:TransmitOralProcessWithInit 最小权限原则req.setName("soe");req.setPolicy("{\\"version\\": \\"2.0\\",\\"statement\\": {\\"effect\\": \\"allow\\", \\"action\\":[\\"soe:TransmitOralProcessWithInit\\"],\\"resource\\": \\"*\\"}}");//通过client对象调用GetFederationToken方法发起请求GetFederationTokenResponse resp = client.GetFederationToken(req);// 输出json格式的字符串回包System.out.println(GetFederationTokenResponse.toJsonString(resp));} catch (TencentCloudSDKException e) {System.out.println(e.toString());}}}