SDKTencentAiTimbreServiceImpl.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.backendsys.service.SDKService.SDKTencent;
  2. import cn.hutool.json.JSONUtil;
  3. import com.backendsys.utils.ListUtil;
  4. import com.backendsys.utils.MapUtil;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.core.ParameterizedTypeReference;
  8. import org.springframework.http.HttpHeaders;
  9. import org.springframework.http.HttpMethod;
  10. import org.springframework.http.MediaType;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.web.reactive.function.client.WebClient;
  14. import org.springframework.web.util.UriComponentsBuilder;
  15. import java.net.URI;
  16. import java.util.*;
  17. @Service
  18. public class SDKTencentAiTimbreServiceImpl implements SDKTencentAiTimbreService {
  19. @Autowired
  20. private SDKTencentService sdkTencentService;
  21. @Value("${tencent.ivh.app-key}")
  22. private String appKey;
  23. @Value("${tencent.ivh.access-token}")
  24. private String accessToken;
  25. @Value("${tencent.ivh.empty-app-key}")
  26. private String emptyAppKey;
  27. @Value("${tencent.ivh.empty-access-token}")
  28. private String emptyAccessToken;
  29. /**
  30. * 腾讯-数智人-个人资产管理-分页查询音色列表
  31. * https://cloud.tencent.com/document/product/1240/99703
  32. */
  33. /**
  34. * [内部服务][腾讯-数智人] 获取公共/定制音色 (使用公司账号)
  35. */
  36. @Transactional
  37. public Map<String, Object> initTimbre(Integer pageIndex, Integer pageSize) {
  38. Map<String, Object> payload = new HashMap<>();
  39. payload.put("PageIndex", pageIndex);
  40. payload.put("PageSize", pageSize);
  41. Map<String, Object> resultMap = Collections.singletonMap("Payload", payload);
  42. String bodyData = JSONUtil.toJsonStr(resultMap);
  43. // -- Http Request --------------------------------------------
  44. /**
  45. * 这里使用我自己的空白密钥,因为只有未创建自定义形象的账号,才能返回全部形象
  46. *
  47. * 我真的无语!
  48. * - [分页查询小样本] 是返回 公共 或 自定义
  49. * - [分页查询单色] 是返回 公共 + 自定义 (自定义放在最后面返回)
  50. */
  51. // emptyAppKey, emptyAccessToken
  52. Map<String, Object> signature = sdkTencentService.getSignature(appKey, accessToken); // 获得 Signature 签名
  53. String url = "https://gw.tvs.qq.com/v2/ivh/crmserver/customerassetservice/describetimbre";
  54. URI uriWithParams = UriComponentsBuilder.fromUriString(url)
  55. .queryParam("appkey", signature.get("appkey"))
  56. .queryParam("signature", "{signature}")
  57. .queryParam("timestamp", signature.get("timestamp"))
  58. .build(signature.get("signature"));
  59. // Http 远程调用
  60. Map<String, Object> resp = WebClient.create()
  61. .method(HttpMethod.POST)
  62. .uri(uriWithParams)
  63. .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
  64. .bodyValue(bodyData.toString())
  65. .retrieve().bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {
  66. })
  67. .block();
  68. return resp;
  69. }
  70. /**
  71. * [内部服务] 获得全部形象音色 (循环调用接口,至到获得全部数据)
  72. * - 用于遍历并匹配用户ID与音色标识
  73. * List<Map<String, Object>> virtualmans = getAllVirtualman(pageIndex, pageSize);
  74. */
  75. public List<Map<String, Object>> getTimbreOfDepth(Integer pageIndex, Integer pageSize) {
  76. // 初始化变量
  77. List<Map<String, Object>> timbre_assets = new ArrayList<>();
  78. // 第一次调用 initTimbre 方法,并将当前页的数据追加到 timbre_assets 列表中
  79. Map<String, Object> resp = initTimbre(pageIndex, pageSize);
  80. Integer total = (Integer) MapUtil.get(resp, "Payload.Total");
  81. timbre_assets.addAll((List<Map<String, Object>>) MapUtil.get(resp, "Payload.TimbreAssets"));
  82. // 循环获取所有页的数据
  83. while (total != null && total > 0 && pageIndex * pageSize <= total) {
  84. // 准备下一次查询,页码加1
  85. pageIndex++;
  86. System.out.println("pageIndex: " + pageIndex);
  87. // 再次调用 initTimbre 方法获取下一页的数据,并将当前页的数据追加到 timbre_assets 列表中
  88. resp = initTimbre(pageIndex, pageSize);
  89. total = (Integer) MapUtil.get(resp, "Payload.Total");
  90. timbre_assets.addAll((List<Map<String, Object>>) MapUtil.get(resp, "Payload.TimbreAssets"));
  91. }
  92. return timbre_assets;
  93. }
  94. /**
  95. * [腾讯-数智人] 获得音色详细信息 (通过音色名称)
  96. */
  97. @Transactional
  98. public Map<String, Object> getTimbreObject(String timbre_name) {
  99. // 循环获得数据列表,直到 total 小于 pageSize
  100. List<Map<String, Object>> timbre_assets = getTimbreOfDepth(1, 100);
  101. // 遍历 virtualmans 列表,并将 key 由大驼峰改为下划线命名
  102. timbre_assets = ListUtil.convertToUnderscoreCase(timbre_assets);
  103. // 遍历 匹配 anchor_name
  104. Map<String, Object> result = new LinkedHashMap<>();
  105. for (Map<String, Object> timbre_asset : timbre_assets) {
  106. String asset_timbre_name = (String) timbre_asset.get("timbre_name");
  107. // System.out.println("virtualman_anchor_name: " + asset_timbre_name + ", anchor_name: " + timbre_name);
  108. // System.out.println(timbre_asset);
  109. if (asset_timbre_name.equals(timbre_name)) {
  110. result = timbre_asset;
  111. }
  112. }
  113. return result;
  114. }
  115. }