avatar.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. // CreateClient 使用AK&SK初始化账号Client
  16. // @return Client
  17. // @throws Exception
  18. func CreateClient(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 启动数字人 userId=1234 bizId=xxoo
  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 := CreateClient(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 := CreateClient(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 := CreateClient(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. func _main(args []*string) (_err error) {
  122. client, _err := CreateClient("", "")
  123. if _err != nil {
  124. return _err
  125. }
  126. sendMessageRequest := &avatar20220130.SendMessageRequest{
  127. SessionId: tea.String("your_value"),
  128. TenantId: tea.Int64(1),
  129. Feedback: tea.Bool(false),
  130. }
  131. tryErr := func() (_e error) {
  132. defer func() {
  133. if r := tea.Recover(recover()); r != nil {
  134. _e = r
  135. }
  136. }()
  137. // 复制代码运行请自行打印 API 的返回值
  138. _, _err = client.SendMessageWithOptions(sendMessageRequest, &util.RuntimeOptions{})
  139. if _err != nil {
  140. return _err
  141. }
  142. return nil
  143. }()
  144. if tryErr != nil {
  145. var error = &tea.SDKError{}
  146. if _t, ok := tryErr.(*tea.SDKError); ok {
  147. error = _t
  148. } else {
  149. error.Message = tea.String(tryErr.Error())
  150. }
  151. // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
  152. // 错误 message
  153. fmt.Println(tea.StringValue(error.Message))
  154. // 诊断地址
  155. var data interface{}
  156. d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
  157. d.Decode(&data)
  158. if m, ok := data.(map[string]interface{}); ok {
  159. recommend, _ := m["Recommend"]
  160. fmt.Println(recommend)
  161. }
  162. _, _err = util.AssertAsString(error.Message)
  163. if _err != nil {
  164. return _err
  165. }
  166. }
  167. return _err
  168. }
  169. // GenerateBizID 业务请求id,最大支持 64 位字符
  170. // (注意 可以使用该字段做业务启动数字人的幂等,服务端确保同一个 bizId 多次调用只会开启一路实例)
  171. // 鉴于以上原因这里确保每个用户只启动一个实例
  172. func GenerateBizID(userId uint64) string {
  173. return jwt.HashidsEncode(int(userId))
  174. }
  175. // GetAccessKeyId 获取AccessKeyId
  176. func GetAccessKeyId() string {
  177. return "LTAI5tET2mMQVTcMDftuM8Cp"
  178. }
  179. // GetAccessKeySecret 获取AccessKeySecret
  180. func GetAccessKeySecret() string {
  181. return "AmGsD8VzwEuj8njZpUCUYnK7uUBTJa"
  182. }
  183. // GetAppId 获取AppId
  184. func GetAppId() string {
  185. return "3dt553bl52"
  186. }
  187. // GetTenantId 租户ID
  188. func GetTenantId() int64 {
  189. return int64(27174)
  190. }
  191. //func main() {
  192. // err := _main(tea.StringSlice(os.Args[1:]))
  193. // if err != nil {
  194. // panic(err)
  195. // }
  196. //}