avatar.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package aliyun
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. avatar20220130 "github.com/alibabacloud-go/avatar-20220130/v2/client"
  7. openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
  8. util "github.com/alibabacloud-go/tea-utils/v2/service"
  9. "github.com/alibabacloud-go/tea/tea"
  10. "github.com/suyuan32/simple-admin-common/utils/uuidx"
  11. "strconv"
  12. "strings"
  13. "wechat-api/internal/utils/jwt"
  14. )
  15. // CreateAvatarClient 使用AK&SK初始化账号Client
  16. // @return Client
  17. // @throws Exception
  18. func CreateAvatarClient(accessKeyId, accessKeySecret string) (_result *avatar20220130.Client, _err error) {
  19. // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
  20. // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html。
  21. config := &openapi.Config{
  22. // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
  23. AccessKeyId: tea.String(accessKeyId),
  24. // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
  25. AccessKeySecret: tea.String(accessKeySecret),
  26. }
  27. // Endpoint 请参考 https://api.aliyun.com/product/avatar
  28. config.Endpoint = tea.String("avatar.cn-zhangjiakou.aliyuncs.com")
  29. _result = &avatar20220130.Client{}
  30. _result, _err = avatar20220130.NewClient(config)
  31. return _result, _err
  32. }
  33. // StartInstance 启动数字人
  34. func StartInstance(userId uint64, jsonData AiTypes) (*avatar20220130.StartInstanceResponseBodyData, error) {
  35. accessKeyId := jsonData.AccessKeyId
  36. accessKeySecret := jsonData.AccessKeySecret
  37. tenantId := jsonData.TenantId
  38. appId := jsonData.AppId
  39. bizId := GenerateBizID(userId)
  40. userIdStr := strconv.Itoa(int(userId))
  41. client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
  42. if _err != nil {
  43. return nil, _err
  44. }
  45. startInstanceRequest := &avatar20220130.StartInstanceRequest{
  46. TenantId: tea.Int64(int64(tenantId)),
  47. App: &avatar20220130.StartInstanceRequestApp{
  48. AppId: tea.String(appId),
  49. },
  50. User: &avatar20220130.StartInstanceRequestUser{
  51. UserId: tea.String(userIdStr),
  52. },
  53. BizId: tea.String(bizId),
  54. }
  55. _result, _err := client.StartInstance(startInstanceRequest)
  56. if _err != nil {
  57. return nil, _err
  58. }
  59. if *_result.Body.Success {
  60. //fmt.Println(_result.Body.Data)
  61. return _result.Body.Data, nil
  62. }
  63. return nil, errors.New(*_result.Body.Message)
  64. }
  65. // SendText 发送消息
  66. func SendText(sessionId, text string, isStream bool, index int32, position string, jsonData AiTypes) (*avatar20220130.SendTextResponseBodyData, error) {
  67. accessKeyId := jsonData.AccessKeyId
  68. accessKeySecret := jsonData.AccessKeySecret
  69. tenantId := jsonData.TenantId
  70. client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
  71. if _err != nil {
  72. return nil, _err
  73. }
  74. unicodeCode := uuidx.NewUUID().String()
  75. sendTextRequest := &avatar20220130.SendTextRequest{
  76. TenantId: tea.Int64(int64(tenantId)),
  77. SessionId: &sessionId,
  78. UniqueCode: &unicodeCode,
  79. Text: &text,
  80. }
  81. if isStream == true {
  82. sendTextRequest.StreamExtension = &avatar20220130.SendTextRequestStreamExtension{
  83. Index: &index,
  84. Position: &position,
  85. IsStream: &isStream,
  86. }
  87. }
  88. _result, _err := client.SendText(sendTextRequest)
  89. if _err != nil {
  90. return nil, _err
  91. }
  92. if *_result.Body.Success {
  93. //fmt.Println(_result.Body.Data)
  94. return _result.Body.Data, nil
  95. }
  96. return nil, errors.New(*_result.Body.Message)
  97. }
  98. // StopInstance 停止数字人
  99. func StopInstance(sessionId string, jsonData AiTypes) (*avatar20220130.StopInstanceResponseBodyData, error) {
  100. accessKeyId := jsonData.AccessKeyId
  101. accessKeySecret := jsonData.AccessKeySecret
  102. tenantId := jsonData.TenantId
  103. client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
  104. if _err != nil {
  105. return nil, _err
  106. }
  107. stopInstanceRequest := &avatar20220130.StopInstanceRequest{
  108. TenantId: tea.Int64(int64(tenantId)),
  109. SessionId: &sessionId,
  110. }
  111. _result, _err := client.StopInstance(stopInstanceRequest)
  112. if _err != nil {
  113. return nil, _err
  114. }
  115. if *_result.Body.Success {
  116. //fmt.Println(_result.Body.Data)
  117. return _result.Body.Data, nil
  118. }
  119. return nil, errors.New(*_result.Body.Message)
  120. }
  121. // QueryRunningInstance 查询运行中的实例列表
  122. func QueryRunningInstance(jsonData AiTypes) (*avatar20220130.QueryRunningInstanceResponseBody, error) {
  123. accessKeyId := jsonData.AccessKeyId
  124. accessKeySecret := jsonData.AccessKeySecret
  125. appId := jsonData.AppId
  126. tenantId := jsonData.TenantId
  127. client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
  128. if _err != nil {
  129. return nil, _err
  130. }
  131. queryRunningInstanceRequest := &avatar20220130.QueryRunningInstanceRequest{
  132. App: &avatar20220130.QueryRunningInstanceRequestApp{
  133. AppId: tea.String(appId),
  134. },
  135. TenantId: tea.Int64(int64(tenantId)),
  136. }
  137. _result, _err := client.QueryRunningInstance(queryRunningInstanceRequest)
  138. if _err != nil {
  139. return nil, _err
  140. }
  141. if *_result.Body.Success {
  142. //fmt.Println(_result.Body.Data)
  143. return _result.Body, nil
  144. }
  145. return nil, errors.New(*_result.Body.Message)
  146. }
  147. func _main(args []*string) (_err error) {
  148. client, _err := CreateAvatarClient("", "")
  149. if _err != nil {
  150. return _err
  151. }
  152. sendMessageRequest := &avatar20220130.SendMessageRequest{
  153. SessionId: tea.String("your_value"),
  154. TenantId: tea.Int64(1),
  155. Feedback: tea.Bool(false),
  156. }
  157. tryErr := func() (_e error) {
  158. defer func() {
  159. if r := tea.Recover(recover()); r != nil {
  160. _e = r
  161. }
  162. }()
  163. // 复制代码运行请自行打印 API 的返回值
  164. _, _err = client.SendMessageWithOptions(sendMessageRequest, &util.RuntimeOptions{})
  165. if _err != nil {
  166. return _err
  167. }
  168. return nil
  169. }()
  170. if tryErr != nil {
  171. var error = &tea.SDKError{}
  172. if _t, ok := tryErr.(*tea.SDKError); ok {
  173. error = _t
  174. } else {
  175. error.Message = tea.String(tryErr.Error())
  176. }
  177. // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
  178. // 错误 message
  179. fmt.Println(tea.StringValue(error.Message))
  180. // 诊断地址
  181. var data interface{}
  182. d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
  183. d.Decode(&data)
  184. if m, ok := data.(map[string]interface{}); ok {
  185. recommend, _ := m["Recommend"]
  186. fmt.Println(recommend)
  187. }
  188. _, _err = util.AssertAsString(error.Message)
  189. if _err != nil {
  190. return _err
  191. }
  192. }
  193. return _err
  194. }
  195. // GenerateBizID 业务请求id,最大支持 64 位字符
  196. // (注意 可以使用该字段做业务启动数字人的幂等,服务端确保同一个 bizId 多次调用只会开启一路实例)
  197. // 鉴于以上原因这里确保每个用户只启动一个实例
  198. func GenerateBizID(userId uint64) string {
  199. return jwt.HashidsEncode(int(userId))
  200. }
  201. // GetAccessKeyId 获取AccessKeyId
  202. func GetAccessKeyId() string {
  203. return "LTAI5tET2mMQVTcMDftuM8Cp"
  204. }
  205. // GetAccessKeySecret 获取AccessKeySecret
  206. func GetAccessKeySecret() string {
  207. return "AmGsD8VzwEuj8njZpUCUYnK7uUBTJa"
  208. }
  209. // GetAppId 获取AppId
  210. func GetAppId() string {
  211. return "3dt553bl52"
  212. }
  213. // GetTenantId 租户ID
  214. func GetTenantId() int64 {
  215. return int64(27174)
  216. }
  217. //func main() {
  218. // err := _main(tea.StringSlice(os.Args[1:]))
  219. // if err != nil {
  220. // panic(err)
  221. // }
  222. //}