调用腾讯云接口需要很多公共参数,这些参数需要自己实现,有两种方法,一个是集成腾讯的SDK,直接引用jar包中的方法,一种是自己实现;
目前采用自己实现的方式,因为腾讯的SDK是一个工具包,东西太多了,并不适合继承到项目中,可能你需要的只是其中的一个class。
集成后直接调用。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.0.8</version><!-- 注:这里只是示例版本号,请到 https://mvnrepository.com/artifact/com.tencentcloudapi/tencentcloud-sdk-java 获取最新版本号 -->
</dependency>
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import com.tencentcloudapi.asr.v20190614.AsrClient;
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionRequest;
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionResponse;
public class SentenceRecognition
{
public static void main(String [] args) throws IOException {
// 采用语音URL方式调用
try{
//重要:、需要替换成用户自己的账号信息
//请参考接口说明中的使用步骤1进行获取。
Credential cred = new Credential("Your SecretId", "Your SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("asr.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
AsrClient client = new AsrClient(cred, "ap-shanghai", clientProfile);
String params = "{\"ProjectId\":0,\"SubServiceType\":2,\"EngSerViceType\":\"16k\",\"SourceType\":0,\"Url\":\"https://ruskin-1256085166.cos.ap-guangzhou.myqcloud.com/test.wav\",\"VoiceFormat\":\"wav\",\"UsrAudioKey\":\"session-123\"}";
SentenceRecognitionRequest req = SentenceRecognitionRequest.fromJsonString(params, SentenceRecognitionRequest.class);
SentenceRecognitionResponse resp = client.SentenceRecognition(req);
System.out.println(SentenceRecognitionRequest.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
自己开发其实只需要几个核心的方法转换。
public class TencentCloudVoiceUtil {
private final static String CHARSET = "UTF-8";
public static String sign(String s, String key, String method) throws Exception {
Mac mac = Mac.getInstance(method);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(CHARSET), mac.getAlgorithm());
mac.init(secretKeySpec);
byte[] hash = mac.doFinal(s.getBytes(CHARSET));
return DatatypeConverter.printBase64Binary(hash);
}
public static String getStringToSign(TreeMap<String, Object> params) {
StringBuilder s2s = new StringBuilder("GETasr.tencentcloudapi.com/?");
// 签名时要求对参数进行字典排序,此处用TreeMap保证顺序
for (String k : params.keySet()) {
s2s.append(k).append("=").append(params.get(k).toString()).append("&");
}
return s2s.toString().substring(0, s2s.length() - 1);
}
public static String getUrl(TreeMap<String, Object> params) throws UnsupportedEncodingException {
StringBuilder url = new StringBuilder("https://asr.tencentcloudapi.com/?");
// 实际请求的url中对参数顺序没有要求
for (String k : params.keySet()) {
// 需要对请求串进行urlencode,由于key都是英文字母,故此处仅对其value进行urlencode
url.append(k).append("=").append(URLEncoder.encode(params.get(k).toString(), CHARSET)).append("&");
}
return url.toString().substring(0, url.length() - 1);
}
public static void main(String[] args) throws Exception {
TreeMap<String, Object> params = new TreeMap<String, Object>(); // TreeMap可以自动排序
// 公共参数
params.put("Nonce", new Random().nextInt(Integer.MAX_VALUE));
params.put("Timestamp", System.currentTimeMillis() / 1000);
params.put("SecretId", "SecretId");
params.put("Action", "SentenceRecognition");
params.put("Version", "2019-06-14");
params.put("Region", "ap-shanghai");
// 业务参数
params.put("ProjectId", 0);
params.put("SubServiceType", 2);
params.put("EngSerViceType", "16k");
params.put("SourceType", 0);
params.put("VoiceFormat", "wav");
params.put("UsrAudioKey", "www111");
params.put("Url", "https://ruskin-1256085166.cos.ap-guangzhou.myqcloud.com/test.wav");
// 公共参数
params.put("Signature", sign(getStringToSign(params), "Key", "HmacSHA1"));
System.out.println(getUrl(params));
String s = HttpUtil.get(getUrl(params));
System.out.println(s);
}
}
加密规则这里腾讯的都是差不多的,很多大厂也都是这么用的。这里参考腾讯支付加密介绍
地址
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置