├── .gitignore ├── LICENSE ├── README.md ├── aai_asr.go ├── aai_detectkeyword.go ├── aai_evilaudio.go ├── aai_tt.go ├── aai_wxasrlong.go ├── data ├── format.py ├── nlp_wordcom_com_type.csv ├── nlp_wordcom_intent.csv ├── nlp_wordner.csv ├── nlp_wordpos.csv ├── vision_objectr.csv └── vision_scener.csv ├── demo ├── aai │ ├── aai_asr │ │ └── main.go │ ├── aai_detectkeyword │ │ └── main.go │ ├── aai_evilaudio │ │ └── main.go │ ├── aai_tt │ │ └── main.go │ └── aai_wxasrlong │ │ └── main.go ├── face │ ├── face_addface │ │ └── main.go │ ├── face_delface │ │ └── main.go │ ├── face_delperson │ │ └── main.go │ ├── face_detectcrossageface │ │ └── main.go │ ├── face_detectface │ │ └── main.go │ ├── face_detectmultiface │ │ └── main.go │ ├── face_facecompare │ │ └── main.go │ ├── face_faceidentify │ │ └── main.go │ ├── face_faceshape │ │ └── main.go │ ├── face_faceverify │ │ └── main.go │ ├── face_getfaceids │ │ └── main.go │ ├── face_getfaceinfo │ │ └── main.go │ ├── face_getgroupids │ │ └── main.go │ ├── face_getinfo │ │ └── main.go │ ├── face_getpersonids │ │ └── main.go │ ├── face_newperson │ │ └── main.go │ └── face_setinfo │ │ └── main.go ├── image │ ├── image_food │ │ └── main.go │ ├── image_fuzzy │ │ └── main.go │ ├── image_tag │ │ └── main.go │ └── image_terrorism │ │ └── main.go ├── img_url.go ├── nlp │ ├── base_word │ │ └── main.go │ ├── nlp_imagetranslate │ │ └── main.go │ ├── nlp_speechtranslate │ │ └── main.go │ ├── nlp_textchat │ │ └── main.go │ ├── nlp_textdetect │ │ └── main.go │ ├── nlp_textpolar │ │ └── main.go │ ├── nlp_texttrans │ │ └── main.go │ ├── nlp_texttranslate │ │ └── main.go │ └── nlp_wordcom │ │ └── main.go ├── ocr │ ├── ocr_bcocr │ │ └── main.go │ ├── ocr_bizlicenseocr │ │ └── main.go │ ├── ocr_creditcardocr │ │ └── main.go │ ├── ocr_driverlicenseocr │ │ └── main.go │ ├── ocr_generalocr │ │ └── main.go │ ├── ocr_handwritingocr │ │ └── main.go │ ├── ocr_idcardocr │ │ └── main.go │ └── ocr_plateocr │ │ └── main.go ├── ptu │ ├── ptu_faceage │ │ ├── abc.jpg │ │ └── main.go │ ├── ptu_facecosmetic │ │ ├── abc.jpg │ │ └── main.go │ ├── ptu_facedecoration │ │ └── main.go │ ├── ptu_facemerge │ │ └── main.go │ ├── ptu_facesticker │ │ └── main.go │ └── ptu_imgfilter │ │ └── main.go └── vision │ ├── vision_imgfilter │ └── main.go │ ├── vision_imgtotext │ └── main.go │ ├── vision_objectr │ └── main.go │ ├── vision_porn │ └── main.go │ └── vision_scener │ └── main.go ├── errors.go ├── face_addface.go ├── face_delface.go ├── face_delperson.go ├── face_detectcrossageface.go ├── face_detectface.go ├── face_detectmultiface.go ├── face_facecompare.go ├── face_faceidentify.go ├── face_faceshape.go ├── face_faceverify.go ├── face_getfaceids.go ├── face_getfaceinfo.go ├── face_getgroupids.go ├── face_getinfo.go ├── face_getpersonids.go ├── face_newperson.go ├── face_setinfo.go ├── image_food.go ├── image_fuzzy.go ├── image_tag.go ├── image_terrorism.go ├── model.go ├── nlp_imagetranslate.go ├── nlp_speechtranslate.go ├── nlp_textchat.go ├── nlp_textdetect.go ├── nlp_textpolar.go ├── nlp_texttrans.go ├── nlp_texttranslate.go ├── nlp_wordcom.go ├── nlp_wordcom_data.go ├── nlp_wordner_names.go ├── nlp_wordpos_names.go ├── nlp_wordseg.go ├── ocr_bcocr.go ├── ocr_bizlicenseocr.go ├── ocr_creditcardocr.go ├── ocr_driverlicenseocr.go ├── ocr_generalocr.go ├── ocr_handwritingocr.go ├── ocr_idcardocr.go ├── ocr_plateocr.go ├── ptu_faceage.go ├── ptu_facecosmetic.go ├── ptu_facedecoration.go ├── ptu_facemerge.go ├── ptu_facesticker.go ├── ptu_imgfilter.go ├── request.go ├── txai.go ├── vision_imgfilter.go ├── vision_imgtotext.go ├── vision_objectr.go ├── vision_objectr_names.go ├── vision_porn.go ├── vision_scener.go └── vision_scener_names.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.dll 4 | *.so 5 | *.dylib 6 | 7 | # Test binary, build with `go test -c` 8 | *.test 9 | 10 | # Output of the go coverage tool, specifically when used with LiteIDE 11 | *.out 12 | 13 | # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 14 | .glide/ 15 | demo/ocr_bcocr/ocr_bcocr 16 | demo/image_terrorism/image_terrorism 17 | demo/ocr_bizlicenseocr/ocr_bizlicenseocr 18 | demo/ocr_bizlicenseocr/ocr_bizlicenseocr 19 | demo/ocr_creditcardocr/ocr_creditcardocr 20 | demo/ocr_driverlicenseocr/ocr_driverlicenseocr 21 | demo/ocr_generalocr/ocr_generalocr 22 | demo/ocr_idcardocr/ocr_idcardocr 23 | demo/vision_porn/vision_porn 24 | demo/img/* 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 时光弧线 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 腾讯AI SDK 2 | 腾讯AI开发平台sdk 3 | 4 | 腾讯AI接口调用比较简单,可以通过此库简化调用流程,返回值是结构体方便使用。 5 | 开发者可以不去考虑签名、数据请求就像调本地函数一样调用接口 6 | 7 | ## 示例 8 | ``` 9 | package main 10 | 11 | import ( 12 | "encoding/json" 13 | "log" 14 | 15 | "github.com/shiguanghuxian/txai" // 引入sdk 16 | ) 17 | 18 | func main() { 19 | // 系统日志显示文件和行号 20 | log.SetFlags(log.Lshortfile | log.LstdFlags) 21 | // 创建sdk操作对象 22 | txAi := txai.New("appid", "appkey", true) 23 | // 调用对应腾讯ai接口的对应函数 24 | val, err := txAi.ImageFoodForPath("../../img/image_terrorism.jpg") 25 | // 打印结果 26 | log.Println(err) 27 | js, _ := json.Marshal(val) 28 | log.Println(string(js)) 29 | } 30 | 31 | ``` 32 | 33 | 34 | ## 备注 35 | 由于腾讯AI部分接口使用gbk格式,本sdk已自动将格式转换,使用时无需考虑编码问题。 36 | -------------------------------------------------------------------------------- /aai_asr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 语音识别 4 | 5 | import ( 6 | "encoding/base64" 7 | "fmt" 8 | "io/ioutil" 9 | ) 10 | 11 | var ( 12 | aaiAsrURI = "/aai/aai_asr" 13 | aaiAsrsURI = "/aai/aai_asrs" 14 | aaiWxasrsURI = "/aai/aai_wxasrs" 15 | ) 16 | 17 | // AaiAudioType 语言识别 语音压缩格式编码 18 | type AaiAudioType = int 19 | 20 | const ( 21 | AaiAudioPCM AaiAudioType = 1 22 | AaiAudioWAV AaiAudioType = 2 23 | AaiAudioAMR AaiAudioType = 3 24 | AaiAudioSILK AaiAudioType = 4 25 | AaiAudioSPEEX AaiAudioType = 5 26 | AaiAudioMP3 AaiAudioType = 8 27 | ) 28 | 29 | // AaiAsrForBase64 语音识别-echo版 - 音频为base64格式 30 | // speech 待识别语音(时长上限15s) 31 | // format 语音压缩格式编码,定义见下文描述 32 | // rate 语音采样率编码,定义见下文描述,(不传)默认即16KHz 33 | func (ai *TxAi) AaiAsrForBase64(speech string, format AaiAudioType, rate ...int) (*AaiAsrResponse, error) { 34 | params := ai.getPublicParams() 35 | params.Add("speech", speech) 36 | params.Add("format", fmt.Sprint(format)) 37 | if len(rate) > 0 { 38 | params.Add("rate", fmt.Sprint(rate[0])) 39 | } else { 40 | params.Add("rate", "16000") 41 | } 42 | sign := ai.getReqSign(params) 43 | params.Add("sign", sign) 44 | 45 | // 响应结果 46 | aaiAsrResponse := new(AaiAsrResponse) 47 | err := ai.RequestAPI(aaiAsrURI, params, aaiAsrResponse) 48 | if err != nil { 49 | return nil, err 50 | } 51 | return aaiAsrResponse, nil 52 | } 53 | 54 | // AaiAsrForPath 语音识别-echo版 - 音频为本地路径 55 | // imagePath 本地图片路径 56 | // speech 本地语音路径(时长上限15s) 57 | // format 语音压缩格式编码,定义见下文描述 58 | // rate 语音采样率编码,定义见下文描述,(不传)默认即16KHz 59 | func (ai *TxAi) AaiAsrForPath(speechPath string, format AaiAudioType, rate ...int) (*AaiAsrResponse, error) { 60 | body, err := ioutil.ReadFile(speechPath) 61 | if err != nil { 62 | return nil, err 63 | } 64 | speech := base64.StdEncoding.EncodeToString(body) 65 | return ai.AaiAsrForBase64(speech, format, rate...) 66 | } 67 | 68 | // AaiAsrsForBase64 语音识别-流式版(AI Lab) - 音频为base64格式 69 | // speechChunk 待识别语音分片 70 | // format 音频压缩格式编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 71 | // seq 语音分片所在语音流的偏移量(字节) 72 | // length 语音分片长度(字节) 73 | // end 是否结束分片标识,定义见 https://ai.qq.com/doc/aaiasr.shtml 74 | // speechId 语音唯一标识 75 | // rate 音频采样率编码,定义见下文描述 76 | func (ai *TxAi) AaiAsrsForBase64(speechChunk string, format AaiAudioType, seq, length, end int, speechId string, rate ...int) (*AaiAsrsResponse, error) { 77 | params := ai.getPublicParams() 78 | params.Add("speech_chunk", speechChunk) 79 | params.Add("format", fmt.Sprint(format)) 80 | params.Add("len", fmt.Sprint(length)) 81 | params.Add("end", fmt.Sprint(end)) 82 | params.Add("speech_id", speechId) 83 | params.Add("seq", fmt.Sprint(seq)) 84 | if len(rate) > 0 { 85 | params.Add("rate", fmt.Sprint(rate[0])) 86 | } else { 87 | params.Add("rate", "16000") 88 | } 89 | sign := ai.getReqSign(params) 90 | params.Add("sign", sign) 91 | 92 | // 响应结果 93 | aaiAsrsResponse := new(AaiAsrsResponse) 94 | err := ai.RequestAPI(aaiAsrsURI, params, aaiAsrsResponse) 95 | if err != nil { 96 | return nil, err 97 | } 98 | return aaiAsrsResponse, nil 99 | } 100 | 101 | // AaiAsrsForPath 语音识别-流式版(AI Lab) - 音频为本地路径 102 | // speechChunkPath 本地待识别语音分片路径 103 | // format 音频压缩格式编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 104 | // seq 语音分片所在语音流的偏移量(字节) 105 | // end 是否结束分片标识,定义见 https://ai.qq.com/doc/aaiasr.shtml 106 | // speechId 语音唯一标识 107 | // rate 音频采样率编码,定义见下文描述 108 | func (ai *TxAi) AaiAsrsForPath(speechChunkPath string, format AaiAudioType, seq, end int, speechId string, rate ...int) (*AaiAsrsResponse, error) { 109 | body, err := ioutil.ReadFile(speechChunkPath) 110 | if err != nil { 111 | return nil, err 112 | } 113 | length := len(body) 114 | speechChunk := base64.StdEncoding.EncodeToString(body) 115 | return ai.AaiAsrsForBase64(speechChunk, format, seq, length, end, speechId, rate...) 116 | } 117 | 118 | // AaiWxasrsForBase64 语音识别-流式版(AI Lab) - 音频为base64格式 119 | // speechChunk 待识别语音分片 120 | // format 音频压缩格式编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 121 | // rate 音频采样率编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 122 | // bits 音频采样位数,定义见 https://ai.qq.com/doc/aaiasr.shtml 123 | // seq 语音分片所在语音流的偏移量(字节) 124 | // length 语音分片长度(字节) 125 | // end 是否结束分片标识,定义见下文描述 126 | // speechId 语音唯一标识 127 | // contRes 是否获取中间识别结果,定义见 https://ai.qq.com/doc/aaiasr.shtml 128 | func (ai *TxAi) AaiWxasrsForBase64(speechChunk string, format AaiAudioType, rate, bits, seq, length, end int, speechId string, contRes int) (*AaiWxasrsResponse, error) { 129 | params := ai.getPublicParams() 130 | params.Add("speech_chunk", speechChunk) 131 | params.Add("format", fmt.Sprint(format)) 132 | params.Add("rate", fmt.Sprint(rate)) 133 | params.Add("bits", fmt.Sprint(bits)) 134 | params.Add("seq", fmt.Sprint(seq)) 135 | params.Add("len", fmt.Sprint(length)) 136 | params.Add("end", fmt.Sprint(end)) 137 | params.Add("cont_res", fmt.Sprint(contRes)) 138 | params.Add("speech_id", speechId) 139 | sign := ai.getReqSign(params) 140 | params.Add("sign", sign) 141 | 142 | // 响应结果 143 | aaiWxasrsResponse := new(AaiWxasrsResponse) 144 | err := ai.RequestAPI(aaiWxasrsURI, params, aaiWxasrsResponse) 145 | if err != nil { 146 | return nil, err 147 | } 148 | return aaiWxasrsResponse, nil 149 | } 150 | 151 | // AaiWxasrsForPath 语音识别-流式版(AI Lab) - 音频为本地路径 152 | // speechChunkPath 本地待识别语音分片路径 153 | // format 音频压缩格式编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 154 | // rate 音频采样率编码,定义见 https://ai.qq.com/doc/aaiasr.shtml 155 | // bits 音频采样位数,定义见 https://ai.qq.com/doc/aaiasr.shtml 156 | // seq 语音分片所在语音流的偏移量(字节) 157 | // end 是否结束分片标识,定义见下文描述 158 | // speechId 语音唯一标识 159 | // contRes 是否获取中间识别结果,定义见 https://ai.qq.com/doc/aaiasr.shtml 160 | func (ai *TxAi) AaiWxasrsForPath(speechChunkPath string, format AaiAudioType, rate, bits, seq, end int, speechId string, contRes int) (*AaiWxasrsResponse, error) { 161 | body, err := ioutil.ReadFile(speechChunkPath) 162 | if err != nil { 163 | return nil, err 164 | } 165 | length := len(body) 166 | speechChunk := base64.StdEncoding.EncodeToString(body) 167 | return ai.AaiWxasrsForBase64(speechChunk, format, rate, bits, seq, length, end, speechId, contRes) 168 | } 169 | -------------------------------------------------------------------------------- /aai_detectkeyword.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 语音识别 4 | 5 | import ( 6 | "encoding/base64" 7 | "encoding/json" 8 | "fmt" 9 | "io/ioutil" 10 | "strings" 11 | ) 12 | 13 | var ( 14 | aaiDetectkeywordURI = "/aai/aai_detectkeyword" 15 | ) 16 | 17 | // AaiDetectkeywordForBase64 关键词检索 - 音频为base64格式 18 | // speech 待识别语音(时长上限15s) 19 | // format 语音压缩格式编码,定义见 https://ai.qq.com/doc/detectword.shtml 20 | // callbackURL 用户回调url,需用户提供,用于平台向用户通知识别结果 21 | // keyWords 待识别关键词 22 | // speechURL 待识别语音下载地址(时长上限15min) 23 | func (ai *TxAi) AaiDetectkeywordForBase64(speech, speechURL string, format AaiAudioType, callbackURL string, keyWords ...string) (*AaiDetectkeywordResponse, error) { 24 | params := ai.getPublicParams() 25 | if speech != "" { 26 | params.Add("speech", speech) 27 | } 28 | if speechURL != "" { 29 | params.Add("speech_url", speechURL) 30 | } 31 | params.Add("format", fmt.Sprint(format)) 32 | params.Add("callback_url", callbackURL) 33 | params.Add("key_words", strings.Join(keyWords, "|")) 34 | sign := ai.getReqSign(params) 35 | params.Add("sign", sign) 36 | 37 | // 响应结果 38 | aaiDetectkeywordResponse := new(AaiDetectkeywordResponse) 39 | err := ai.RequestAPI(aaiDetectkeywordURI, params, aaiDetectkeywordResponse) 40 | if err != nil { 41 | return nil, err 42 | } 43 | return aaiDetectkeywordResponse, nil 44 | } 45 | 46 | // AaiDetectkeywordForPath 关键词检索 - 音频为本地路径 47 | // speechPath 本地待识别语音路径(时长上限15s) 48 | // format 语音压缩格式编码,定义见 https://ai.qq.com/doc/detectword.shtml 49 | // callbackURL 用户回调url,需用户提供,用于平台向用户通知识别结果 50 | // keyWords 待识别关键词 51 | // speechURL 待识别语音下载地址(时长上限15min) 52 | func (ai *TxAi) AaiDetectkeywordForPath(speechPath, speechURL string, format AaiAudioType, callbackURL string, keyWords ...string) (*AaiDetectkeywordResponse, error) { 53 | body, err := ioutil.ReadFile(speechPath) 54 | if err != nil { 55 | return nil, err 56 | } 57 | speech := base64.StdEncoding.EncodeToString(body) 58 | return ai.AaiDetectkeywordForBase64(speech, speechURL, format, callbackURL, keyWords...) 59 | } 60 | 61 | // AaiDetectkeywordHandleCallback 处理回调数据 62 | func AaiDetectkeywordHandleCallback(body []byte) (*AaiDetectkeywordResponse, *BaseResponse, error) { 63 | aaiDetectkeywordResponse := new(AaiDetectkeywordResponse) 64 | baseResponse := &BaseResponse{ 65 | Ret: 0, 66 | Msg: "ok", 67 | } 68 | // 解析json数据 69 | err := json.Unmarshal(body, aaiDetectkeywordResponse) 70 | if err != nil { 71 | return nil, baseResponse, err 72 | } 73 | ret := aaiDetectkeywordResponse.GetRet() 74 | if ret != 0 { 75 | return nil, baseResponse, GetError(ret) 76 | } 77 | return aaiDetectkeywordResponse, baseResponse, nil 78 | } 79 | -------------------------------------------------------------------------------- /aai_evilaudio.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 音频鉴黄 4 | 5 | var ( 6 | aaiEvilaudioURI = "/aai/aai_evilaudio" 7 | ) 8 | 9 | // AaiEvilaudioForUrl 音频鉴黄 10 | func (ai *TxAi) AaiEvilaudioForUrl(speechId, speechURL string, pornDetect, keywordDetect bool) (*AaiEvilaudioResponse, error) { 11 | params := ai.getPublicParams() 12 | params.Add("speech_id", speechId) 13 | params.Add("speech_url", speechURL) 14 | if pornDetect == true { 15 | params.Add("porn_detect", "1") 16 | } else { 17 | params.Add("porn_detect", "0") 18 | } 19 | if keywordDetect == true { 20 | params.Add("keyword_detect", "1") 21 | } else { 22 | params.Add("keyword_detect", "0") 23 | } 24 | sign := ai.getReqSign(params) 25 | params.Add("sign", sign) 26 | 27 | // 响应结果 28 | aaiEvilaudioResponse := new(AaiEvilaudioResponse) 29 | err := ai.RequestAPI(aaiEvilaudioURI, params, aaiEvilaudioResponse) 30 | if err != nil { 31 | return nil, err 32 | } 33 | return aaiEvilaudioResponse, nil 34 | } 35 | -------------------------------------------------------------------------------- /aai_tt.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "fmt" 4 | 5 | var ( 6 | aaiTtsURI = "/aai/aai_tts" 7 | aaiTtaURI = "/aai/aai_tta" 8 | ) 9 | 10 | // AaiTtsSpeakerType 语音合成(AI Lab) 语音发音人编码 11 | type AaiTtsSpeakerType = int 12 | 13 | const ( 14 | // AaiTtsSpeaker1 普通话男声 15 | AaiTtsSpeaker1 AaiTtsSpeakerType = 1 16 | // AaiTtsSpeaker5 静琪女声 17 | AaiTtsSpeaker5 AaiTtsSpeakerType = 5 18 | // AaiTtsSpeaker6 欢馨女声 19 | AaiTtsSpeaker6 AaiTtsSpeakerType = 6 20 | // AaiTtsSpeaker7 碧萱女声 21 | AaiTtsSpeaker7 AaiTtsSpeakerType = 7 22 | ) 23 | 24 | // AaiTtsFormatType 语音合成(AI Lab) 合成语音格式编码 25 | type AaiTtsFormatType = int 26 | 27 | const ( 28 | // AaiTtsFormatPCM PCM 29 | AaiTtsFormatPCM AaiTtsFormatType = 1 30 | // AaiTtsFormatWAV WAV 31 | AaiTtsFormatWAV AaiTtsFormatType = 2 32 | // AaiTtsFormatMP3 MP3 33 | AaiTtsFormatMP3 AaiTtsFormatType = 3 34 | ) 35 | 36 | // AaiTtsForText 语音合成(AI Lab) 37 | // text 待合成文本 38 | // speaker 语音发音人编码,定义见 https://ai.qq.com/doc/aaitts.shtml 39 | // format 合成语音格式编码 40 | // volume 合成语音音量,取值范围[-10, 10],如-10表示音量相对默认值小10dB,0表示默认音量,10表示音量相对默认值大10dB 41 | // speed 合成语音语速,默认100 42 | // aht 合成语音降低/升高半音个数,即改变音高,默认0 43 | // apc 控制频谱翘曲的程度,改变说话人的音色,默认58 44 | func (ai *TxAi) AaiTtsForText(text string, speaker AaiTtsSpeakerType, format AaiTtsFormatType, volume, speed, aht, apc int) (*AaiTtsResponse, error) { 45 | if volume < -10 || volume > 10 { 46 | volume = 0 47 | } 48 | if speed < 50 || speed > 100 { 49 | speed = 100 50 | } 51 | if aht < -24 || aht > 24 { 52 | aht = 0 53 | } 54 | if apc < 0 || apc > 100 { 55 | apc = 58 56 | } 57 | params := ai.getPublicParams() 58 | params.Add("text", text) 59 | params.Add("speaker", fmt.Sprint(speaker)) 60 | params.Add("format", fmt.Sprint(format)) 61 | params.Add("volume", fmt.Sprint(volume)) 62 | params.Add("speed", fmt.Sprint(speed)) 63 | params.Add("aht", fmt.Sprint(aht)) 64 | params.Add("apc", fmt.Sprint(apc)) 65 | sign := ai.getReqSign(params) 66 | params.Add("sign", sign) 67 | // 响应结果 68 | aaiTtsResponse := new(AaiTtsResponse) 69 | err := ai.RequestAPI(aaiTtsURI, params, aaiTtsResponse) 70 | if err != nil { 71 | return nil, err 72 | } 73 | return aaiTtsResponse, nil 74 | } 75 | 76 | // AaiTtaModelType 语音合成(优图) 模型编码 77 | type AaiTtaModelType = int 78 | 79 | const ( 80 | // AaiTtaModelType0 女生 81 | AaiTtaModelType0 AaiTtaModelType = 0 82 | // AaiTtaModelType1 女生纯英文 83 | AaiTtaModelType1 AaiTtaModelType = 1 84 | // AaiTtaModelType2 男生 85 | AaiTtaModelType2 AaiTtaModelType = 2 86 | // AaiTtaModelType6 喜道公子 87 | AaiTtaModelType6 AaiTtaModelType = 6 88 | ) 89 | 90 | // AaiTtaForText 语音合成(优图) 91 | // text 待合成文本 92 | // modelType 发音模型,默认为0,定义见 https://ai.qq.com/doc/aaitts.shtml 93 | // speed 语速,默认为0 0.6倍速-2,0.8倍速-1,正常速度0,1.2倍速1,1.5倍速2 94 | func (ai *TxAi) AaiTtaForText(text string, modelType AaiTtaModelType, speed int) (*AaiTtaResponse, error) { 95 | if speed < -2 || speed > 2 { 96 | speed = 0 97 | } 98 | params := ai.getPublicParams() 99 | params.Add("text", text) 100 | params.Add("model_type", fmt.Sprint(modelType)) 101 | params.Add("speed", fmt.Sprint(speed)) 102 | sign := ai.getReqSign(params) 103 | params.Add("sign", sign) 104 | // 响应结果 105 | aaiTtaResponse := new(AaiTtaResponse) 106 | err := ai.RequestAPI(aaiTtaURI, params, aaiTtaResponse) 107 | if err != nil { 108 | return nil, err 109 | } 110 | return aaiTtaResponse, nil 111 | } 112 | -------------------------------------------------------------------------------- /aai_wxasrlong.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 语音识别 4 | 5 | import ( 6 | "encoding/base64" 7 | "encoding/json" 8 | "fmt" 9 | "io/ioutil" 10 | ) 11 | 12 | var ( 13 | aaiWxasrlongURI = "/aai/aai_wxasrlong" 14 | ) 15 | 16 | // AaiWxasrlongForBase64 长语音识别 - 音频为base64格式 17 | // speech 待识别语音(时长上限15s) 18 | // format 语音压缩格式编码,定义见 https://ai.qq.com/doc/wxasrlong.shtml 19 | // callbackURL 用户回调url,需用户提供,用于平台向用户通知识别结果,详见下文描述 20 | // speechURL 待识别语音下载地址(时长上限15min) 21 | func (ai *TxAi) AaiWxasrlongForBase64(speech string, format AaiAudioType, callbackURL, speechURL string) (*AaiWxasrlongResponse, error) { 22 | params := ai.getPublicParams() 23 | if speech != "" { 24 | params.Add("speech", speech) 25 | } 26 | if speechURL != "" { 27 | params.Add("speech_url", speechURL) 28 | } 29 | params.Add("format", fmt.Sprint(format)) 30 | params.Add("callback_url", callbackURL) 31 | sign := ai.getReqSign(params) 32 | params.Add("sign", sign) 33 | 34 | // 响应结果 35 | aaiWxasrlongResponse := new(AaiWxasrlongResponse) 36 | err := ai.RequestAPI(aaiWxasrlongURI, params, aaiWxasrlongResponse) 37 | if err != nil { 38 | return nil, err 39 | } 40 | return aaiWxasrlongResponse, nil 41 | } 42 | 43 | // AaiWxasrlongForPath 长语音识别 - 音频为本地路径 44 | // speechPath 本地待识别语音路径(时长上限15s) 45 | // format 语音压缩格式编码,定义见 https://ai.qq.com/doc/wxasrlong.shtml 46 | // callbackURL 用户回调url,需用户提供,用于平台向用户通知识别结果,详见下文描述 47 | // speechURL 待识别语音下载地址(时长上限15min) 48 | func (ai *TxAi) AaiWxasrlongForPath(speechPath string, format AaiAudioType, callbackURL, speechURL string) (*AaiWxasrlongResponse, error) { 49 | body, err := ioutil.ReadFile(speechPath) 50 | if err != nil { 51 | return nil, err 52 | } 53 | speech := base64.StdEncoding.EncodeToString(body) 54 | return ai.AaiWxasrlongForBase64(speech, format, callbackURL, speechURL) 55 | } 56 | 57 | // AaiWxasrlongHandleCallback 处理回调数据 58 | func AaiWxasrlongHandleCallback(body []byte) (*AaiWxasrlongResponse, *BaseResponse, error) { 59 | aaiWxasrlongResponse := new(AaiWxasrlongResponse) 60 | baseResponse := &BaseResponse{ 61 | Ret: 0, 62 | Msg: "ok", 63 | } 64 | // 解析json数据 65 | err := json.Unmarshal(body, aaiWxasrlongResponse) 66 | if err != nil { 67 | return nil, baseResponse, err 68 | } 69 | ret := aaiWxasrlongResponse.GetRet() 70 | if ret != 0 { 71 | return nil, baseResponse, GetError(ret) 72 | } 73 | return aaiWxasrlongResponse, baseResponse, nil 74 | } 75 | -------------------------------------------------------------------------------- /data/format.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import csv 4 | import sys 5 | import string 6 | 7 | def main(name): 8 | ''' 9 | 生成的map可能与go代码中名字不同,酌情修改 10 | ''' 11 | csv_reader = csv.reader(open(name)) 12 | obj = {} 13 | keys = [] 14 | for row in csv_reader: 15 | # print(len(row)) 16 | for k in range(0,len(row)): 17 | if k%2 == 1 and row[k-1] != "": 18 | keys.append(int(row[k-1])) 19 | obj[int(row[k-1])] = row[k] 20 | keys.sort() 21 | 22 | structName = getStructName(name) 23 | 24 | print("var %sNames = map[int]string{" % structName) 25 | for v in keys: 26 | print(" %s: \"%s\"," % (v,obj[v])) 27 | print("}") 28 | 29 | def getStructName(name): 30 | name1 = name.split(".")[0] 31 | name2 = name1.split("_") 32 | structName = "" 33 | for v in name2: 34 | structName += string.capwords(v) 35 | return structName 36 | 37 | if __name__ == '__main__': 38 | if len(sys.argv) < 2: 39 | print("请输入csv文件名") 40 | sys.exit() 41 | main(sys.argv[1]) 42 | 43 | -------------------------------------------------------------------------------- /data/nlp_wordcom_com_type.csv: -------------------------------------------------------------------------------- 1 | 0,未知 2 | 1,歌词 3 | 2,下载地址 4 | 3,乐器 5 | 4,歌曲 6 | 5,人名 7 | 6,时间 8 | 7,地点 9 | 8,风格 10 | 9,数字 11 | 10,视频 12 | 11,民族 13 | 12,专辑 14 | 13,序数词 15 | 14,综艺 16 | 15,乐队 17 | 16,景点 18 | 17,电影 19 | 18,电视剧 20 | 19,百科 21 | 34,股票名称 22 | 35,股票代码 23 | 36,指数 24 | 37,价格 25 | 38,行情 26 | 40,山 27 | 41,湖 28 | 42,是否 29 | 43,餐馆 30 | 44,菜名 31 | 45,儿歌 32 | 46,故事 33 | 47,相声 34 | 48,评书 35 | 49,有声内容 36 | 128,类别词 37 | 129,关系词 38 | 130,省略词 -------------------------------------------------------------------------------- /data/nlp_wordcom_intent.csv: -------------------------------------------------------------------------------- 1 | 0,未知 2 | 1,天气 3 | 2,音乐 4 | 3,股票 5 | 4,新闻 -------------------------------------------------------------------------------- /data/nlp_wordner.csv: -------------------------------------------------------------------------------- 1 | 1000,人名 2 | 1100,地名 3 | 1200,机构名 4 | 1300,时间 -------------------------------------------------------------------------------- /data/nlp_wordpos.csv: -------------------------------------------------------------------------------- 1 | 0,未知词性,18,姓,36,语气词 2 | 1,形容词,19,名,37,状态词 3 | 2,副形词,20,地名,38,形语素 4 | 3,名形词,21,机构团体,39,区别语素 5 | 4,区别词,22,其他专名,40,副语素 6 | 5,连词,23,非汉字串,41,数词性语素 7 | 6,副词,24,拟声词,42,名语素 8 | 7,叹词,25,介词,43,量语素 9 | 8,方位词,26,量词,44,代语素 10 | 9,语素词,27,代词,45,时语素 11 | 10,前接成分,28,处所词,46,动语素 12 | 11,成语,29,时间词,47,语气词语素 13 | 12,简称略语,30,助词,48,状态词语素 14 | 13,后接成分,31,动词,49,开始词 15 | 14,习用语,32,副动词,50,URL 16 | 15,数词,33,名动词,51,电话号码 17 | 16,名词,34,标点符号,52,email 18 | 17,人名,35,非语素字,55,结束词 -------------------------------------------------------------------------------- /data/vision_objectr.csv: -------------------------------------------------------------------------------- 1 | 0,鲤鱼,200,菊花狗,400,学位袍,600,钩爪,800,赌博机 2 | 1,金鱼,201,丝毛狗,401,手风琴,601,衬裙,801,通气管 3 | 2,大白鲨,202,爱尔兰软毛犬,402,原声吉他,602,单杠,802,雪橇 4 | 3,虎鲨,203,西部高地白犬,403,航母,603,马车,803,扫雪机 5 | 4,锤头鲨,204,拉萨,拉萨犬,404,客机,604,沙漏,804,皂液器 6 | 5,电鳗,205,平滑毛寻回犬,405,飞船,605,音乐播放器,805,足球 7 | 6,黄貂鱼,206,卷毛寻回犬,406,祭坛,606,铁,806,短袜 8 | 7,公鸡,207,金毛猎犬,407,救护车,607,南瓜灯,807,太阳能盘 9 | 8,母鸡,208,拉布拉多猎犬,408,水陆两用飞机构,608,牛仔裤,808,宽边帽 10 | 9,鸵鸟,209,乞沙比克猎犬,409,模拟时钟,609,吉普车,809,一碗汤 11 | 10,燕雀,210,德国短毛猎犬,410,蜂房,610,T恤,810,空格键 12 | 11,金翅雀,211,匈牙利维兹拉犬,411,围裙,611,拼图游戏,811,空间加热器 13 | 12,朱雀,212,英国赛特犬,412,垃圾桶,612,黄包车,812,航天飞机 14 | 13,雪鸟,213,爱尔兰塞特猎犬,413,突击步枪,613,操纵杆,813,铲 15 | 14,雀鸟,214,戈登雪达犬,414,背包,614,和服,814,快艇 16 | 15,美洲知更鸟,215,布列塔尼犬,415,面包店,615,护膝,815,蜘蛛网 17 | 16,鹎,216,黄毛猎犬,416,平衡梁,616,结,816,主轴 18 | 17,松鸦,217,英国史宾格犬,417,气球,617,实验室工作服,817,跑车 19 | 18,喜鹊,218,威尔士激飞猎犬,418,圆珠笔,618,钢包,818,聚光灯 20 | 19,山雀,219,英国可卡犬,419,创可贴,619,灯罩,819,舞台 21 | 20,河鸟,220,萨塞克斯猎犬,420,班卓琴,620,笔记本电脑,820,蒸汽机车 22 | 21,风筝,221,爱尔兰水猎犬,421,栏杆,621,割草机,821,钢拱桥 23 | 22,秃头鹰,222,哥威斯犬,422,杠铃,622,镜头盖,822,钢鼓 24 | 23,秃鹫,223,舒柏奇犬,423,理发椅,623,开信刀,823,听诊器 25 | 24,大灰猫头鹰,224,牧羊犬,424,理发店,624,图书馆,824,长巾 26 | 25,欧洲火蝾螈,225,马里努阿犬,425,谷仓,625,救生艇,825,石头墙 27 | 26,蝾螈,226,伯瑞犬,426,气压计,626,打火机,826,秒表 28 | 27,水蜥蜴,227,澳大利亚护羊犬,427,木桶,627,豪华轿车,827,火炉 29 | 28,斑点蝾螈,228,可蒙犬,428,手推车,628,班轮,828,过滤器 30 | 29,美西螈,229,英国牧羊犬,429,棒球,629,口红,829,有轨电车 31 | 30,牛蛙,230,喜乐蒂牧羊犬,430,篮球,630,拖鞋,830,担架 32 | 31,树蛙,231,牧羊犬,431,摇篮,631,洗剂,831,工作室沙发 33 | 32,尾蟾,232,边境牧羊犬,432,巴松管,632,扬声器,832,佛塔 34 | 33,红海龟,233,法兰德斯畜牧犬,433,游泳帽,633,放大镜,833,潜艇 35 | 34,棱皮龟,234,罗威犬,434,浴巾,634,锯木厂,834,西服 36 | 35,泥龟,235,德国牧羊犬,435,浴缸,635,磁罗盘,835,日晷 37 | 36,鳖,236,杜宾犬,436,沙滩车,636,邮袋,836,太阳镜 38 | 37,箱龟,237,迷你杜宾犬,437,灯塔,637,信箱,837,墨镜 39 | 38,条纹壁虎,238,大瑞士山犬,438,烧杯,638,紧身衣,838,防晒霜 40 | 39,绿鬣蜥,239,伯恩山犬,439,熊皮,639,背带式女浴衣,839,悬索桥 41 | 40,美国变色龙,240,阿彭策尔勒犬,440,啤酒瓶,640,窨井盖,840,拖把 42 | 41,鞭尾蜥蜴,241,恩特雷布赫山犬,441,啤酒杯,641,沙球,841,运动衫 43 | 42,飞龙科蜥蜴,242,拳狮犬,442,钟架,642,马林巴木琴,842,游泳裤 44 | 43,皱褶蜥蜴,243,斗牛獒犬,443,围兜,643,面具,843,摆动 45 | 44,鳄蜥,244,藏獒,444,双坐自行车,644,火柴,844,开关 46 | 45,毒蜥,245,法国斗牛犬,445,比基尼,645,花柱,845,注射器 47 | 46,绿蜥蜴,246,大丹犬,446,粘合剂,646,迷宫,846,台灯 48 | 47,非洲变色龙,247,圣伯纳德狗,447,望远镜,647,测量杯,847,坦克 49 | 48,科莫多龙,248,爱斯基摩犬,448,鸟舍,648,药箱,848,磁带播放器 50 | 49,非洲鳄鱼,249,雪橇犬,449,船屋,649,巨石,849,茶壶 51 | 50,美国短吻鳄,250,西伯利亚雪橇犬,450,雪橇,650,麦克风,850,泰迪熊 52 | 51,三角龙,251,达尔马提亚,451,波洛领带,651,微波炉,851,电视系统 53 | 52,雷霆蛇,252,猴犬,452,阀盖,652,军装,852,网球 54 | 53,环颈蛇,253,巴辛吉,453,书柜,653,奶瓶,853,茅草屋顶 55 | 54,猪鼻蛇,254,哈巴狗,454,书店,654,小巴士,854,剧场幕布 56 | 55,绿蛇,255,兰伯格犬,455,瓶盖,655,迷你裙,855,顶针 57 | 56,大王蛇,256,纽芬兰犬,456,弓,656,面包车,856,脱粒机 58 | 57,乌梢蛇,257,大白熊犬,457,领结,657,导弹,857,宝座 59 | 58,水蛇,258,萨摩犬,458,黄铜,658,手套,858,瓦屋顶 60 | 59,藤蛇,259,博美犬,459,文胸,659,搅拌碗,859,烤面包机 61 | 60,夜蛇,260,松狮犬,460,码头,660,制造家,860,烟草店 62 | 61,蟒蛇,261,荷兰毛狮犬,461,盾牌,661,模型,861,马桶座 63 | 62,岩蟒,262,布鲁塞尔格林芬犬,462,扫帚,662,调制解调器,862,火炬 64 | 63,印度眼镜蛇,263,潘布魯克威尔斯柯基犬,463,水桶,663,修道院,863,图腾柱 65 | 64,曼巴蛇,264,卡迪根威尔士柯基犬,464,搭扣,664,监控,864,拖车 66 | 65,海蛇,265,玩具型贵宾犬,465,防弹背心,665,助力车,865,玩具店 67 | 66,角蝰,266,迷你型贵宾犬,466,子弹列车,666,砂浆,866,拖拉机 68 | 67,响尾蛇,267,标准型贵宾犬,467,肉店,667,学位帽,867,拖车 69 | 68,角响尾蛇,268,墨西哥无毛犬,468,出租车,668,清真寺,868,托盘 70 | 69,三叶虫,269,灰狼,469,釜,669,蚊帐,869,风衣 71 | 70,喜蛛,270,白狼,470,蜡烛,670,摩托车,870,三轮车 72 | 71,蝎子,271,红狼,471,大炮,671,山地自行车,871,三体船 73 | 72,金园蛛,272,草原狼,472,独木舟,672,登山帐,872,三脚架 74 | 73,仓蜘,273,澳洲野犬,473,开罐器,673,鼠标,873,凯旋门 75 | 74,园蛛,274,豺狗,474,开衫,674,捕鼠器,874,无轨电车 76 | 75,黑寡妇,275,三色犬,475,车镜,675,移动车,875,长号 77 | 76,狼蛛,276,鬣狗,476,旋转木马,676,枪口,876,浴缸 78 | 77,狼蛛,277,红狐狸,477,木匠工具箱,677,指甲,877,十字转门 79 | 78,扁虱,278,美洲小狐,478,纸箱,678,颈托,878,打字机键盘 80 | 79,蜈蚣,279,北极狐,479,汽车轮,679,项链,879,雨伞 81 | 80,黑琴鸡,280,灰色的狐狸,480,提款机,680,乳头,880,独轮车 82 | 81,雷鸟,281,虎斑,481,盒式录音带,681,笔记本电脑,881,立式钢琴 83 | 82,鹧鸪,282,猫虎,482,磁带播放器,682,方尖碑,882,真空吸尘器 84 | 83,草原鸡,283,波斯猫,483,城堡,683,双簧管双簧管,883,花瓶 85 | 84,孔雀,284,暹罗暹罗猫,484,双体船,684,陶笛,884,拱顶 86 | 85,鹌鹑,285,埃及猫,485,播放器,685,里程表,885,天鹅绒 87 | 86,鹧鸪,286,美洲狮,486,大提琴,686,滤油器,886,自动售货机 88 | 87,非洲灰鹦鹉,287,猞猁,487,蜂窝电话,687,风琴,887,法衣 89 | 88,金刚鹦鹉,288,豹,488,链,688,示波器,888,高架桥 90 | 89,葵花凤头鹦鹉,289,雪豹,489,围栏,689,罩裙,889,小提琴 91 | 90,吸蜜鹦鹉,290,美洲虎,490,邮件,690,牛车,890,排球 92 | 91,鸦鹃,291,狮子,491,油锯,691,氧气面罩,891,松饼机 93 | 92,蜂虎,292,虎,492,胸部,692,小包裹,892,墙上的时钟 94 | 93,犀鸟,293,猎豹,493,衣柜,693,桨,893,钱包 95 | 94,蜂鸟,294,棕熊,494,编钟,694,明轮,894,衣柜 96 | 95,食虫鸟,295,黑熊,495,瓷器柜,695,挂锁,895,军用飞机 97 | 96,巨嘴鸟,296,北极熊,496,圣诞袜,696,画笔,896,洗脸盆 98 | 97,公鸭,297,懒熊,497,教堂,697,睡衣,897,洗衣机 99 | 98,红胸秋沙鸭,298,猫鼬,498,电影院,698,宫殿,898,一瓶水 100 | 99,鹅,299,狐獴,499,切肉刀,699,排箫,899,水壶 101 | 100,黑天鹅,300,虎甲虫,500,崖居,700,纸巾,900,水塔 102 | 101,塔斯克,301,瓢虫,501,斗篷,701,降落伞,901,威士忌的壶 103 | 102,食蚁兽,302,地面甲虫,502,木鞋,702,双杠杆,902,吹口哨 104 | 103,鸭嘴兽,303,天牛,503,鸡尾酒调酒器,703,公园的长椅,903,假发 105 | 104,袋鼠,304,叶甲,504,咖啡杯,704,停车收费表,904,纱窗 106 | 105,考拉,305,粪甲虫,505,咖啡壶,705,客车,905,百叶窗 107 | 106,袋熊,306,犀甲虫,506,线圈,706,露台,906,温莎领带 108 | 107,水母,307,象甲,507,密码锁,707,付费电话,907,酒瓶 109 | 108,海葵,308,飞,508,电脑键盘,708,底座,908,翼 110 | 109,脑珊瑚,309,蜜蜂,509,糖果,709,铅笔盒,909,炒锅 111 | 110,扁虫扁形动物,310,蚂蚁,510,集装箱船,710,卷笔刀,910,木勺子 112 | 111,线虫,311,蚱蜢,511,可转换,711,香水,911,羊毛 113 | 112,海螺,312,蟋蟀,512,螺旋形的,712,培养皿,912,蠕虫围栏 114 | 113,蜗牛,313,竹节虫,513,喇叭,713,复印机,913,沉船 115 | 114,鼻涕虫,314,蟑螂,514,牛仔靴,714,挑,914,快艇 116 | 115,裸鳃海蛞蝓,315,螳螂,515,牛仔帽,715,头盔,915,蒙古包 117 | 116,石鳖,316,蝉,516,摇篮,716,栅栏,916,网站 118 | 117,鹦鹉螺,317,叶蝉,517,起重机,717,皮卡,917,漫画书 119 | 118,珍宝蟹,318,中华草蛉,518,头盔,718,码头,918,纵横填字谜 120 | 119,岩石蟹,319,蜻蜓,大蚊,519,箱,719,储蓄银行,919,街道标志 121 | 120,招潮蟹,320,豆娘,520,婴儿床,720,药瓶,920,交通信号灯 122 | 121,皇帝蟹,321,花蝶,521,瓦罐锅,721,枕头,921,皮书套 123 | 122,美国龙虾,322,小环蝴蝶,522,槌球,722,乒乓球,922,菜单 124 | 123,龙虾,323,帝王蝶,523,拐杖,723,风车,923,盘子 125 | 124,小龙虾,324,菜粉蝶,524,胸甲,724,海盗船,924,鳄梨酱 126 | 125,寄居蟹,325,硫蝴蝶,525,堤坝,725,水罐,925,清汤 127 | 126,等足目动物,326,灰蝶,526,书桌,726,飞机,926,火锅 128 | 127,白鹳,327,海星,527,台式电脑,727,天文馆,927,琐事 129 | 128,黑鹳,328,海胆,528,拨号电话,728,塑料袋,928,冰淇淋 130 | 129,琵鹭,329,海参,529,尿布,729,板架,929,雪糕 131 | 130,火烈鸟,330,木兔,530,数字时钟,730,犁,930,法国面包 132 | 131,小蓝鹭,331,野兔,531,数字手表,731,柱塞,931,百吉饼 133 | 132,大白鹭,332,兔,532,餐桌,732,宝丽来相机,932,椒盐脆饼 134 | 133,麻鸦,333,仓鼠,533,抹布,733,极,933,芝士汉堡 135 | 134,鹤,334,刺猬,534,洗碗机,734,警车,934,热狗 136 | 135,锦鸡,335,东方狐松鼠,535,盘式制动器,735,雨披,935,土豆泥 137 | 136,欧洲水鸡,336,土拨鼠,536,码头,736,台球桌,936,结球甘蓝 138 | 137,美国黑鸭,337,海狸,537,狗拉雪橇,737,汽水瓶,937,西兰花 139 | 138,鸨,338,豚鼠,538,拱顶,738,花盆,938,菜花 140 | 139,翻石鹬,339,酢浆草,539,门垫,739,陶工的轮子,939,西葫芦 141 | 140,红背鹬,340,斑马,540,钻井平台,740,电钻,940,意大利南瓜 142 | 141,红脚鹬,341,猪,541,鼓,741,祈祷毯,941,小青南瓜 143 | 142,半蹼鹬,342,野猪,542,鼓槌,742,打印机,942,南瓜 144 | 143,蛎鹬,343,疣猪,543,哑铃,743,监狱,943,黄瓜 145 | 144,鹈鹕,344,河马,544,荷兰烤箱,744,导弹,944,朝鲜蓟 146 | 145,帝企鹅,345,公牛,545,电风扇,745,投影机,945,甜椒 147 | 146,大海鸟,346,水牛,546,电吉他,746,冰球,946,刺棘蓟 148 | 147,灰鲸,347,野牛,547,电力机车,747,沙包,947,蘑菇 149 | 148,虎鲸,348,公羊,548,娱乐中心,748,钱包,948,澳洲青苹 150 | 149,儒艮,349,大角羊,549,信封,749,羽毛笔,949,草莓 151 | 150,海狮,350,山羊,550,咖啡机,750,被子,950,橙色 152 | 151,墨西哥狗,351,狷羚,551,香粉,751,赛车,951,柠檬 153 | 152,日本猎犬,352,黑斑羚,552,蟒蛇,752,球拍,952,无花果 154 | 153,马尔济斯犬,353,瞪羚,553,文件,753,散热器,953,菠萝 155 | 154,哈巴狗,354,阿拉伯骆驼,554,消防船,754,无线电,954,香蕉 156 | 155,狮子狗,355,美洲驼,555,消防车,755,无线电望远镜,955,木菠萝 157 | 156,布莱尼姆猎犬,356,黄鼠狼,556,火屏,756,雨桶,956,蛋奶冻苹果 158 | 157,巴比,357,水貂,557,旗杆,757,休闲车,957,石榴 159 | 158,玩具犬,358,艾鼬,558,长笛,758,卷轴,958,干草 160 | 159,罗得西亚脊背犬,359,黑足鼬,559,折叠椅,759,反射式照相机,959,培根 161 | 160,阿富汗猎犬,360,水獭,560,橄榄球头盔,760,冰箱,960,巧克力酱 162 | 161,猎犬,361,臭鼬,561,叉车,761,远程遥控,961,面团 163 | 162,比格犬,362,獾,562,喷泉,762,餐厅,962,瑞士肉包 164 | 163,侦探猎犬,363,犰狳,563,钢笔,763,左轮手枪,963,比萨派 165 | 164,蓝斑猎狗,364,三趾树懒,564,四柱,764,步枪,964,馅饼 166 | 165,猎浣熊犬,365,猩猩,565,货运车,765,摇椅,965,玉米煎饼 167 | 166,沃克犬,366,大猩猩,566,号角,766,烤肉店,966,红葡萄酒 168 | 167,英国猎狐犬,367,黑猩猩,567,煎锅,767,橡皮,967,意大利浓咖啡 169 | 168,美洲赤狗,368,长臂猿,568,毛皮大衣,768,橄榄球,968,杯子 170 | 169,俄罗斯猎狼犬,369,合趾猿长臂猿,569,垃圾车,769,标尺,969,蛋奶酒 171 | 170,爱尔兰猎狼犬,370,长尾猴,570,防毒面具,770,跑步鞋,970,高山 172 | 171,意大利灵缇犬,371,猴子,571,气泵,771,保险箱,971,气泡 173 | 172,惠比特犬,372,狒狒,572,高脚杯,772,别针,972,悬崖 174 | 173,依比沙猎犬,373,猕猴,573,卡丁车,773,盐瓶,973,珊瑚礁 175 | 174,挪威猎犬,374,叶猴,574,高尔夫球,774,凉鞋,974,间歇泉 176 | 175,奥达猎犬,375,疣,575,高尔夫球车,775,布裙,975,湖边 177 | 176,沙克犬瞪羚猎犬,376,长鼻猴,576,贡多拉,776,萨克斯管,976,海角 178 | 177,苏格兰猎鹿犬,377,狨,577,锣,777,剑鞘,977,沙洲 179 | 178,威玛猎犬,378,浣熊,578,长袍,778,秤,978,海岸 180 | 179,斯塔福德郡斗牛犬,379,吼猴,579,大钢琴,779,校车,979,谷 181 | 180,美国斗牛犬,380,伶猴,580,苗圃,780,帆船,980,火山 182 | 181,贝德灵顿犬,381,蜘蛛猴,581,格栅,781,记分牌,981,棒球运动员 183 | 182,博德猎狐犬,382,松鼠猴,582,杂货店,782,屏幕,982,新郎 184 | 183,凯丽蓝犬,383,马达加斯加猫,583,断头台,783,螺丝钉,983,潜水员 185 | 184,爱尔兰犬,384,大狐猴,584,幻灯片,784,螺丝刀,984,油菜 186 | 185,诺福克犬,385,印度大象,585,头发喷雾,785,安全带,985,雏菊 187 | 186,诺维奇犬,386,非洲大象,586,半轨,786,缝纫机,986,黄色凤仙花 188 | 187,约克郡犬,387,小熊猫,587,铁锤,787,小圆盾,987,玉米 189 | 188,刚毛猎狐犬,388,熊猫,588,阻碍,788,鞋店,988,橡子 190 | 189,莱克兰犬,389,杖鱼,589,手吹风,789,障子,989,玫瑰果 191 | 190,锡利哈姆犬,390,鳗鱼,590,掌上电脑,790,购物篮,990,七叶树 192 | 191,艾尔谷犬,391,银大马哈鱼,591,手帕,791,购物车,991,珊瑚菌 193 | 192,凯恩犬,392,三色刺蝶鱼,592,硬盘,792,铲子,992,木耳 194 | 193,澳大利亚犬,393,海葵鱼,593,口风琴,793,淋浴帽,993,鹿花菌属 195 | 194,英国小猎犬,394,鲟鱼,594,竖琴,794,浴帘,994,鬼笔菌 196 | 195,波士顿犬,395,雀鳝,595,收割机,795,滑雪,995,地星 197 | 196,迷你雪纳瑞,396,狮子鱼,596,斧头,796,滑雪面罩,996,灰树花 198 | 197,巨型雪纳瑞,397,河豚,597,皮套,797,睡袋,997,牛肝菌 199 | 198,标准雪纳瑞,398,算盘,598,家庭影院,798,计算尺,998,穗 200 | 199,苏格兰犬,399,长袍,599,蜂窝,799,滑动门,999,卫生纸 -------------------------------------------------------------------------------- /data/vision_scener.csv: -------------------------------------------------------------------------------- 1 | 0,机场,60,肉店,120,栽培,180,垃圾填埋,240,索桥 2 | 1,机舱,61,巴特,121,野生的,181,降落甲板,241,废墟 3 | 2,机场航站楼,62,小屋内,122,场路,182,草坪,242,沙盒 4 | 3,胡同,63,自助餐厅,123,火灾逃生,183,图书馆室内,243,桑拿 5 | 4,游乐场,64,营地,124,消防站,184,灯塔,244,服务器机房 6 | 5,游乐园,65,校园,125,鱼塘,185,客厅,245,鞋店 7 | 6,公寓大楼外,66,自然的,126,室内跳蚤市场,186,大堂,246,大商场室内 8 | 7,水族馆,67,城市的,127,室内花店,187,更衣室,247,淋浴 9 | 8,渡槽,68,糖果店,128,美食广场,188,商店外面,248,滑雪度假村 10 | 9,游乐中心,69,峡谷,129,足球场,189,商店里面,249,天空 11 | 10,考古发掘,70,汽车内饰,130,阔叶,190,沼泽,250,摩天大楼 12 | 11,档案文件,71,旋转木马,131,森林的小路,191,武术馆,251,雪地 13 | 12,曲棍球,72,城堡,132,林道,192,水,252,足球场 14 | 13,性能,73,地下墓穴,133,正式的花园,193,清真寺外面,253,稳定的 15 | 14,牛仔竞技比赛,74,墓地,134,喷泉,194,山,254,棒球 16 | 15,陆军基地,75,化学实验室,135,厨房,195,山间小道,255,足球 17 | 16,艺术画廊,76,孩子的房间,136,车库内,196,山上的雪,256,室内舞台 18 | 17,艺术学校,77,礼堂内,137,车库外,197,电影院室内,257,户外舞台 19 | 18,艺术工作室,78,礼堂外,138,加油站,198,博物馆室内,258,楼梯 20 | 19,装配线,79,教室,139,外部,199,音乐工作室,259,街道 21 | 20,户外田径场地,80,悬崖,140,杂货店内,200,自然历史博物馆,260,地铁站台 22 | 21,阁楼,81,衣柜,141,礼品店,201,婴儿室,261,超市 23 | 22,大礼堂,82,服装店,142,冰川,202,海洋,262,寿司店 24 | 23,汽车厂,83,海岸,143,高尔夫球场,203,办公室,263,沼泽 25 | 24,汽车展厅,84,驾驶舱,144,温室内,204,办公隔间,264,游泳池 26 | 25,荒地,85,咖啡店,145,温室外,205,石油钻台,265,室内游泳池 27 | 26,商店,86,电脑室,146,石窟,206,操作室,266,户外游泳池 28 | 27,外部,87,会议室,147,体育馆内,207,果园,267,电视演播室 29 | 28,内部,88,施工现场,148,飞机棚内,208,乐池,268,亚洲 30 | 29,球坑,89,玉米田,149,飞机棚外,209,宝塔,269,王座室 31 | 30,舞厅,90,畜栏,150,港,210,宫殿,270,售票厅 32 | 31,竹林,91,走廊,151,五金店,211,食品贮藏室,271,修剪花园 33 | 32,银行金库,92,庭院,152,海菲尔德,212,公园,272,塔 34 | 33,宴会厅,93,小溪,153,直升机场,213,室内停车场,273,玩具店 35 | 34,酒吧,94,决口,154,公路,214,停车场,274,列车内部 36 | 35,棒球场,95,人行横道,155,家庭办公室,215,牧场,275,火车站台 37 | 36,地下室,96,水坝,156,医院的房间,216,亭阁,276,林场 38 | 37,室内篮球场,97,熟食店,157,温泉,217,宠物店,277,树屋 39 | 38,浴室,98,百货商店,158,酒店外,218,药房,278,沟槽 40 | 39,室内市场,99,沙,159,酒店房间,219,电话亭,279,苔原 41 | 40,户外市场,100,植被,160,房子,220,码头,280,海洋的深处 42 | 41,海滩,101,沙漠公路,161,冰淇淋店,221,比萨店,281,实用的房间 43 | 42,美容院,102,路边小饭店,162,浮冰,222,操场,282,山谷 44 | 43,卧室,103,餐厅,163,冰架,223,广场,283,植物园 45 | 44,泊位,104,餐厅,164,室内溜冰场,224,池塘,284,兽医办公室 46 | 45,生物学实验室,105,迪斯科舞厅,165,室外溜冰场,225,酒馆内,285,高架桥 47 | 46,木板路,106,宿舍,166,冰山,226,赛马场,286,村庄 48 | 47,船的甲板上,107,市中心,167,工业区,227,滚道,287,葡萄园 49 | 48,船屋,108,更衣室,168,胰岛,228,筏,288,火山 50 | 49,书店,109,车道,169,浴缸里,229,铁路轨道,289,户外排球场 51 | 50,公用电话亭里面,110,药店,170,监狱,230,雨林,290,水上公园 52 | 51,植物园,111,门,171,日本花园,231,接待,291,水塔 53 | 52,室内的弓形窗,112,电梯大堂,172,珠宝店,232,娱乐室,292,瀑布 54 | 53,保龄球馆,113,电梯井,173,垃圾场,233,修理店,293,浇水洞 55 | 54,拳击台,114,发动机室,174,城堡,234,餐厅,294,波动 56 | 55,桥,115,室内自动扶梯,175,狗屋外面,235,餐厅厨房,295,小麦田 57 | 56,建筑立面,116,开挖,176,幼儿园的教室,236,餐厅的露台,296,风电场 58 | 57,斗牛场,117,布艺店,177,厨房,237,稻田,297,院子 59 | 58,车内,118,农场,178,泻湖,238,河,298,禅园 60 | 59,公交车站内,119,快餐店,179,自然的,239,岩拱,, -------------------------------------------------------------------------------- /demo/aai/aai_asr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | var ( 11 | txAi *txai.TxAi 12 | ) 13 | 14 | func main() { 15 | // 系统日志显示文件和行号 16 | log.SetFlags(log.Lshortfile | log.LstdFlags) 17 | 18 | txAi = txai.New("appid", "appkey", true) 19 | 20 | asr() // 语音识别-echo版 21 | asrs() // 语音识别-流式版(AI Lab) 22 | wxasrs() // 语音识别-流式版(WeChat AI) 23 | } 24 | 25 | func asr() { 26 | val, err := txAi.AaiAsrForPath("../../img/wxasrs.wav", txai.AaiAudioWAV, 16000) 27 | log.Println(err) 28 | js, _ := json.Marshal(val) 29 | log.Println(string(js)) 30 | } 31 | 32 | func asrs() { 33 | val, err := txAi.AaiAsrsForPath("../../img/wxasrs.wav", txai.AaiAudioWAV, 0, 1, "110", 16000) 34 | log.Println(err) 35 | js, _ := json.Marshal(val) 36 | log.Println(string(js)) 37 | } 38 | 39 | func wxasrs() { 40 | val, err := txAi.AaiWxasrsForPath("../../img/wxasrs.wav", txai.AaiAudioWAV, 16000, 16, 0, 1, "110", 1) 41 | log.Println(err) 42 | js, _ := json.Marshal(val) 43 | log.Println(string(js)) 44 | } 45 | -------------------------------------------------------------------------------- /demo/aai/aai_detectkeyword/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | "net/http" 8 | "time" 9 | 10 | "github.com/shiguanghuxian/txai" 11 | ) 12 | 13 | var txAi = txai.New("appid", "appkey", true) 14 | 15 | func main() { 16 | // 系统日志显示文件和行号 17 | log.SetFlags(log.Lshortfile | log.LstdFlags) 18 | go startHttp() 19 | time.Sleep(2 * time.Second) 20 | go sendAaiDetectkeyword() 21 | 22 | select {} 23 | } 24 | 25 | // 发送关键词检索请求 26 | func sendAaiDetectkeyword() { 27 | val, err := txAi.AaiDetectkeywordForPath("./wxasrs.wav", "", txai.AaiAudioWAV, "http://x.x.x.x:9899/detectkeyword", "腾讯", "开放平台") 28 | log.Println(err) 29 | js, _ := json.Marshal(val) 30 | log.Println(string(js)) 31 | } 32 | 33 | // 开启http服务 34 | func startHttp() { 35 | http.HandleFunc("/detectkeyword", WxasrlongHandler) 36 | http.ListenAndServe("0.0.0.0:9899", nil) 37 | } 38 | 39 | // WxasrlongHandler 处理异步回调 40 | func WxasrlongHandler(w http.ResponseWriter, r *http.Request) { 41 | body, err := ioutil.ReadAll(r.Body) 42 | if err != nil { 43 | log.Println(err) 44 | } 45 | log.Println(string(body)) 46 | aaiDetectkeywordResponse, baseResponse, err := txai.AaiDetectkeywordHandleCallback(body) 47 | 48 | js1, _ := json.Marshal(aaiDetectkeywordResponse) 49 | log.Println(string(js1)) 50 | 51 | js, _ := json.Marshal(baseResponse) 52 | w.Write(js) 53 | } 54 | -------------------------------------------------------------------------------- /demo/aai/aai_evilaudio/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | var ( 11 | txAi *txai.TxAi 12 | ) 13 | 14 | func main() { 15 | // 系统日志显示文件和行号 16 | log.SetFlags(log.Lshortfile | log.LstdFlags) 17 | 18 | txAi = txai.New("appid", "appkey", true) 19 | 20 | val, err := txAi.AaiEvilaudioForUrl("demo", "https://ai.qq.com/cgi-bin/appdemo_ttsecho?text=欢迎使用腾讯AI。&speaker=1&volume=0&speed=100&format=3&aht=0&apc=58&download=1") 21 | log.Println(err) 22 | js, _ := json.Marshal(val) 23 | log.Println(string(js)) 24 | } 25 | -------------------------------------------------------------------------------- /demo/aai/aai_tt/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | var ( 12 | txAi *txai.TxAi 13 | ) 14 | 15 | func main() { 16 | // 系统日志显示文件和行号 17 | log.SetFlags(log.Lshortfile | log.LstdFlags) 18 | 19 | txAi = txai.New("appid", "appkey", true) 20 | 21 | tts() // 语音合成(AI Lab) 22 | tta() // 语音合成(优图) 23 | } 24 | 25 | func tts() { 26 | val, err := txAi.AaiTtsForText("你好吗天气好吗英文版", txai.AaiTtsSpeaker5, txai.AaiTtsFormatMP3, 0, 100, 0, 58) 27 | log.Println(err) 28 | ioutil.WriteFile("abc1.mp3", val.Data.Speech, 0655) 29 | js, _ := json.Marshal(val) 30 | log.Println(string(js)) 31 | } 32 | 33 | func tta() { 34 | val, err := txAi.AaiTtaForText("你好吗天气好吗英文版", txai.AaiTtaModelType0, 0) 35 | log.Println(err) 36 | ioutil.WriteFile("abc2.mp3", val.Data.Voice, 0655) 37 | js, _ := json.Marshal(val) 38 | log.Println(string(js)) 39 | } 40 | -------------------------------------------------------------------------------- /demo/aai/aai_wxasrlong/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | "net/http" 8 | "time" 9 | 10 | "github.com/shiguanghuxian/txai" 11 | ) 12 | 13 | var txAi = txai.New("appid", "appkey", true) 14 | 15 | func main() { 16 | // 系统日志显示文件和行号 17 | log.SetFlags(log.Lshortfile | log.LstdFlags) 18 | go startHttp() 19 | time.Sleep(2 * time.Second) 20 | go sendAaiWxasrlong() 21 | 22 | select {} 23 | } 24 | 25 | // 发送长语音识别 26 | func sendAaiWxasrlong() { 27 | val, err := txAi.AaiWxasrlongForPath("./wxasrs.wav", txai.AaiAudioWAV, "http://x.x.x.x:9899/wxasrlong", "") 28 | log.Println(err) 29 | js, _ := json.Marshal(val) 30 | log.Println(string(js)) 31 | } 32 | 33 | // 开启http服务 34 | func startHttp() { 35 | http.HandleFunc("/wxasrlong", WxasrlongHandler) 36 | http.ListenAndServe("0.0.0.0:9899", nil) 37 | } 38 | 39 | // WxasrlongHandler 处理异步回调 40 | func WxasrlongHandler(w http.ResponseWriter, r *http.Request) { 41 | body, err := ioutil.ReadAll(r.Body) 42 | if err != nil { 43 | log.Println(err) 44 | } 45 | aaiWxasrlongResponse, baseResponse, err := txai.AaiWxasrlongHandleCallback(body) 46 | 47 | js1, _ := json.Marshal(aaiWxasrlongResponse) 48 | log.Println(string(js1)) 49 | 50 | js, _ := json.Marshal(baseResponse) 51 | w.Write(js) 52 | } 53 | -------------------------------------------------------------------------------- /demo/face/face_addface/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceAddfaceForPath("../../img/face_facecompare1.jpg", "id1", "tag1") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_delface/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceDelfaceForPersonId("id1", "2683001493248852866") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_delperson/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceDelpersonForPersonId("BoHuang") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_detectcrossageface/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceDetectcrossagefaceForPath("../../img/source_image.jpg", "../img/target_image.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_detectface/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceDetectfaceForPath("../../img/face_detectface.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_detectmultiface/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceDetectmultifaceForPath("../../img/face_detectmultiface.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_facecompare/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceFacecompareForPath("../../img/face_facecompare1.jpg", "../../img/face_facecompare2.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_faceidentify/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceFaceidentifyForPath("../../img/face_detectface.jpg", "person0") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_faceshape/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceFaceshapeForPath("../../img/face_detectface.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_faceverify/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceFaceverifyForPath("../../img/face_detectface.jpg", "id1") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_getfaceids/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceGetfaceidsAllForPersonId("id1") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_getfaceinfo/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceGetfaceinfoForFaceId("2682445032220326258") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_getgroupids/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceGetgroupidsAll() 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_getinfo/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceGetinfoForPersonId("id1") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_getpersonids/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceGetpersonidsAllForGroupId("group1") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_newperson/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceNewpersonForPath("movie", "BingbingFan", "/Users/zuo/Desktop/ff/4.jpg", "范冰冰", "演员") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/face/face_setinfo/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.FaceSetinfoForPersonId("id1", "时光", "new tag") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/image/image_food/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.ImageFoodForPath("../../img/image_terrorism.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/image/image_fuzzy/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.ImageFuzzyForPath("../../img/image_terrorism.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/image/image_tag/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.ImageTagForPath("../../img/image_terrorism.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/image/image_terrorism/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.ImageTerrorismForPath("../../img/image_terrorism.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/img_url.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | "os" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | txAi.SetDebug(false) 17 | img, err := txAi.URLToBase64("https://yyb.gtimg.com/aiplat/static/ai-demo/large/odemo-pic-2.jpg") 18 | if err != nil { 19 | log.Println(err) 20 | os.Exit(1) 21 | } 22 | txAi.SetDebug(true) 23 | val, err := txAi.OcrBcocrForBase64(img) 24 | if err != nil { 25 | log.Println(err) 26 | os.Exit(1) 27 | } 28 | js, _ := json.Marshal(val) 29 | log.Println(string(js)) 30 | } 31 | -------------------------------------------------------------------------------- /demo/nlp/base_word/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | var ( 11 | txAi *txai.TxAi 12 | ) 13 | 14 | func main() { 15 | // 系统日志显示文件和行号 16 | log.SetFlags(log.Lshortfile | log.LstdFlags) 17 | 18 | txAi = txai.New("appid", "appkey", false) 19 | 20 | wordseg() // 分词 21 | wordpos() // 词性标注 22 | wordner() // 专有名词识别 23 | wordsyn() // 同义词识别 24 | } 25 | 26 | func wordseg() { 27 | val, err := txAi.NlpWordsegForText("腾讯人工智能") 28 | log.Println(err) 29 | js, _ := json.Marshal(val) 30 | log.Println(string(js)) 31 | } 32 | 33 | func wordpos() { 34 | val, err := txAi.NlpWordposForText("腾讯人工智能") 35 | log.Println(err) 36 | js, _ := json.Marshal(val) 37 | log.Println(string(js)) 38 | } 39 | 40 | func wordner() { 41 | val, err := txAi.NlpWordnerForText("最近张学友在深圳开了一场演唱会") 42 | log.Println(err) 43 | js, _ := json.Marshal(val) 44 | log.Println(string(js)) 45 | } 46 | 47 | func wordsyn() { 48 | val, err := txAi.NlpWordsynForText("今天的天气怎么样") 49 | log.Println(err) 50 | js, _ := json.Marshal(val) 51 | log.Println(string(js)) 52 | } 53 | -------------------------------------------------------------------------------- /demo/nlp/nlp_imagetranslate/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.NlpImagetranslateForPath("../../img/nlp_imagetranslate.jpg", "110", txai.SceneDoc, txai.En, txai.Zh) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_speechtranslate/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.NlpSpeechtranslateForPath("../../img/wxasrs.mp3", "110", txai.AudioMP3, 0, 1, txai.Zh, txai.En) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_textchat/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", false) 15 | val, err := txAi.NlpTextchatForText("110", "今天和明天的天气怎么样?") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_textdetect/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", false) 15 | val, err := txAi.NlpTextdetectForText("今天和明天的天气怎么样?", true, txai.Zh, txai.En) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_textpolar/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", false) 15 | val, err := txAi.NlpTextpolarForText("今天和明天的天气怎么样?") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_texttrans/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.NlpTexttransForText("今天和明天的天气怎么样?", txai.LangZhToEn) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_texttranslate/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.NlpTexttranslateForText("今天和明天的天气怎么样?", txai.Zh, txai.En) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/nlp/nlp_wordcom/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", false) 15 | val, err := txAi.NlpWordcomForText("今天和明天的天气怎么样?") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_bcocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrBcocrForPath("../../img/ocr_bcocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_bizlicenseocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrBizlicenseocrForPath("../../img/ocr_bizlicenseocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_creditcardocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrCreditcardocrForPath("../../img/ocr_creditcardocr.jpeg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_driverlicenseocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrDriverlicenseocrForPath(0, "../../img/ocr_driverlicenseocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_generalocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrGeneralocrForPath("../../img/ocr_generalocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_handwritingocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrHandwritingocrForPath("../../img/ocr_handwritingocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ocr/ocr_idcardocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | 6 | "github.com/shiguanghuxian/txai" 7 | ) 8 | 9 | func main() { 10 | // 系统日志显示文件和行号 11 | log.SetFlags(log.Lshortfile | log.LstdFlags) 12 | 13 | txAi := txai.New("appid", "appkey", true) 14 | val, err := txAi.OcrIdcardocrForPath(0, "../../img/id_test.jpg") 15 | log.Println(err) 16 | // js, _ := json.Marshal(val) 17 | // log.Println(string(js)) 18 | log.Println("姓名:", val.Data.Name, "身份证号:", val.Data.Id) 19 | 20 | } 21 | -------------------------------------------------------------------------------- /demo/ocr/ocr_plateocr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.OcrPlateocrForPath("../../img/ocr_plateocr.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/ptu/ptu_faceage/abc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiguanghuxian/txai/4f652da4f7d7071e1b9ce2795276768e258bec46/demo/ptu/ptu_faceage/abc.jpg -------------------------------------------------------------------------------- /demo/ptu/ptu_faceage/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuFaceageForPath("../../img/face_detectface.jpg") 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/ptu/ptu_facecosmetic/abc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiguanghuxian/txai/4f652da4f7d7071e1b9ce2795276768e258bec46/demo/ptu/ptu_facecosmetic/abc.jpg -------------------------------------------------------------------------------- /demo/ptu/ptu_facecosmetic/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuFacecosmeticForPath("../../img/face_detectface.jpg", 23) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/ptu/ptu_facedecoration/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuFacedecorationForPath("../../img/face_detectface.jpg", 9) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/ptu/ptu_facemerge/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuFacemergeForPath("../../img/face_detectface.jpg", 42) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/ptu/ptu_facesticker/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuFacestickerForPath("../../img/face_detectface.jpg", 3) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/ptu/ptu_imgfilter/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.PtuImgfilterForPath("../../img/face_detectface.jpg", 31) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/vision/vision_imgfilter/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/shiguanghuxian/txai" 9 | ) 10 | 11 | func main() { 12 | // 系统日志显示文件和行号 13 | log.SetFlags(log.Lshortfile | log.LstdFlags) 14 | 15 | txAi := txai.New("appid", "appkey", true) 16 | val, err := txAi.VisionImgfilterForPath("../../img/face_detectface.jpg", "110", 31) 17 | log.Println(err) 18 | ioutil.WriteFile("abc.jpg", val.Data.Image, 0655) 19 | js, _ := json.Marshal(val) 20 | log.Println(string(js)) 21 | } 22 | -------------------------------------------------------------------------------- /demo/vision/vision_imgtotext/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.VisionImgtotextForPath("../../img/vision_porn.jpg", "110") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/vision/vision_objectr/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.VisionObjectrForPath("../../img/vision_porn.jpg", 1, 5) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/vision/vision_porn/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.VisionPornForPath("../../img/vision_porn.jpg") 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /demo/vision/vision_scener/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | 7 | "github.com/shiguanghuxian/txai" 8 | ) 9 | 10 | func main() { 11 | // 系统日志显示文件和行号 12 | log.SetFlags(log.Lshortfile | log.LstdFlags) 13 | 14 | txAi := txai.New("appid", "appkey", true) 15 | val, err := txAi.VisionScenerForPath("../../img/vision_porn.jpg", 1, 5) 16 | log.Println(err) 17 | js, _ := json.Marshal(val) 18 | log.Println(string(js)) 19 | } 20 | -------------------------------------------------------------------------------- /errors.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "errors" 4 | 5 | var Errors = map[int]error{ 6 | -2147483635: errors.New("系统繁忙,请稍后再试"), 7 | -1: errors.New("请求错误"), 8 | 9: errors.New("qps超过限制 用户认证升级或者降低调用频率"), 9 | 4096: errors.New("参数非法,请检查请求参数是否符合要求"), 10 | 12289: errors.New("应用不存在,请检查app_id是否有效的应用标识(AppId)"), 11 | 12801: errors.New("素材不存在,请检查app_id对应的素材模版id"), 12 | 12802: errors.New("素材ID与应用ID不匹配,请检查app_id对应的素材模版id"), 13 | 16385: errors.New("缺少app_id参数,请检查请求中是否包含有效的app_id参数"), 14 | 16386: errors.New("缺少time_stamp参数,请检查请求中是否包含有效的time_stamp参数"), 15 | 16387: errors.New("缺少nonce_str参数,请检查请求中是否包含有效的nonce_str参数"), 16 | 16388: errors.New("请求签名无效,请检查请求中的签名信息(sign)是否有效"), 17 | 16389: errors.New("缺失API权限,请检查应用是否勾选当前API所属接口的权限"), 18 | 16390: errors.New("time_stamp参数无效,请检查time_stamp距离当前时间是否超过5分钟"), 19 | 16391: errors.New("同义词识别结果为空,系统识别结果为空"), 20 | 16392: errors.New("专有名词识别结果为空,系统识别结果为空"), 21 | 16393: errors.New("意图识别结果为空,系统识别结果为空"), 22 | 16394: errors.New("闲聊返回结果为空,系统处理结果为空"), 23 | 16396: errors.New("图片格式非法,请检查图片格式是否符合API要求"), 24 | 16397: errors.New("图片体积过大,请检查图片大小是否超过API限制"), 25 | 16402: errors.New("图片没有人脸,请检查图片是否包含人脸"), 26 | 16403: errors.New("相似度错误,请联系客服反馈问题"), 27 | 16404: errors.New("人脸检测失败,请联系客服反馈问题"), 28 | 16405: errors.New("图片解码失败,请联系客服反馈问题"), 29 | 16406: errors.New("特征处理失败,请联系客服反馈问题"), 30 | 16407: errors.New("提取轮廓错误,请联系客服反馈问题"), 31 | 16408: errors.New("提取性别错误,请联系客服反馈问题"), 32 | 16409: errors.New("提取表情错误,请联系客服反馈问题"), 33 | 16410: errors.New("提取年龄错误,请联系客服反馈问题"), 34 | 16411: errors.New("提取姿态错误,请联系客服反馈问题"), 35 | 16412: errors.New("提取眼镜错误,请联系客服反馈问题"), 36 | 16413: errors.New("提取魅力值错误,请联系客服反馈问题"), 37 | 16414: errors.New("语音合成失败,请联系客服反馈问题"), 38 | 16415: errors.New("图片为空,请检查图片是否正常"), 39 | 16416: errors.New("个体已存在,请检查个体是否已存在"), 40 | 16417: errors.New("个体不存在,请检查个体是否不存在"), 41 | 16418: errors.New("人脸不存在,请检查人脸是否不存在"), 42 | 16419: errors.New("分组不存在,请检查分组是否不存在"), 43 | 16420: errors.New("分组列表不存在,请检查分组列表是否不存在"), 44 | 16421: errors.New("人脸个数超过限制,请检查是否超过系统限制"), 45 | 16422: errors.New("个体个数超过限制,请检查是否超过系统限制"), 46 | 16423: errors.New("组个数超过限制,请检查是否超过系统限制"), 47 | 16424: errors.New("对个体添加了几乎相同的人脸,请检查个体已添加的人脸"), 48 | 16425: errors.New("无效的图片格式,请检查图片格式是否符号API要求"), 49 | 16426: errors.New("图片模糊度检测失败,请联系客服反馈问题"), 50 | 16427: errors.New("美食图片检测失败,请联系客服反馈问题"), 51 | 16428: errors.New("提取图像指纹失败,请联系客服反馈问题"), 52 | 16429: errors.New("图像特征比对失败,请联系客服反馈问题"), 53 | 16430: errors.New("OCR照片为空,请检查待处理图片是否为空"), 54 | 16431: errors.New("OCR识别失败,请联系客服反馈问题"), 55 | 16432: errors.New("输入图片不是身份证,请检查图片是否为身份证"), 56 | 16433: errors.New("名片无足够文本,请检查名片是否正常"), 57 | 16434: errors.New("名片文本行倾斜角度太大,请检查名片是否正常"), 58 | 16435: errors.New("名片模糊,请检查名片是否正常"), 59 | 16436: errors.New("名片姓名识别失败,请联系客服反馈问题"), 60 | 16437: errors.New("名片电话识别失败,请联系客服反馈问题"), 61 | 16438: errors.New("图像为非名片图像,请检查图片是否为名片"), 62 | 16439: errors.New("检测或者识别失败,请联系客服反馈问题"), 63 | 16440: errors.New("未检测到身份证,请对准边框(避免拍摄时倾角和旋转角过大、摄像头)"), 64 | 16441: errors.New("请使用第二代身份证件进行扫描,请使用第二代身份证进行处理"), 65 | 16442: errors.New("不是身份证正面照片,请使用带证件照的一面进行处理"), 66 | 16443: errors.New("不是身份证反面照片,请使用身份证反面进行进行处理"), 67 | 16444: errors.New("证件图片模糊,请确保证件图片清晰"), 68 | 16445: errors.New("请避开灯光直射在证件表面,请避开灯光直射在证件表面"), 69 | 16446: errors.New("行驾驶证OCR识别失败,请联系客服反馈问题"), 70 | 16447: errors.New("通用OCR识别失败,请联系客服反馈问题"), 71 | 16448: errors.New("银行卡OCR预处理错误,请联系客服反馈问题"), 72 | 16449: errors.New("银行卡OCR识别失败,请联系客服反馈问题"), 73 | 16450: errors.New("营业执照OCR预处理失败,请联系客服反馈问题"), 74 | 16451: errors.New("营业执照OCR识别失败,请联系客服反馈问题"), 75 | 16452: errors.New("意图识别超时,请联系客服反馈问题"), 76 | 16453: errors.New("闲聊处理超时,请联系客服反馈问题"), 77 | 16454: errors.New("语音识别解码失败,请检查语音参数是否正确编码"), 78 | 16455: errors.New("语音过长或空,请检查语音参数是否正确编码或者长度是否合法"), 79 | 16456: errors.New("翻译引擎失败,请联系客服反馈问题"), 80 | 16457: errors.New("不支持的翻译类型,请检查翻译类型参数是否合法"), 81 | 16460: errors.New("输入图片与识别场景不匹配,请检查场景参数是否正确,所传图片与场景是否匹配"), 82 | 16461: errors.New("识别结果为空,当前图片无法匹配已收录的标签,请尝试更换图片"), 83 | 16462: errors.New("多人脸检测识别结果为空 图片中识别不出人脸,请尝试更换图片"), 84 | 16467: errors.New("跨年龄人脸识别出错 请尝试更换有人脸的图片"), 85 | 16468: errors.New("跨年龄人脸识别结果为空 源图片与目标图片中识别不出匹配的人脸,请尝试更换图片"), 86 | 16472: errors.New("音频鉴黄识别出错 请确保音频地址能正常下载音频,尝试更换音频"), 87 | } 88 | 89 | // GetError 根据错代码获取错误 90 | func GetError(ret int) error { 91 | if err, ok := Errors[ret]; ok == true { 92 | return err 93 | } 94 | return nil 95 | } 96 | -------------------------------------------------------------------------------- /face_addface.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "errors" 6 | "io/ioutil" 7 | "strings" 8 | ) 9 | 10 | var ( 11 | faceAddfaceURI = "/face/face_addface" 12 | ) 13 | 14 | // FaceAddfaceForBase64 增加人脸 - 图片为base64格式 15 | // image 图片base64后字符串 16 | // personId 指定的个体(Person)ID 17 | // tag 备注信息 18 | func (ai *TxAi) FaceAddfaceForBase64(images, personId, tag string) (*FaceAddfaceResponse, error) { 19 | if personId == "" { 20 | return nil, errors.New("personId can't be empty") 21 | } 22 | params := ai.getPublicParams() 23 | params.Add("images", images) 24 | params.Add("person_id", personId) 25 | params.Add("tag", tag) 26 | sign := ai.getReqSign(params) 27 | params.Add("sign", sign) 28 | // 响应结果 29 | faceAddfaceResponse := new(FaceAddfaceResponse) 30 | err := ai.RequestAPI(faceAddfaceURI, params, faceAddfaceResponse) 31 | if err != nil { 32 | return nil, err 33 | } 34 | return faceAddfaceResponse, nil 35 | } 36 | 37 | // FaceAddfaceForPath 增加人脸 - 图片为本地路径 38 | // imagePath 本地图片路径 39 | // personId 指定的个体(Person)ID 40 | // tag 备注信息 41 | func (ai *TxAi) FaceAddfaceForPath(imagePath, personId, tag string) (*FaceAddfaceResponse, error) { 42 | body, err := ioutil.ReadFile(imagePath) 43 | if err != nil { 44 | return nil, err 45 | } 46 | img := base64.StdEncoding.EncodeToString(body) 47 | return ai.FaceAddfaceForBase64(img, personId, tag) 48 | } 49 | 50 | // FaceAddMultiplefaceForPath 增加人脸 - 图片为本地路径 51 | // imagePath 本地图片路径 52 | // personId 指定的个体(Person)ID 53 | // tag 备注信息 54 | func (ai *TxAi) FaceAddMultiplefaceForPath(personId, tag string, imagePaths ...string) (*FaceAddfaceResponse, error) { 55 | imgs := make([]string, 0) 56 | for _, imagePath := range imagePaths { 57 | body, err := ioutil.ReadFile(imagePath) 58 | if err != nil { 59 | return nil, err 60 | } 61 | img := base64.StdEncoding.EncodeToString(body) 62 | imgs = append(imgs, img) 63 | } 64 | 65 | return ai.FaceAddfaceForBase64(strings.Join(imgs, "|"), personId, tag) 66 | } 67 | -------------------------------------------------------------------------------- /face_delface.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "errors" 5 | "strings" 6 | ) 7 | 8 | var ( 9 | faceDelfaceURI = "/face/face_delface" 10 | ) 11 | 12 | // FaceDelfaceForPersonId 获取信息 13 | // personId 指定的个体(Person)ID 14 | // faceIds 需要删除的人脸(Face)ID(多个之间用"|") 15 | func (ai *TxAi) FaceDelfaceForPersonId(personId string, faceIds ...string) (*FaceDelfaceResponse, error) { 16 | if personId == "" { 17 | return nil, errors.New("personId can't be empty") 18 | } 19 | if len(faceIds) == 0 { 20 | return nil, errors.New("faceIds can't be empty") 21 | } 22 | params := ai.getPublicParams() 23 | params.Add("person_id", personId) 24 | params.Add("face_ids", strings.Join(faceIds, "|")) 25 | sign := ai.getReqSign(params) 26 | params.Add("sign", sign) 27 | // 响应结果 28 | faceDelfaceResponse := new(FaceDelfaceResponse) 29 | err := ai.RequestAPI(faceDelfaceURI, params, faceDelfaceResponse) 30 | if err != nil { 31 | return nil, err 32 | } 33 | return faceDelfaceResponse, nil 34 | } 35 | -------------------------------------------------------------------------------- /face_delperson.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var ( 4 | faceDelpersonURI = "/face/face_delperson" 5 | ) 6 | 7 | // FaceDelpersonForPersonId 删除个体 8 | // personId 需要删除的个体(Person)ID 9 | func (ai *TxAi) FaceDelpersonForPersonId(personId string) (*FaceDelpersonResponse, error) { 10 | params := ai.getPublicParams() 11 | params.Add("person_id", personId) 12 | sign := ai.getReqSign(params) 13 | params.Add("sign", sign) 14 | // 响应结果 15 | faceDelpersonResponse := new(FaceDelpersonResponse) 16 | err := ai.RequestAPI(faceDelpersonURI, params, faceDelpersonResponse) 17 | if err != nil { 18 | return nil, err 19 | } 20 | return faceDelpersonResponse, nil 21 | } 22 | -------------------------------------------------------------------------------- /face_detectcrossageface.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | faceDetectcrossagefaceURI = "/face/face_detectcrossageface" 10 | ) 11 | 12 | // FaceDetectcrossagefaceForBase64 跨年龄人脸识别 - 图片为base64格式 13 | // sourceImage 待比较图片 14 | // targetImage 待比较图片 15 | func (ai *TxAi) FaceDetectcrossagefaceForBase64(sourceImage, targetImage string) (*FaceDetectcrossagefaceResponse, error) { 16 | params := ai.getPublicParams() 17 | params.Add("source_image", sourceImage) 18 | params.Add("target_image", targetImage) 19 | sign := ai.getReqSign(params) 20 | params.Add("sign", sign) 21 | // 响应结果 22 | faceDetectcrossagefaceResponse := new(FaceDetectcrossagefaceResponse) 23 | err := ai.RequestAPI(faceDetectcrossagefaceURI, params, faceDetectcrossagefaceResponse) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return faceDetectcrossagefaceResponse, nil 28 | } 29 | 30 | // FaceDetectcrossagefaceForPath 跨年龄人脸识别 - 图片为本地路径 31 | // sourceImage 待比较图片 32 | // targetImage 待比较图片 33 | func (ai *TxAi) FaceDetectcrossagefaceForPath(sourceImagePath, targetImagePath string) (*FaceDetectcrossagefaceResponse, error) { 34 | // 图片1 35 | bodyA, err := ioutil.ReadFile(sourceImagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | imgA := base64.StdEncoding.EncodeToString(bodyA) 40 | // 图片2 41 | bodyB, err := ioutil.ReadFile(targetImagePath) 42 | if err != nil { 43 | return nil, err 44 | } 45 | imgB := base64.StdEncoding.EncodeToString(bodyB) 46 | return ai.FaceDetectcrossagefaceForBase64(imgA, imgB) 47 | } 48 | -------------------------------------------------------------------------------- /face_detectface.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | faceDetectfaceURI = "/face/face_detectface" 11 | ) 12 | 13 | // FaceDetectfaceForBase64 人脸检测与分析 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // modes 检测模式,0-正常,1-大脸模式(默认1) 16 | func (ai *TxAi) FaceDetectfaceForBase64(image string, modes ...int) (*FaceDetectfaceResponse, error) { 17 | mode := 1 18 | if len(modes) > 0 { 19 | mode = modes[0] 20 | } 21 | params := ai.getPublicParams() 22 | params.Add("image", image) 23 | params.Add("mode", fmt.Sprint(mode)) 24 | sign := ai.getReqSign(params) 25 | params.Add("sign", sign) 26 | // 响应结果 27 | faceDetectfaceResponseResponse := new(FaceDetectfaceResponse) 28 | err := ai.RequestAPI(faceDetectfaceURI, params, faceDetectfaceResponseResponse) 29 | if err != nil { 30 | return nil, err 31 | } 32 | return faceDetectfaceResponseResponse, nil 33 | } 34 | 35 | // FaceDetectfaceForPath 人脸检测与分析 - 图片为本地路径 36 | // imagePath 本地图片路径 37 | // modes 检测模式,0-正常,1-大脸模式(默认1) 38 | func (ai *TxAi) FaceDetectfaceForPath(imagePath string, modes ...int) (*FaceDetectfaceResponse, error) { 39 | mode := 1 40 | if len(modes) > 0 { 41 | mode = modes[0] 42 | } 43 | body, err := ioutil.ReadFile(imagePath) 44 | if err != nil { 45 | return nil, err 46 | } 47 | img := base64.StdEncoding.EncodeToString(body) 48 | return ai.FaceDetectfaceForBase64(img, mode) 49 | } 50 | -------------------------------------------------------------------------------- /face_detectmultiface.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | faceDetectmultifaceURI = "/face/face_detectmultiface" 10 | ) 11 | 12 | // FaceDetectmultifaceForBase64 多人脸检测 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) FaceDetectmultifaceForBase64(image string) (*FaceDetectmultifaceResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | faceDetectmultifaceResponse := new(FaceDetectmultifaceResponse) 21 | err := ai.RequestAPI(faceDetectmultifaceURI, params, faceDetectmultifaceResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return faceDetectmultifaceResponse, nil 26 | } 27 | 28 | // FaceDetectmultifaceForPath 多人脸检测 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) FaceDetectmultifaceForPath(imagePath string) (*FaceDetectmultifaceResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.FaceDetectmultifaceForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /face_facecompare.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | faceFacecompareURI = "/face/face_facecompare" 10 | ) 11 | 12 | // FaceFacecompareForBase64 人脸对比 - 图片为base64格式 13 | // imageA 待对比人脸图片A 14 | // imageB 待对比人脸图片B 15 | func (ai *TxAi) FaceFacecompareForBase64(imageA, imageB string) (*FaceFacecompareResponse, error) { 16 | params := ai.getPublicParams() 17 | params.Add("image_a", imageA) 18 | params.Add("image_b", imageB) 19 | sign := ai.getReqSign(params) 20 | params.Add("sign", sign) 21 | // 响应结果 22 | faceFacecompareResponse := new(FaceFacecompareResponse) 23 | err := ai.RequestAPI(faceFacecompareURI, params, faceFacecompareResponse) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return faceFacecompareResponse, nil 28 | } 29 | 30 | // FaceFacecompareForPath 人脸对比 - 图片为本地路径 31 | // imageAPath 待对比人脸图片A 32 | // imageBPath 待对比人脸图片B 33 | func (ai *TxAi) FaceFacecompareForPath(imageAPath, imageBPath string) (*FaceFacecompareResponse, error) { 34 | // 图片1 35 | bodyA, err := ioutil.ReadFile(imageAPath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | imgA := base64.StdEncoding.EncodeToString(bodyA) 40 | // 图片2 41 | bodyB, err := ioutil.ReadFile(imageBPath) 42 | if err != nil { 43 | return nil, err 44 | } 45 | imgB := base64.StdEncoding.EncodeToString(bodyB) 46 | return ai.FaceFacecompareForBase64(imgA, imgB) 47 | } 48 | -------------------------------------------------------------------------------- /face_faceidentify.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | faceFaceidentifyURI = "/face/face_faceidentify" 11 | ) 12 | 13 | // FaceFaceidentifyForBase64 人脸识别 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // groupId 候选人组ID(个体创建时设定) 16 | // topns 返回的候选人个数(默认9个) 17 | func (ai *TxAi) FaceFaceidentifyForBase64(image string, groupId string, topns ...int) (*FaceFaceidentifyResponse, error) { 18 | topn := 9 19 | if len(topns) > 0 { 20 | if topns[0] > 0 && topns[0] < 11 { 21 | topn = topns[0] 22 | } 23 | } 24 | params := ai.getPublicParams() 25 | params.Add("image", image) 26 | params.Add("group_id", groupId) 27 | params.Add("topn", fmt.Sprint(topn)) 28 | sign := ai.getReqSign(params) 29 | params.Add("sign", sign) 30 | // 响应结果 31 | faceFaceidentifyResponse := new(FaceFaceidentifyResponse) 32 | err := ai.RequestAPI(faceFaceidentifyURI, params, faceFaceidentifyResponse) 33 | if err != nil { 34 | return nil, err 35 | } 36 | return faceFaceidentifyResponse, nil 37 | } 38 | 39 | // FaceFaceidentifyForPath 人脸识别 - 图片为本地路径 40 | // imagePath 本地图片路径 41 | // groupId 候选人组ID(个体创建时设定) 42 | // topns 返回的候选人个数(默认9个) 43 | func (ai *TxAi) FaceFaceidentifyForPath(imagePath string, groupId string, topns ...int) (*FaceFaceidentifyResponse, error) { 44 | body, err := ioutil.ReadFile(imagePath) 45 | if err != nil { 46 | return nil, err 47 | } 48 | img := base64.StdEncoding.EncodeToString(body) 49 | return ai.FaceFaceidentifyForBase64(img, groupId, topns...) 50 | } 51 | -------------------------------------------------------------------------------- /face_faceshape.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | faceFaceshapeURI = "/face/face_faceshape" 11 | ) 12 | 13 | // FaceFaceshapeForBase64 五官定位 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // modes 检测模式,0-正常,1-大脸模式(默认1) 16 | func (ai *TxAi) FaceFaceshapeForBase64(image string, modes ...int) (*FaceFaceshapeResponse, error) { 17 | mode := 1 18 | if len(modes) > 0 { 19 | mode = modes[0] 20 | } 21 | params := ai.getPublicParams() 22 | params.Add("image", image) 23 | params.Add("mode", fmt.Sprint(mode)) 24 | sign := ai.getReqSign(params) 25 | params.Add("sign", sign) 26 | // 响应结果 27 | faceFaceshapeResponse := new(FaceFaceshapeResponse) 28 | err := ai.RequestAPI(faceFaceshapeURI, params, faceFaceshapeResponse) 29 | if err != nil { 30 | return nil, err 31 | } 32 | return faceFaceshapeResponse, nil 33 | } 34 | 35 | // FaceFaceshapeForPath 五官定位 - 图片为本地路径 36 | // imagePath 本地图片路径 37 | // modes 检测模式,0-正常,1-大脸模式(默认1) 38 | func (ai *TxAi) FaceFaceshapeForPath(imagePath string, modes ...int) (*FaceFaceshapeResponse, error) { 39 | mode := 1 40 | if len(modes) > 0 { 41 | mode = modes[0] 42 | } 43 | body, err := ioutil.ReadFile(imagePath) 44 | if err != nil { 45 | return nil, err 46 | } 47 | img := base64.StdEncoding.EncodeToString(body) 48 | return ai.FaceFaceshapeForBase64(img, mode) 49 | } 50 | -------------------------------------------------------------------------------- /face_faceverify.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | faceFaceverifyURI = "/face/face_faceverify" 10 | ) 11 | 12 | // FaceFaceverifyForBase64 人脸验证 - 图片为base64格式 13 | // image 图片base64后字符串 14 | // personId 待验证的个体(Person)ID 15 | func (ai *TxAi) FaceFaceverifyForBase64(image, personId string) (*FaceFaceverifyResponse, error) { 16 | params := ai.getPublicParams() 17 | params.Add("image", image) 18 | params.Add("person_id", personId) 19 | sign := ai.getReqSign(params) 20 | params.Add("sign", sign) 21 | // 响应结果 22 | faceFaceverifyResponse := new(FaceFaceverifyResponse) 23 | err := ai.RequestAPI(faceFaceverifyURI, params, faceFaceverifyResponse) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return faceFaceverifyResponse, nil 28 | } 29 | 30 | // FaceFaceverifyForPath 人脸验证 - 图片为本地路径 31 | // imagePath 本地图片路径 32 | // personId 待验证的个体(Person)ID 33 | func (ai *TxAi) FaceFaceverifyForPath(imagePath, personId string) (*FaceFaceverifyResponse, error) { 34 | body, err := ioutil.ReadFile(imagePath) 35 | if err != nil { 36 | return nil, err 37 | } 38 | img := base64.StdEncoding.EncodeToString(body) 39 | return ai.FaceFaceverifyForBase64(img, personId) 40 | } 41 | -------------------------------------------------------------------------------- /face_getfaceids.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "errors" 4 | 5 | var ( 6 | faceGetfaceidsURI = "/face/face_getfaceids" 7 | ) 8 | 9 | // FaceGetfaceidsAllForPersonId 获取人脸列表 - 根据个体(Person)ID 获取人脸(Face)ID列表 10 | func (ai *TxAi) FaceGetfaceidsAllForPersonId(personId string) (*FaceGetfaceidsResponse, error) { 11 | if personId == "" { 12 | return nil, errors.New("personId can't be empty") 13 | } 14 | params := ai.getPublicParams() 15 | params.Add("person_id", personId) 16 | sign := ai.getReqSign(params) 17 | params.Add("sign", sign) 18 | // 响应结果 19 | faceGetfaceidsResponse := new(FaceGetfaceidsResponse) 20 | err := ai.RequestAPI(faceGetfaceidsURI, params, faceGetfaceidsResponse) 21 | if err != nil { 22 | return nil, err 23 | } 24 | return faceGetfaceidsResponse, nil 25 | } 26 | -------------------------------------------------------------------------------- /face_getfaceinfo.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "errors" 4 | 5 | var ( 6 | faceGetfaceinfoURI = "/face/face_getfaceinfo" 7 | ) 8 | 9 | // FaceGetfaceinfoForFaceId 获取人脸信息 - 根据人脸(Face)ID 获取人脸(Face)信息 10 | func (ai *TxAi) FaceGetfaceinfoForFaceId(faceId string) (*FaceGetfaceinfoResponse, error) { 11 | if faceId == "" { 12 | return nil, errors.New("faceId can't be empty") 13 | } 14 | params := ai.getPublicParams() 15 | params.Add("face_id", faceId) 16 | sign := ai.getReqSign(params) 17 | params.Add("sign", sign) 18 | // 响应结果 19 | faceGetfaceinfoResponse := new(FaceGetfaceinfoResponse) 20 | err := ai.RequestAPI(faceGetfaceinfoURI, params, faceGetfaceinfoResponse) 21 | if err != nil { 22 | return nil, err 23 | } 24 | return faceGetfaceinfoResponse, nil 25 | } 26 | -------------------------------------------------------------------------------- /face_getgroupids.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var ( 4 | faceGetgroupidsURI = "/face/face_getgroupids" 5 | ) 6 | 7 | // FaceGetgroupidsAll 获取组列表 - 获取应用下所有的组(Group)ID列表 8 | func (ai *TxAi) FaceGetgroupidsAll() (*FaceGetgroupidsResponse, error) { 9 | params := ai.getPublicParams() 10 | sign := ai.getReqSign(params) 11 | params.Add("sign", sign) 12 | // 响应结果 13 | faceGetgroupidsResponse := new(FaceGetgroupidsResponse) 14 | err := ai.RequestAPI(faceGetgroupidsURI, params, faceGetgroupidsResponse) 15 | if err != nil { 16 | return nil, err 17 | } 18 | return faceGetgroupidsResponse, nil 19 | } 20 | -------------------------------------------------------------------------------- /face_getinfo.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "errors" 5 | ) 6 | 7 | var ( 8 | faceGetinfoURI = "/face/face_getinfo" 9 | ) 10 | 11 | // FaceGetinfoForPersonId 增加人脸 12 | // personId 指定的个体(Person)ID 13 | func (ai *TxAi) FaceGetinfoForPersonId(personId string) (*FaceGetinfoResponse, error) { 14 | if personId == "" { 15 | return nil, errors.New("personId can't be empty") 16 | } 17 | params := ai.getPublicParams() 18 | params.Add("person_id", personId) 19 | sign := ai.getReqSign(params) 20 | params.Add("sign", sign) 21 | // 响应结果 22 | faceGetinfoResponse := new(FaceGetinfoResponse) 23 | err := ai.RequestAPI(faceGetinfoURI, params, faceGetinfoResponse) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return faceGetinfoResponse, nil 28 | } 29 | -------------------------------------------------------------------------------- /face_getpersonids.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "errors" 4 | 5 | var ( 6 | faceGetpersonidsURI = "/face/face_getpersonids" 7 | ) 8 | 9 | // FaceGetpersonidsAllForGroupId 获取个体列表 - 获取一个组(Group)中的所有个体(Person)ID 10 | func (ai *TxAi) FaceGetpersonidsAllForGroupId(groupId string) (*FaceGetpersonidsResponse, error) { 11 | if groupId == "" { 12 | return nil, errors.New("groupId can't be empty") 13 | } 14 | params := ai.getPublicParams() 15 | params.Add("group_id", groupId) 16 | sign := ai.getReqSign(params) 17 | params.Add("sign", sign) 18 | // 响应结果 19 | faceGetpersonidsResponse := new(FaceGetpersonidsResponse) 20 | err := ai.RequestAPI(faceGetpersonidsURI, params, faceGetpersonidsResponse) 21 | if err != nil { 22 | return nil, err 23 | } 24 | return faceGetpersonidsResponse, nil 25 | } 26 | -------------------------------------------------------------------------------- /face_newperson.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "errors" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | faceNewpersonURI = "/face/face_newperson" 11 | ) 12 | 13 | // FaceNewpersonForBase64 个体创建 - 图片为base64格式 14 | // groupIds 个体组,可以用|分开多个组 15 | // personId 指定的个体(Person)ID 16 | // image 图片base64后字符串 17 | // personName 个体名称 18 | // tags 备注信息 19 | func (ai *TxAi) FaceNewpersonForBase64(groupIds, personId, image, personName string, tags ...string) (*FaceNewpersonResponse, error) { 20 | if groupIds == "" { 21 | return nil, errors.New("groupIds can't be empty") 22 | } 23 | if personId == "" { 24 | return nil, errors.New("personId can't be empty") 25 | } 26 | if personName == "" { 27 | return nil, errors.New("personName can't be empty") 28 | } 29 | tag := "" 30 | if len(tags) > 0 { 31 | tag = tags[0] 32 | } 33 | 34 | params := ai.getPublicParams() 35 | params.Add("group_ids", groupIds) 36 | params.Add("person_id", personId) 37 | params.Add("image", image) 38 | params.Add("person_name", personName) 39 | if tag != "" { 40 | params.Add("tag", tag) 41 | } 42 | sign := ai.getReqSign(params) 43 | params.Add("sign", sign) 44 | // 响应结果 45 | faceNewpersonResponse := new(FaceNewpersonResponse) 46 | err := ai.RequestAPI(faceNewpersonURI, params, faceNewpersonResponse) 47 | if err != nil { 48 | return nil, err 49 | } 50 | return faceNewpersonResponse, nil 51 | } 52 | 53 | // FaceNewpersonForPath 个体创建 - 图片为本地路径 54 | // groupIds 个体组,可以用|分开多个组 55 | // personId 指定的个体(Person)ID 56 | // imagePath 本地图片路径 57 | // personName 个体名称 58 | // tags 备注信息 59 | func (ai *TxAi) FaceNewpersonForPath(groupIds, personId, imagePath, personName string, tags ...string) (*FaceNewpersonResponse, error) { 60 | body, err := ioutil.ReadFile(imagePath) 61 | if err != nil { 62 | return nil, err 63 | } 64 | img := base64.StdEncoding.EncodeToString(body) 65 | return ai.FaceNewpersonForBase64(groupIds, personId, img, personName, tags...) 66 | } 67 | -------------------------------------------------------------------------------- /face_setinfo.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "errors" 5 | ) 6 | 7 | var ( 8 | faceSetinfoURI = "/face/face_setinfo" 9 | ) 10 | 11 | // FaceSetinfoForPersonId 设置信息 12 | // personId 指定的个体(Person)ID 13 | // personName 新的名字 14 | // tag 备注信息 15 | func (ai *TxAi) FaceSetinfoForPersonId(personId, personName, tag string) (*FaceSetinfoResponse, error) { 16 | if personId == "" { 17 | return nil, errors.New("personId can't be empty") 18 | } 19 | if personName == "" { 20 | return nil, errors.New("personName can't be empty") 21 | } 22 | if tag == "" { 23 | return nil, errors.New("tag can't be empty") 24 | } 25 | params := ai.getPublicParams() 26 | params.Add("person_id", personId) 27 | params.Add("person_name", personName) 28 | params.Add("tag", tag) 29 | sign := ai.getReqSign(params) 30 | params.Add("sign", sign) 31 | // 响应结果 32 | faceSetinfoResponse := new(FaceSetinfoResponse) 33 | err := ai.RequestAPI(faceSetinfoURI, params, faceSetinfoResponse) 34 | if err != nil { 35 | return nil, err 36 | } 37 | return faceSetinfoResponse, nil 38 | } 39 | -------------------------------------------------------------------------------- /image_food.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | imageFoodURI = "/image/image_food" 10 | ) 11 | 12 | // ImageFoodForBase64 美食图片识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) ImageFoodForBase64(image string) (*ImageFoodResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | imageFoodResponse := new(ImageFoodResponse) 21 | err := ai.RequestAPI(imageFoodURI, params, imageFoodResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return imageFoodResponse, nil 26 | } 27 | 28 | // ImageFoodForPath 美食图片识别 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) ImageFoodForPath(imagePath string) (*ImageFoodResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.ImageFoodForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /image_fuzzy.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | imageFuzzyURI = "/image/image_fuzzy" 10 | ) 11 | 12 | // ImageFuzzyForBase64 模糊图片检测 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) ImageFuzzyForBase64(image string) (*ImageFuzzyResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | imageFuzzyResponse := new(ImageFuzzyResponse) 21 | err := ai.RequestAPI(imageFuzzyURI, params, imageFuzzyResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return imageFuzzyResponse, nil 26 | } 27 | 28 | // ImageFuzzyForPath 模糊图片检测 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) ImageFuzzyForPath(imagePath string) (*ImageFuzzyResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.ImageFuzzyForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /image_tag.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | imageTagURI = "/image/image_tag" 10 | ) 11 | 12 | // ImageTagForBase64 图像标签识别 - 图片为base64格式 13 | // 识别一个图像的标签信息,对图像分类。 14 | // image 图片base64后字符串 15 | func (ai *TxAi) ImageTagForBase64(image string) (*ImageTagResponse, error) { 16 | params := ai.getPublicParams() 17 | params.Add("image", image) 18 | sign := ai.getReqSign(params) 19 | params.Add("sign", sign) 20 | // 响应结果 21 | imageTagResponse := new(ImageTagResponse) 22 | err := ai.RequestAPI(imageTagURI, params, imageTagResponse) 23 | if err != nil { 24 | return nil, err 25 | } 26 | return imageTagResponse, nil 27 | } 28 | 29 | // ImageTagForPath 图像标签识别 - 图片为本地路径 30 | // 识别一个图像的标签信息,对图像分类。 31 | // imagePath 本地图片路径 32 | func (ai *TxAi) ImageTagForPath(imagePath string) (*ImageTagResponse, error) { 33 | body, err := ioutil.ReadFile(imagePath) 34 | if err != nil { 35 | return nil, err 36 | } 37 | img := base64.StdEncoding.EncodeToString(body) 38 | return ai.ImageTagForBase64(img) 39 | } 40 | -------------------------------------------------------------------------------- /image_terrorism.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | imageTerrorismURI = "/image/image_terrorism" 10 | ) 11 | 12 | // ImageTerrorismForBase64 营业执照OCR识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) ImageTerrorismForBase64(image string) (*ImageTerrorismResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | imageTerrorism := new(ImageTerrorismResponse) 21 | err := ai.RequestAPI(imageTerrorismURI, params, imageTerrorism) 22 | if err != nil { 23 | return nil, err 24 | } 25 | // 各种属性赋值 26 | for _, v := range imageTerrorism.Data.TagList { 27 | switch v.TagName { 28 | case "terrorists": 29 | imageTerrorism.Terrorists = v.TagConfidence 30 | break 31 | case "knife": 32 | imageTerrorism.Knife = v.TagConfidence 33 | break 34 | case "guns": 35 | imageTerrorism.Guns = v.TagConfidence 36 | break 37 | case "blood": 38 | imageTerrorism.Blood = v.TagConfidence 39 | break 40 | case "fire": 41 | imageTerrorism.Fire = v.TagConfidence 42 | break 43 | case "flag": 44 | imageTerrorism.Flag = v.TagConfidence 45 | break 46 | case "crowd": 47 | imageTerrorism.Crowd = v.TagConfidence 48 | break 49 | case "other": 50 | imageTerrorism.Other = v.TagConfidence 51 | break 52 | } 53 | } 54 | return imageTerrorism, nil 55 | } 56 | 57 | // ImageTerrorismForPath 营业执照OCR识别 - 图片为本地路径 58 | // imagePath 本地图片路径 59 | func (ai *TxAi) ImageTerrorismForPath(imagePath string) (*ImageTerrorismResponse, error) { 60 | body, err := ioutil.ReadFile(imagePath) 61 | if err != nil { 62 | return nil, err 63 | } 64 | img := base64.StdEncoding.EncodeToString(body) 65 | return ai.ImageTerrorismForBase64(img) 66 | } 67 | -------------------------------------------------------------------------------- /model.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 使用到的模型 4 | 5 | // BaseResponseInterface 基础模型接口,用于统一请求使用 6 | type BaseResponseInterface interface { 7 | GetRet() int 8 | } 9 | 10 | // BaseResponse 基本响应结构 11 | type BaseResponse struct { 12 | Ret int `json:"ret"` 13 | Msg string `json:"msg"` 14 | } 15 | 16 | // GetRet 获取状态码 17 | func (resp *BaseResponse) GetRet() int { 18 | return resp.Ret 19 | } 20 | 21 | /* OCR */ 22 | 23 | // OcrIDCardResponse 身份证识别 24 | type OcrIDCardResponse struct { 25 | BaseResponse 26 | Data struct { 27 | Name string `json:"name"` 28 | Sex string `json:"sex"` 29 | Nation string `json:"nation"` 30 | Birth string `json:"birth"` 31 | Address string `json:"address"` 32 | Id string `json:"id"` 33 | Frontimage string `json:"frontimage"` 34 | Authority string `json:"authority"` 35 | ValidDate string `json:"valid_date"` 36 | Backimage string `json:"backimage"` 37 | } `json:"data"` 38 | } 39 | 40 | // OcrResponse OCR 通用响应结构 41 | type OcrResponse struct { 42 | BaseResponse 43 | Data struct { 44 | Angle string `json:"angle"` 45 | ItemList []ItemList `json:"item_list"` 46 | } `json:"data"` 47 | } 48 | 49 | // ItemList OCR 通用ItemList 50 | type ItemList struct { 51 | Item string `json:"item"` 52 | Itemstring string `json:"itemstring"` 53 | Itemcoord []struct { 54 | X int `json:"x"` 55 | Y int `json:"y"` 56 | Width int `json:"width"` 57 | Height int `json:"height"` 58 | } `json:"itemcoord"` 59 | Itemconf float64 `json:"itemconf,omitempty"` 60 | Words []struct { 61 | Character string `json:"character"` 62 | Confidence float64 `json:"confidence"` 63 | } `json:"words,omitempty"` 64 | } 65 | 66 | /* 智能鉴黄 */ 67 | 68 | // VisionPornResponse 智能鉴黄响应结构 69 | type VisionPornResponse struct { 70 | BaseResponse 71 | Level int // 图片级别 0正常、1性感、2色情 72 | Data struct { 73 | TagList []struct { 74 | TagConfidence int `json:"tag_confidence"` 75 | TagConfidenceF float64 `json:"tag_confidence_f"` 76 | TagName string `json:"tag_name"` 77 | } `json:"tag_list"` 78 | } `json:"data"` 79 | } 80 | 81 | // ImageTerrorismResponse 暴恐图片识别 82 | type ImageTerrorismResponse struct { 83 | BaseResponse 84 | Terrorists int // 恐怖分子 85 | Knife int // 刀 86 | Guns int // 枪支 87 | Blood int // 血液 88 | Fire int // 火 89 | Flag int // 旗帜 90 | Crowd int // 人群 91 | Other int // 其他 92 | Data struct { 93 | TagList []struct { 94 | TagConfidence int `json:"tag_confidence"` 95 | TagConfidenceF float64 `json:"tag_confidence_f"` 96 | TagName string `json:"tag_name"` 97 | } `json:"tag_list"` 98 | } `json:"data"` 99 | } 100 | 101 | // 人脸识别 102 | 103 | // FaceDetectfaceResponse 人脸检测与分析 104 | type FaceDetectfaceResponse struct { 105 | BaseResponse 106 | Data struct { 107 | ImageWidth int `json:"image_width"` 108 | ImageHeight int `json:"image_height"` 109 | FaceList []struct { 110 | FaceID string `json:"face_id"` 111 | X int `json:"x"` 112 | Y int `json:"y"` 113 | Width int `json:"width"` 114 | Height int `json:"height"` 115 | Gender int `json:"gender"` 116 | Age int `json:"age"` 117 | Expression int `json:"expression"` 118 | Beauty int `json:"beauty"` 119 | Glass int `json:"glass"` 120 | Pitch int `json:"pitch"` 121 | Yaw int64 `json:"yaw"` 122 | Roll int `json:"roll"` 123 | FaceShape struct { 124 | FaceProfile []struct { 125 | X int `json:"x"` 126 | Y int `json:"y"` 127 | } `json:"face_profile"` 128 | LeftEye []struct { 129 | X int `json:"x"` 130 | Y int `json:"y"` 131 | } `json:"left_eye"` 132 | RightEye []struct { 133 | X int `json:"x"` 134 | Y int `json:"y"` 135 | } `json:"right_eye"` 136 | LeftEyebrow []struct { 137 | X int `json:"x"` 138 | Y int `json:"y"` 139 | } `json:"left_eyebrow"` 140 | RightEyebrow []struct { 141 | X int `json:"x"` 142 | Y int `json:"y"` 143 | } `json:"right_eyebrow"` 144 | Mouth []struct { 145 | X int `json:"x"` 146 | Y int `json:"y"` 147 | } `json:"mouth"` 148 | Nose []struct { 149 | X int `json:"x"` 150 | Y int `json:"y"` 151 | } `json:"nose"` 152 | } `json:"face_shape"` 153 | } `json:"face_list"` 154 | } `json:"data"` 155 | } 156 | 157 | // FaceDetectmultifaceResponse 多人脸检测 158 | type FaceDetectmultifaceResponse struct { 159 | BaseResponse 160 | Data struct { 161 | FaceList []struct { 162 | X1 float64 `json:"x1"` 163 | Y1 float64 `json:"y1"` 164 | X2 float64 `json:"x2"` 165 | Y2 float64 `json:"y2"` 166 | } `json:"face_list"` 167 | } `json:"data"` 168 | } 169 | 170 | // FaceFacecompareResponse 人脸对比 171 | type FaceFacecompareResponse struct { 172 | BaseResponse 173 | Data struct { 174 | Similarity int `json:"similarity"` 175 | FailFlag int `json:"fail_flag"` 176 | } `json:"data"` 177 | } 178 | 179 | // FaceDetectcrossagefaceResponse 跨年龄人脸识别 180 | type FaceDetectcrossagefaceResponse struct { 181 | BaseResponse 182 | Data struct { 183 | SourceFace struct { 184 | X1 float64 `json:"x1"` 185 | Y1 float64 `json:"y1"` 186 | X2 float64 `json:"x2"` 187 | Y2 float64 `json:"y2"` 188 | } `json:"source_face"` 189 | TargetFace struct { 190 | X1 float64 `json:"x1"` 191 | Y1 float64 `json:"y1"` 192 | X2 float64 `json:"x2"` 193 | Y2 float64 `json:"y2"` 194 | } `json:"target_face"` 195 | Score float64 `json:"score"` 196 | FailFlag int `json:"fail_flag"` 197 | } `json:"data"` 198 | } 199 | 200 | // FaceFaceshapeResponse 五官定位 201 | type FaceFaceshapeResponse struct { 202 | BaseResponse 203 | Data struct { 204 | ImageWidth int `json:"image_width"` 205 | ImageHeight int `json:"image_height"` 206 | FaceList []struct { 207 | FaceID string `json:"face_id"` 208 | X int `json:"x"` 209 | Y int `json:"y"` 210 | Width int `json:"width"` 211 | Height int `json:"height"` 212 | Gender int `json:"gender"` 213 | Age int `json:"age"` 214 | Expression int `json:"expression"` 215 | Beauty int `json:"beauty"` 216 | Glass int `json:"glass"` 217 | Pitch int `json:"pitch"` 218 | Yaw int `json:"yaw"` 219 | Roll int `json:"roll"` 220 | FaceShape struct { 221 | FaceProfile []struct { 222 | X int `json:"x"` 223 | Y int `json:"y"` 224 | } `json:"face_profile"` 225 | LeftEye []struct { 226 | X int `json:"x"` 227 | Y int `json:"y"` 228 | } `json:"left_eye"` 229 | RightEye []struct { 230 | X int `json:"x"` 231 | Y int `json:"y"` 232 | } `json:"right_eye"` 233 | LeftEyebrow []struct { 234 | X int `json:"x"` 235 | Y int `json:"y"` 236 | } `json:"left_eyebrow"` 237 | RightEyebrow []struct { 238 | X int `json:"x"` 239 | Y int `json:"y"` 240 | } `json:"right_eyebrow"` 241 | Mouth []struct { 242 | X int `json:"x"` 243 | Y int `json:"y"` 244 | } `json:"mouth"` 245 | Nose []struct { 246 | X int `json:"x"` 247 | Y int `json:"y"` 248 | } `json:"nose"` 249 | } `json:"face_shape"` 250 | } `json:"face_list"` 251 | } `json:"data"` 252 | } 253 | 254 | // FaceFaceidentifyResponse 人脸识别 255 | type FaceFaceidentifyResponse struct { 256 | BaseResponse 257 | Data struct { 258 | TimeMs int `json:"time_ms"` 259 | GroupSize int `json:"group_size"` 260 | Candidates []struct { 261 | PersonID string `json:"person_id"` 262 | FaceID string `json:"face_id"` 263 | Confidence int `json:"confidence"` 264 | Tag string `json:"tag"` 265 | } `json:"candidates"` 266 | } `json:"data"` 267 | } 268 | 269 | // FaceFaceverifyResponse 人脸验证 270 | type FaceFaceverifyResponse struct { 271 | BaseResponse 272 | Data struct { 273 | Ismatch int `json:"ismatch"` 274 | Confidence int `json:"confidence"` 275 | } `json:"data"` 276 | } 277 | 278 | // FaceNewpersonResponse 个体创建 279 | type FaceNewpersonResponse struct { 280 | BaseResponse 281 | Data struct { 282 | SucGroup int `json:"suc_group"` 283 | SucFace int `json:"suc_face"` 284 | PersonID string `json:"person_id"` 285 | FaceID string `json:"face_id"` 286 | GroupIds []string `json:"group_ids"` 287 | } `json:"data"` 288 | } 289 | 290 | // FaceDelpersonResponse 删除个体 291 | type FaceDelpersonResponse struct { 292 | BaseResponse 293 | Data struct { 294 | Deleted int `json:"deleted"` 295 | PersonID string `json:"person_id"` 296 | } `json:"data"` 297 | } 298 | 299 | // FaceAddfaceResponse 增加人脸 300 | type FaceAddfaceResponse struct { 301 | BaseResponse 302 | Data struct { 303 | Added int `json:"added"` 304 | FaceIds []string `json:"face_ids"` 305 | RetCodes []int `json:"ret_codes"` 306 | } `json:"data"` 307 | } 308 | 309 | // FaceDelfaceResponse 删除人脸 310 | type FaceDelfaceResponse struct { 311 | BaseResponse 312 | Data struct { 313 | Deleted int `json:"deleted"` 314 | FaceIds []string `json:"face_ids"` 315 | } `json:"data"` 316 | } 317 | 318 | // FaceSetinfoResponse 设置信息 319 | type FaceSetinfoResponse struct { 320 | BaseResponse 321 | Data struct { 322 | PersonID string `json:"person_id"` 323 | } `json:"data"` 324 | } 325 | 326 | // FaceGetinfoResponse 获取信息 327 | type FaceGetinfoResponse struct { 328 | BaseResponse 329 | Data struct { 330 | PersonID string `json:"person_id"` 331 | PersonName string `json:"person_name"` 332 | Tag string `json:"tag"` 333 | FaceIds []string `json:"face_ids"` 334 | GroupIds []string `json:"group_ids"` 335 | } `json:"data"` 336 | } 337 | 338 | // FaceGetgroupidsResponse 获取组列表 339 | type FaceGetgroupidsResponse struct { 340 | BaseResponse 341 | Data struct { 342 | GroupIds []string `json:"group_ids"` 343 | } `json:"data"` 344 | } 345 | 346 | // FaceGetpersonidsResponse 获取个体列表 347 | type FaceGetpersonidsResponse struct { 348 | BaseResponse 349 | Data struct { 350 | PersonIds []string `json:"person_ids"` 351 | } `json:"data"` 352 | } 353 | 354 | // FaceGetfaceidsResponse 获取人脸列表 - 根据个体(Person)ID 获取人脸(Face)ID列表 355 | type FaceGetfaceidsResponse struct { 356 | BaseResponse 357 | Data struct { 358 | FaceIds []string `json:"face_ids"` 359 | } `json:"data"` 360 | } 361 | 362 | // FaceGetfaceinfoResponse 获取人脸信息 - 根据人脸(Face)ID 获取人脸(Face)信息 363 | type FaceGetfaceinfoResponse struct { 364 | BaseResponse 365 | Data struct { 366 | FaceInfo struct { 367 | FaceID string `json:"face_id"` 368 | X int `json:"x"` 369 | Y int `json:"y"` 370 | Width int `json:"width"` 371 | Height int `json:"height"` 372 | Gender int `json:"gender"` 373 | Age int `json:"age"` 374 | Expression int `json:"expression"` 375 | Beauty int `json:"beauty"` 376 | Glass int `json:"glass"` 377 | Pitch int `json:"pitch"` 378 | Yaw int64 `json:"yaw"` 379 | Roll int64 `json:"roll"` 380 | } `json:"face_info"` 381 | } `json:"data"` 382 | } 383 | 384 | /* 图片识别 */ 385 | 386 | // VisionScenerResponse 场景识别 387 | type VisionScenerResponse struct { 388 | BaseResponse 389 | Data struct { 390 | Topk int `json:"topk"` 391 | SceneList []*struct { 392 | LabelID int `json:"label_id"` 393 | LabelName string `json:"label_name"` // 场景名 394 | LabelConfd float64 `json:"label_confd"` 395 | } `json:"scene_list"` 396 | } `json:"data"` 397 | } 398 | 399 | // VisionObjectrResponse 物体识别 400 | type VisionObjectrResponse struct { 401 | BaseResponse 402 | Data struct { 403 | Topk int `json:"topk"` 404 | ObjectList []*struct { 405 | LabelID int `json:"label_id"` 406 | LabelName string `json:"label_name"` // 物体名 407 | LabelConfd float64 `json:"label_confd"` 408 | } `json:"object_list"` 409 | } `json:"data"` 410 | } 411 | 412 | // ImageTagResponse 图像标签识别 413 | type ImageTagResponse struct { 414 | BaseResponse 415 | Data struct { 416 | TagList []struct { 417 | TagConfidence int `json:"tag_confidence"` 418 | TagName string `json:"tag_name"` 419 | } `json:"tag_list"` 420 | } `json:"data"` 421 | } 422 | 423 | // VisionImgtotextResponse 看图说话 424 | type VisionImgtotextResponse struct { 425 | BaseResponse 426 | Data struct { 427 | Text string `json:"text"` 428 | } `json:"data"` 429 | } 430 | 431 | // ImageFuzzyResponse 模糊图片检测 432 | type ImageFuzzyResponse struct { 433 | BaseResponse 434 | Data struct { 435 | Fuzzy bool `json:"fuzzy"` 436 | Confidence float64 `json:"confidence"` 437 | } `json:"data"` 438 | } 439 | 440 | // ImageFoodResponse 美食图片识别 441 | type ImageFoodResponse struct { 442 | BaseResponse 443 | Data struct { 444 | Food bool `json:"food"` 445 | Confidence float64 `json:"confidence"` 446 | } `json:"data"` 447 | } 448 | 449 | // PtuResponse 图片特效统一响应格式 450 | type PtuResponse struct { 451 | BaseResponse 452 | Data struct { 453 | Image []byte `json:"image"` 454 | } `json:"data"` 455 | } 456 | 457 | /* 自然语言处理 */ 458 | 459 | // NlpWordsegResponse 分词 460 | type NlpWordsegResponse struct { 461 | BaseResponse 462 | Data struct { 463 | Text string `json:"text"` 464 | BaseTokens []struct { 465 | Word string `json:"word"` 466 | Offset int `json:"offset"` 467 | Length int `json:"length"` 468 | } `json:"base_tokens"` 469 | MixTokens []struct { 470 | Word string `json:"word"` 471 | Offset int `json:"offset"` 472 | Length int `json:"length"` 473 | } `json:"mix_tokens"` 474 | } `json:"data"` 475 | } 476 | 477 | // NlpWordcomResponse 语义解析 478 | type NlpWordcomResponse struct { 479 | BaseResponse 480 | Data struct { 481 | Text string `json:"text"` 482 | Intent int `json:"intent"` 483 | IntentName string `json:"intent_name"` 484 | ComTokens []*struct { 485 | ComType int `json:"com_type"` 486 | ComTypeName string `json:"com_type_name"` 487 | ComWord string `json:"com_word"` 488 | } `json:"com_tokens"` 489 | } `json:"data"` 490 | } 491 | 492 | // NlpWordnerResponse 专有名词识别接口 493 | type NlpWordnerResponse struct { 494 | BaseResponse 495 | Data struct { 496 | Text string `json:"text"` 497 | NerTokens []*struct { 498 | Word string `json:"word"` 499 | Offset int `json:"offset"` 500 | Length int `json:"length"` 501 | Types []int `json:"types"` 502 | Weights []int `json:"weights"` 503 | TypeNames []string `json:"type_names"` 504 | } `json:"ner_tokens"` 505 | } `json:"data"` 506 | } 507 | 508 | // NlpWordsynResponse 同义词识别 509 | type NlpWordsynResponse struct { 510 | BaseResponse 511 | Data struct { 512 | Text string `json:"text"` 513 | SynTokens []struct { 514 | OriWord struct { 515 | Word string `json:"word"` 516 | Offset int `json:"offset"` 517 | Length int `json:"length"` 518 | } `json:"ori_word"` 519 | SynWords []struct { 520 | Word string `json:"word"` 521 | Weight float64 `json:"weight"` 522 | } `json:"syn_words"` 523 | } `json:"syn_tokens"` 524 | } `json:"data"` 525 | } 526 | 527 | // NlpWordposResponse 词性标注 528 | type NlpWordposResponse struct { 529 | BaseResponse 530 | Data struct { 531 | Text string `json:"text"` 532 | BaseTokens []*struct { 533 | Word string `json:"word"` 534 | Offset int `json:"offset"` 535 | Length int `json:"length"` 536 | PosCode int `json:"pos_code"` 537 | PosCodeName string `json:"pos_code_name"` 538 | } `json:"base_tokens"` 539 | MixTokens []*struct { 540 | Word string `json:"word"` 541 | Offset int `json:"offset"` 542 | Length int `json:"length"` 543 | PosCode int `json:"pos_code"` 544 | PosCodeName string `json:"pos_code_name"` 545 | } `json:"mix_tokens"` 546 | } `json:"data"` 547 | } 548 | 549 | // NlpTextpolarResponse 情感分析 550 | type NlpTextpolarResponse struct { 551 | BaseResponse 552 | Data struct { 553 | Text string `json:"text"` 554 | Polar int `json:"polar"` 555 | PolarName string `json:"polar_name"` 556 | Confd float64 `json:"confd"` 557 | } `json:"data"` 558 | } 559 | 560 | // NlpTextchatResponse 智能闲聊 561 | type NlpTextchatResponse struct { 562 | BaseResponse 563 | Data struct { 564 | Session string `json:"session"` 565 | Answer string `json:"answer"` 566 | } `json:"data"` 567 | } 568 | 569 | // NlpTexttransResponse 文本翻译(AI Lab) 570 | type NlpTexttransResponse struct { 571 | BaseResponse 572 | Data struct { 573 | Type LangType `json:"type"` 574 | OrgText string `json:"org_text"` 575 | TransText string `json:"trans_text"` 576 | } `json:"data"` 577 | } 578 | 579 | // NlpTexttranslateResponse 文本翻译(翻译君) 580 | type NlpTexttranslateResponse struct { 581 | BaseResponse 582 | Data struct { 583 | SourceText string `json:"source_text"` 584 | TargetText string `json:"target_text"` 585 | } `json:"data"` 586 | } 587 | 588 | // NlpImagetranslateResponse 图片翻译 589 | type NlpImagetranslateResponse struct { 590 | BaseResponse 591 | Data struct { 592 | SessionID string `json:"session_id"` 593 | ImageRecords []struct { 594 | SourceText string `json:"source_text"` 595 | TargetText string `json:"target_text"` 596 | X int `json:"x"` 597 | Y int `json:"y"` 598 | Width int `json:"width"` 599 | Height int `json:"height"` 600 | } `json:"image_records"` 601 | } `json:"data"` 602 | } 603 | 604 | // NlpSpeechtranslateResponse 语音翻译 605 | type NlpSpeechtranslateResponse struct { 606 | BaseResponse 607 | Data struct { 608 | SessionID string `json:"session_id"` 609 | End int `json:"end"` 610 | Seq int `json:"seq"` 611 | SourceText string `json:"source_text"` 612 | TargetText string `json:"target_text"` 613 | } `json:"data"` 614 | } 615 | 616 | // NlpTextdetectResponse 语种识别 617 | type NlpTextdetectResponse struct { 618 | BaseResponse 619 | Data struct { 620 | Lang Lang `json:"lang"` 621 | } `json:"data"` 622 | } 623 | 624 | // AaiAsrResponse 语音识别-echo版 625 | type AaiAsrResponse struct { 626 | BaseResponse 627 | Data struct { 628 | Format AaiAudioType `json:"format"` 629 | Rate int `json:"rate"` 630 | Text string `json:"text"` 631 | } `json:"data"` 632 | } 633 | 634 | // AaiAsrsResponse 语音识别-流式版(AI Lab) 635 | type AaiAsrsResponse struct { 636 | BaseResponse 637 | Data struct { 638 | Format int `json:"format"` 639 | Rate int `json:"rate"` 640 | Seq int `json:"seq"` 641 | Len int `json:"len"` 642 | End int `json:"end"` 643 | SpeechID string `json:"speech_id"` 644 | SpeechText string `json:"speech_text"` 645 | } `json:"data"` 646 | } 647 | 648 | // AaiWxasrsResponse 语音识别-流式版(AI Lab) 649 | type AaiWxasrsResponse struct { 650 | BaseResponse 651 | Data struct { 652 | Format int `json:"format"` 653 | Rate int `json:"rate"` 654 | End int `json:"end"` 655 | SpeechID string `json:"speech_id"` 656 | SpeechText string `json:"speech_text"` 657 | IsFinalRes int `json:"is_final_res"` 658 | Ack int `json:"ack"` 659 | } `json:"data"` 660 | } 661 | 662 | // AaiWxasrlongResponse 长语音识别 663 | type AaiWxasrlongResponse struct { 664 | BaseResponse 665 | Data struct { 666 | TaskID string `json:"task_id"` 667 | Text string `json:"text"` 668 | } `json:"data"` 669 | } 670 | 671 | // AaiDetectkeywordResponse 关键词检索 672 | type AaiDetectkeywordResponse struct { 673 | BaseResponse 674 | Data struct { 675 | Bps int `json:"bps"` 676 | Eps int `json:"eps"` 677 | IsEnd int `json:"is_end"` 678 | Res struct { 679 | KeyWords []struct { 680 | KeyWord string `json:"key_word"` 681 | Mbtm int `json:"mbtm"` 682 | Metm float64 `json:"metm"` 683 | Score int `json:"score"` 684 | } `json:"key_words"` 685 | KeyWordsSize int `json:"key_words_size"` 686 | } `json:"res"` 687 | SegIndex int `json:"seg_index"` 688 | TaskID string `json:"task_id"` 689 | } `json:"data"` 690 | } 691 | 692 | // AaiTtsResponse 语音合成(AI Lab) 693 | type AaiTtsResponse struct { 694 | BaseResponse 695 | Data struct { 696 | Format int `json:"format"` 697 | Speech []byte `json:"speech"` 698 | Md5Sum string `json:"md5sum"` 699 | } `json:"data"` 700 | } 701 | 702 | // AaiTtaResponse 语音合成(优图) 703 | type AaiTtaResponse struct { 704 | BaseResponse 705 | Data struct { 706 | Voice []byte `json:"voice"` 707 | } `json:"data"` 708 | } 709 | 710 | // AaiEvilaudioResponse 音频鉴黄 711 | type AaiEvilaudioResponse struct { 712 | BaseResponse 713 | Data struct { 714 | SpeechID string `json:"speech_id"` 715 | SpeechURL string `json:"speech_url"` 716 | PornFlag int `json:"porn_flag"` 717 | PornScore int `json:"porn_score"` 718 | } `json:"data"` 719 | } 720 | -------------------------------------------------------------------------------- /nlp_imagetranslate.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | nlpImagetranslateURI = "/nlp/nlp_imagetranslate" 11 | ) 12 | 13 | // SceneType 图片翻译识别类型 14 | type SceneType = string 15 | 16 | const ( 17 | // SceneWord 单词识别 18 | SceneWord SceneType = "word" 19 | // SceneDoc 文档识别 20 | SceneDoc SceneType = "doc" 21 | ) 22 | 23 | // NlpImagetranslateForBase64 图片翻译 - 图片为base64格式 24 | // image 图片base64后字符串 25 | // sessionId 一次请求ID 一次请求ID(尽可能唯一,长度上限64字节) 26 | // scene 识别类型(word-单词识别,doc-文档识别) 27 | // source 源语言缩写,详细见下文 28 | // target 目标语言缩写,详细见下文 29 | func (ai *TxAi) NlpImagetranslateForBase64(image, sessionId string, scene SceneType, source, target Lang) (*NlpImagetranslateResponse, error) { 30 | params := ai.getPublicParams() 31 | params.Add("image", image) 32 | params.Add("session_id", sessionId) 33 | params.Add("scene", scene) 34 | params.Add("source", fmt.Sprint(source)) 35 | params.Add("target", fmt.Sprint(target)) 36 | sign := ai.getReqSign(params) 37 | params.Add("sign", sign) 38 | // 响应结果 39 | nlpImagetranslateResponse := new(NlpImagetranslateResponse) 40 | err := ai.RequestAPI(nlpImagetranslateURI, params, nlpImagetranslateResponse) 41 | if err != nil { 42 | return nil, err 43 | } 44 | return nlpImagetranslateResponse, nil 45 | } 46 | 47 | // NlpImagetranslateForPath 图片翻译 - 图片为本地路径 48 | // imagePath 本地图片路径 49 | func (ai *TxAi) NlpImagetranslateForPath(imagePath, sessionId, scene string, source, target Lang) (*NlpImagetranslateResponse, error) { 50 | body, err := ioutil.ReadFile(imagePath) 51 | if err != nil { 52 | return nil, err 53 | } 54 | img := base64.StdEncoding.EncodeToString(body) 55 | return ai.NlpImagetranslateForBase64(img, sessionId, scene, source, target) 56 | } 57 | -------------------------------------------------------------------------------- /nlp_speechtranslate.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | nlpSpeechtranslateURI = "/nlp/nlp_speechtranslate" 11 | ) 12 | 13 | // FormatAudioType 语音翻译 语音压缩格式编码类型 14 | type FormatAudioType int 15 | 16 | const ( 17 | AudioAMR FormatAudioType = 3 18 | AudioSILK FormatAudioType = 4 19 | AudioPCM FormatAudioType = 6 20 | AudioMP3 FormatAudioType = 8 21 | AudioAAC FormatAudioType = 9 22 | ) 23 | 24 | // NlpSpeechtranslateForBase64 语音翻译 - 音频为base64格式 25 | // speechChunk 待识别语音分片 26 | // sessionId 一次请求ID 一次请求ID(尽可能唯一,长度上限64字节) 27 | // format 语音压缩格式编码,定义见下文描述 枚举FormatAudioType 28 | // seq 语音分片所在语音流的偏移量(字节) 29 | // end 是否结束分片标识,定义见下文描述 30 | // source 源语言缩写,详细见下文 31 | // target 目标语言缩写,详细见下文 32 | func (ai *TxAi) NlpSpeechtranslateForBase64(speechChunk, sessionId string, format FormatAudioType, seq, end uint, source, target Lang) (*NlpSpeechtranslateResponse, error) { 33 | params := ai.getPublicParams() 34 | params.Add("format", fmt.Sprint(format)) 35 | params.Add("seq", fmt.Sprint(seq)) 36 | params.Add("end", fmt.Sprint(end)) 37 | params.Add("session_id", sessionId) 38 | params.Add("speech_chunk", speechChunk) 39 | params.Add("source", fmt.Sprint(source)) 40 | params.Add("target", fmt.Sprint(target)) 41 | sign := ai.getReqSign(params) 42 | params.Add("sign", sign) 43 | // 响应结果 44 | nlpSpeechtranslateResponse := new(NlpSpeechtranslateResponse) 45 | err := ai.RequestAPI(nlpSpeechtranslateURI, params, nlpSpeechtranslateResponse) 46 | if err != nil { 47 | return nil, err 48 | } 49 | return nlpSpeechtranslateResponse, nil 50 | } 51 | 52 | // NlpSpeechtranslateForPath 语音翻译 - 音频为本地路径 53 | // speechChunkPath 本地图片路径 54 | // sessionId 一次请求ID 一次请求ID(尽可能唯一,长度上限64字节) 55 | // format 语音压缩格式编码,定义见下文描述 枚举FormatAudioType 56 | // seq 语音分片所在语音流的偏移量(字节) 57 | // end 是否结束分片标识,定义见下文描述 58 | // source 源语言缩写,详细见下文 59 | // target 目标语言缩写,详细见下文 60 | func (ai *TxAi) NlpSpeechtranslateForPath(speechChunkPath, sessionId string, format FormatAudioType, seq, end uint, source, target Lang) (*NlpSpeechtranslateResponse, error) { 61 | body, err := ioutil.ReadFile(speechChunkPath) 62 | if err != nil { 63 | return nil, err 64 | } 65 | speech := base64.StdEncoding.EncodeToString(body) 66 | return ai.NlpSpeechtranslateForBase64(speech, sessionId, format, seq, end, source, target) 67 | } 68 | -------------------------------------------------------------------------------- /nlp_textchat.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var ( 4 | nlpTextchatURI = "/nlp/nlp_textchat" 5 | ) 6 | 7 | // NlpTextchatForText 智能闲聊 - 基础闲聊 8 | // session 会话标识(应用内唯一) 9 | // question 用户输入的聊天内容 10 | func (ai *TxAi) NlpTextchatForText(session, question string) (*NlpTextchatResponse, error) { 11 | params := ai.getPublicParams() 12 | params.Add("session", session) 13 | params.Add("question", question) 14 | sign := ai.getReqSign(params) 15 | params.Add("sign", sign) 16 | // 响应结果 17 | nlpTextchatResponse := new(NlpTextchatResponse) 18 | err := ai.RequestAPI(nlpTextchatURI, params, nlpTextchatResponse) 19 | if err != nil { 20 | return nil, err 21 | } 22 | return nlpTextchatResponse, nil 23 | } 24 | -------------------------------------------------------------------------------- /nlp_textdetect.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "strings" 4 | 5 | var ( 6 | nlpTextdetectURI = "/nlp/nlp_textdetect" 7 | ) 8 | 9 | // NlpTextdetectForText 语种识别 - 对文本进行翻译,支持多种语言之间互译 10 | // text 待翻译文本 11 | // force 是否强制从候选语言中选择(只对二选一有效) 12 | // candidateLangs 备选语言缩写,详细见 https://ai.qq.com/doc/textdetect.shtml 13 | func (ai *TxAi) NlpTextdetectForText(text string, force bool, candidateLangs ...Lang) (*NlpTextdetectResponse, error) { 14 | params := ai.getPublicParams() 15 | params.Add("text", text) 16 | if force == true { 17 | params.Add("force", "1") 18 | } else { 19 | params.Add("force", "0") 20 | } 21 | params.Add("candidate_langs", strings.Join(candidateLangs, "|")) 22 | sign := ai.getReqSign(params) 23 | params.Add("sign", sign) 24 | // 响应结果 25 | nlpTextdetectResponse := new(NlpTextdetectResponse) 26 | err := ai.RequestAPI(nlpTextdetectURI, params, nlpTextdetectResponse) 27 | if err != nil { 28 | return nil, err 29 | } 30 | return nlpTextdetectResponse, nil 31 | } 32 | -------------------------------------------------------------------------------- /nlp_textpolar.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var ( 4 | nlpTextpolarURI = "/nlp/nlp_textpolar" 5 | ) 6 | 7 | // NlpTextpolarForText 情感分析 - 对文本进行情感分析,快速判断情感倾向(正面或负面) 8 | // text 待分析文本 9 | func (ai *TxAi) NlpTextpolarForText(text string) (*NlpTextpolarResponse, error) { 10 | params := ai.getPublicParams() 11 | params.Add("text", text) 12 | sign := ai.getReqSign(params) 13 | params.Add("sign", sign) 14 | // 响应结果 15 | nlpTextpolarResponse := new(NlpTextpolarResponse) 16 | err := ai.RequestAPI(nlpTextpolarURI, params, nlpTextpolarResponse) 17 | if err != nil { 18 | return nil, err 19 | } 20 | switch nlpTextpolarResponse.Data.Polar { 21 | case -1: 22 | nlpTextpolarResponse.Data.PolarName = "负面" 23 | break 24 | case 0: 25 | nlpTextpolarResponse.Data.PolarName = "中性" 26 | break 27 | case 1: 28 | nlpTextpolarResponse.Data.PolarName = "正面" 29 | break 30 | } 31 | return nlpTextpolarResponse, nil 32 | } 33 | -------------------------------------------------------------------------------- /nlp_texttrans.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "fmt" 4 | 5 | var ( 6 | nlpTexttransURI = "/nlp/nlp_texttrans" 7 | ) 8 | 9 | // LangType 翻译类型 10 | type LangType uint 11 | 12 | const ( 13 | // LangAuto 自动识别(中英文互转) 14 | LangAuto LangType = 0 15 | // LangZhToEn 中文翻译成英文 16 | LangZhToEn LangType = 1 17 | // LangEnToZh 英文翻译成中文 18 | LangEnToZh LangType = 1 19 | // LangZhToEs 中文翻译成西班牙文 20 | LangZhToEs LangType = 3 21 | // LangEsToZh 西班牙文翻译成中文 22 | LangEsToZh LangType = 4 23 | // LangZhToFr 中文翻译成法文 24 | LangZhToFr LangType = 5 25 | // LangFrToZh 法文翻译成中文 26 | LangFrToZh LangType = 6 27 | // LangZhToVi 英文翻译成越南语 28 | LangZhToVi LangType = 7 29 | // LangViToZh 越南语翻译成英文 30 | LangViToZh LangType = 8 31 | // LangZhToZhYY 中文翻译成粤语 32 | LangZhToZhYY LangType = 9 33 | // LangZhYYToZh 中文翻译成粤语 34 | LangZhYYToZh LangType = 10 35 | // LangZhToKr 中文翻译成韩文 36 | LangZhToKr LangType = 11 37 | // LangEnToDe 英文翻译成德语 38 | LangEnToDe LangType = 13 39 | // LangDeToEn 德语翻译成英文 40 | LangDeToEn LangType = 14 41 | // LangZhToJp 中文翻译成日文 42 | LangZhToJp LangType = 15 43 | // LangJpToZh 日文翻译成中文 44 | LangJpToZh LangType = 16 45 | ) 46 | 47 | // NlpTexttransForText 文本翻译(AI Lab) - 对文本进行翻译,支持多种语言之间互译 48 | // text 待翻译文本 49 | // langType 翻译类型,默认为0,详细见下文 50 | func (ai *TxAi) NlpTexttransForText(text string, langTypes ...LangType) (*NlpTexttransResponse, error) { 51 | langType := LangAuto 52 | if len(langTypes) > 0 { 53 | langType = langTypes[0] 54 | } 55 | params := ai.getPublicParams() 56 | params.Add("text", text) 57 | params.Add("type", fmt.Sprint(langType)) 58 | sign := ai.getReqSign(params) 59 | params.Add("sign", sign) 60 | // 响应结果 61 | nlpTexttransResponse := new(NlpTexttransResponse) 62 | err := ai.RequestAPI(nlpTexttransURI, params, nlpTexttransResponse) 63 | if err != nil { 64 | return nil, err 65 | } 66 | return nlpTexttransResponse, nil 67 | } 68 | -------------------------------------------------------------------------------- /nlp_texttranslate.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "fmt" 4 | 5 | var ( 6 | nlpTexttranslateURI = "/nlp/nlp_texttranslate" 7 | ) 8 | 9 | // Lang 语言 10 | type Lang = string 11 | 12 | const ( 13 | // Zh 中文 14 | Zh Lang = "zh" 15 | // En 英文 16 | En Lang = "en" 17 | // Jp 日文 18 | Jp Lang = "jp" 19 | // Kr 韩文 20 | Kr Lang = "kr" 21 | // Fr 法文 22 | Fr Lang = "fr" 23 | // Es 西班牙文 24 | Es Lang = "es" 25 | // It 意大利文 26 | It Lang = "it" 27 | // De 德文 28 | De Lang = "de" 29 | // Tr 土耳其文 30 | Tr Lang = "tr" 31 | // Ru 俄文 32 | Ru Lang = "ru" 33 | // Pt 葡萄牙文 34 | Pt Lang = "pt" 35 | // Vi 越南文 36 | Vi Lang = "vi" 37 | // Id 印度尼西亚文 38 | Id Lang = "id" 39 | // Ms 马来西亚文 40 | Ms Lang = "ms" 41 | // Th 泰文 42 | Th Lang = "th" 43 | // LangAuto 自动识别(中英互译) 44 | Auto Lang = "auto" 45 | ) 46 | 47 | // NlpTexttranslateForText 文本翻译(翻译君) - 对文本进行翻译,支持多种语言之间互译 48 | // text 待翻译文本 49 | // langType 翻译类型,默认为0,详细见下文 50 | func (ai *TxAi) NlpTexttranslateForText(text string, source, target Lang) (*NlpTexttranslateResponse, error) { 51 | params := ai.getPublicParams() 52 | params.Add("text", text) 53 | params.Add("source", fmt.Sprint(source)) 54 | params.Add("target", fmt.Sprint(target)) 55 | sign := ai.getReqSign(params) 56 | params.Add("sign", sign) 57 | // 响应结果 58 | nlpTexttranslateResponse := new(NlpTexttranslateResponse) 59 | err := ai.RequestAPI(nlpTexttranslateURI, params, nlpTexttranslateResponse) 60 | if err != nil { 61 | return nil, err 62 | } 63 | return nlpTexttranslateResponse, nil 64 | } 65 | -------------------------------------------------------------------------------- /nlp_wordcom.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var ( 4 | nlpWordcomURI = "/nlp/nlp_wordcom" 5 | ) 6 | 7 | // NlpWordcomForText 语义解析 - 对文本进行意图识别,快速找出意图及上下文成分 8 | // text 待分析文本 9 | func (ai *TxAi) NlpWordcomForText(text string) (*NlpWordcomResponse, error) { 10 | params := ai.getPublicParams() 11 | params.Add("text", text) 12 | sign := ai.getReqSign(params) 13 | params.Add("sign", sign) 14 | // 响应结果 15 | nlpWordcomResponse := new(NlpWordcomResponse) 16 | err := ai.RequestAPI(nlpWordcomURI, params, nlpWordcomResponse) 17 | if err != nil { 18 | return nil, err 19 | } 20 | nlpWordcomResponse.Data.IntentName = NlpWordcomIntentNames[nlpWordcomResponse.Data.Intent] 21 | for _, v := range nlpWordcomResponse.Data.ComTokens { 22 | v.ComTypeName = NlpWordcomComTypeNames[v.ComType] 23 | } 24 | 25 | return nlpWordcomResponse, nil 26 | } 27 | -------------------------------------------------------------------------------- /nlp_wordcom_data.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // 语义解析使用到的枚举列表 4 | 5 | // NlpWordcomIntentNames 意图编码-名列表 6 | var NlpWordcomIntentNames = map[int]string{ 7 | 0: "未知", 8 | 1: "天气", 9 | 2: "音乐", 10 | 3: "股票", 11 | 4: "新闻", 12 | } 13 | 14 | // NlpWordcomComTypeNames 成分编码-名列表 15 | var NlpWordcomComTypeNames = map[int]string{ 16 | 0: "未知", 17 | 1: "歌词", 18 | 2: "下载地址", 19 | 3: "乐器", 20 | 4: "歌曲", 21 | 5: "人名", 22 | 6: "时间", 23 | 7: "地点", 24 | 8: "风格", 25 | 9: "数字", 26 | 10: "视频", 27 | 11: "民族", 28 | 12: "专辑", 29 | 13: "序数词", 30 | 14: "综艺", 31 | 15: "乐队", 32 | 16: "景点", 33 | 17: "电影", 34 | 18: "电视剧", 35 | 19: "百科", 36 | 34: "股票名称", 37 | 35: "股票代码", 38 | 36: "指数", 39 | 37: "价格", 40 | 38: "行情", 41 | 40: "山", 42 | 41: "湖", 43 | 42: "是否", 44 | 43: "餐馆", 45 | 44: "菜名", 46 | 45: "儿歌", 47 | 46: "故事", 48 | 47: "相声", 49 | 48: "评书", 50 | 49: "有声内容", 51 | 128: "类别词", 52 | 129: "关系词", 53 | 130: "省略词", 54 | } 55 | -------------------------------------------------------------------------------- /nlp_wordner_names.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var NlpWordnerNames = map[int]string{ 4 | 1000: "人名", 5 | 1100: "地名", 6 | 1200: "机构名", 7 | 1300: "时间", 8 | } 9 | -------------------------------------------------------------------------------- /nlp_wordpos_names.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | // NlpWordposNames 词性编码定义 4 | var NlpWordposNames = map[int]string{ 5 | 0: "未知词性", 6 | 1: "形容词", 7 | 2: "副形词", 8 | 3: "名形词", 9 | 4: "区别词", 10 | 5: "连词", 11 | 6: "副词", 12 | 7: "叹词", 13 | 8: "方位词", 14 | 9: "语素词", 15 | 10: "前接成分", 16 | 11: "成语", 17 | 12: "简称略语", 18 | 13: "后接成分", 19 | 14: "习用语", 20 | 15: "数词", 21 | 16: "名词", 22 | 17: "人名", 23 | 18: "姓", 24 | 19: "名", 25 | 20: "地名", 26 | 21: "机构团体", 27 | 22: "其他专名", 28 | 23: "非汉字串", 29 | 24: "拟声词", 30 | 25: "介词", 31 | 26: "量词", 32 | 27: "代词", 33 | 28: "处所词", 34 | 29: "时间词", 35 | 30: "助词", 36 | 31: "动词", 37 | 32: "副动词", 38 | 33: "名动词", 39 | 34: "标点符号", 40 | 35: "非语素字", 41 | 36: "语气词", 42 | 37: "状态词", 43 | 38: "形语素", 44 | 39: "区别语素", 45 | 40: "副语素", 46 | 41: "数词性语素", 47 | 42: "名语素", 48 | 43: "量语素", 49 | 44: "代语素", 50 | 45: "时语素", 51 | 46: "动语素", 52 | 47: "语气词语素", 53 | 48: "状态词语素", 54 | 49: "开始词", 55 | 50: "URL", 56 | 51: "电话号码", 57 | 52: "email", 58 | 55: "结束词", 59 | } 60 | -------------------------------------------------------------------------------- /nlp_wordseg.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import "github.com/axgle/mahonia" 4 | 5 | var ( 6 | nlpWordsegURI = "/nlp/nlp_wordseg" 7 | nlpWordposURI = "/nlp/nlp_wordpos" 8 | nlpWordnerURI = "/nlp/nlp_wordner" 9 | nlpWordsynURI = "/nlp/nlp_wordsyn" 10 | ) 11 | 12 | // NlpWordsegForText 分词 - 对文本进行智能分词识别,支持基础词与混排词粒度 13 | // text 待分析文本 14 | func (ai *TxAi) NlpWordsegForText(text string) (*NlpWordsegResponse, error) { 15 | // 转gbk 16 | enc := mahonia.NewEncoder("gbk") 17 | text = enc.ConvertString(text) 18 | // 组织参数 19 | params := ai.getPublicParams() 20 | params.Add("text", text) 21 | sign := ai.getReqSign(params) 22 | params.Add("sign", sign) 23 | 24 | // 响应结果 25 | nlpWordsegResponse := new(NlpWordsegResponse) 26 | err := ai.RequestAPI(nlpWordsegURI, params, nlpWordsegResponse) 27 | if err != nil { 28 | return nil, err 29 | } 30 | return nlpWordsegResponse, nil 31 | } 32 | 33 | // NlpWordposForText 词性标注 - 对文本进行分词,同时为每个分词标注正确的词性 34 | // text 待分析文本 35 | func (ai *TxAi) NlpWordposForText(text string) (*NlpWordposResponse, error) { 36 | // 转gbk 37 | enc := mahonia.NewEncoder("gbk") 38 | text = enc.ConvertString(text) 39 | // 组织参数 40 | params := ai.getPublicParams() 41 | params.Add("text", text) 42 | sign := ai.getReqSign(params) 43 | params.Add("sign", sign) 44 | // 响应结果 45 | nlpWordposResponse := new(NlpWordposResponse) 46 | err := ai.RequestAPI(nlpWordposURI, params, nlpWordposResponse) 47 | if err != nil { 48 | return nil, err 49 | } 50 | // 处理词性名 51 | for _, v := range nlpWordposResponse.Data.BaseTokens { 52 | v.PosCodeName = NlpWordposNames[v.PosCode] 53 | } 54 | for _, v := range nlpWordposResponse.Data.MixTokens { 55 | v.PosCodeName = NlpWordposNames[v.PosCode] 56 | } 57 | return nlpWordposResponse, nil 58 | } 59 | 60 | // NlpWordnerForText 专有名词识别 - 对文本进行专有名词的分词识别,找出文本中的专有名词 61 | // text 待分析文本 62 | func (ai *TxAi) NlpWordnerForText(text string) (*NlpWordnerResponse, error) { 63 | // 转gbk 64 | enc := mahonia.NewEncoder("gbk") 65 | text = enc.ConvertString(text) 66 | // 组织参数 67 | params := ai.getPublicParams() 68 | params.Add("text", text) 69 | sign := ai.getReqSign(params) 70 | params.Add("sign", sign) 71 | // 响应结果 72 | nlpWordnerResponse := new(NlpWordnerResponse) 73 | err := ai.RequestAPI(nlpWordnerURI, params, nlpWordnerResponse) 74 | if err != nil { 75 | return nil, err 76 | } 77 | // 获取专有名词编码 78 | for _, v := range nlpWordnerResponse.Data.NerTokens { 79 | v.TypeNames = make([]string, 0) 80 | for _, vv := range v.Types { 81 | v.TypeNames = append(v.TypeNames, NlpWordnerNames[vv]) 82 | } 83 | } 84 | return nlpWordnerResponse, nil 85 | } 86 | 87 | // NlpWordsynForText 同义词识别 - 识别文本中存在同义词的分词,并返回相应的同义词 88 | // text 待分析文本 89 | func (ai *TxAi) NlpWordsynForText(text string) (*NlpWordsynResponse, error) { 90 | // 转gbk 91 | enc := mahonia.NewEncoder("gbk") 92 | text = enc.ConvertString(text) 93 | // 组织参数 94 | params := ai.getPublicParams() 95 | params.Add("text", text) 96 | sign := ai.getReqSign(params) 97 | params.Add("sign", sign) 98 | // 响应结果 99 | nlpWordsynResponse := new(NlpWordsynResponse) 100 | err := ai.RequestAPI(nlpWordsynURI, params, nlpWordsynResponse) 101 | if err != nil { 102 | return nil, err 103 | } 104 | return nlpWordsynResponse, nil 105 | } 106 | -------------------------------------------------------------------------------- /ocr_bcocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrBcocrURI = "/ocr/ocr_bcocr" 10 | ) 11 | 12 | // OcrBcocrForBase64 名片OCR识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrBcocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | 20 | // 响应结果 21 | ocrResponse := new(OcrResponse) 22 | err := ai.RequestAPI(ocrBcocrURI, params, ocrResponse) 23 | if err != nil { 24 | return nil, err 25 | } 26 | return ocrResponse, nil 27 | } 28 | 29 | // OcrBcocrForPath 名片OCR识别 - 图片为本地路径 30 | // imagePath 本地图片路径 31 | func (ai *TxAi) OcrBcocrForPath(imagePath string) (*OcrResponse, error) { 32 | body, err := ioutil.ReadFile(imagePath) 33 | if err != nil { 34 | return nil, err 35 | } 36 | img := base64.StdEncoding.EncodeToString(body) 37 | return ai.OcrBcocrForBase64(img) 38 | } 39 | -------------------------------------------------------------------------------- /ocr_bizlicenseocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrBizlicenseocrURI = "/ocr/ocr_bizlicenseocr" 10 | ) 11 | 12 | // OcrBizlicenseocrForBase64 营业执照OCR识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrBizlicenseocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ocrResponse := new(OcrResponse) 21 | err := ai.RequestAPI(ocrBizlicenseocrURI, params, ocrResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ocrResponse, nil 26 | } 27 | 28 | // OcrBizlicenseocrForPath 营业执照OCR识别 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) OcrBizlicenseocrForPath(imagePath string) (*OcrResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.OcrBizlicenseocrForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /ocr_creditcardocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrCreditcardocrURI = "/ocr/ocr_creditcardocr" 10 | ) 11 | 12 | // OcrCreditcardocrForBase64 银行卡OCR识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrCreditcardocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ocrResponse := new(OcrResponse) 21 | err := ai.RequestAPI(ocrCreditcardocrURI, params, ocrResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ocrResponse, nil 26 | } 27 | 28 | // OcrCreditcardocrForPath 银行卡OCR识别 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) OcrCreditcardocrForPath(imagePath string) (*OcrResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.OcrCreditcardocrForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /ocr_driverlicenseocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ocrDriverlicenseocrURI = "/ocr/ocr_driverlicenseocr" 11 | ) 12 | 13 | // OcrDriverlicenseocrForBase64 行驶证驾驶证OCR识别 - 图片为base64格式 14 | // t 识别类型,0-行驶证识别,1-驾驶证识别 15 | // image 图片base64后字符串 16 | func (ai *TxAi) OcrDriverlicenseocrForBase64(t int, image string) (*OcrResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("type", fmt.Sprint(t)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ocrResponse := new(OcrResponse) 24 | err := ai.RequestAPI(ocrDriverlicenseocrURI, params, ocrResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ocrResponse, nil 29 | } 30 | 31 | // OcrDriverlicenseocrForPath 行驶证驾驶证OCR识别 - 图片为本地路径 32 | // t 识别类型,0-行驶证识别,1-驾驶证识别 33 | // imagePath 本地图片路径 34 | func (ai *TxAi) OcrDriverlicenseocrForPath(t int, imagePath string) (*OcrResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.OcrDriverlicenseocrForBase64(t, img) 41 | } 42 | -------------------------------------------------------------------------------- /ocr_generalocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrGeneralocrURI = "/ocr/ocr_generalocr" 10 | ) 11 | 12 | // OcrGeneralocrForBase64 银行卡OCR识别 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrGeneralocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ocrResponse := new(OcrResponse) 21 | err := ai.RequestAPI(ocrGeneralocrURI, params, ocrResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ocrResponse, nil 26 | } 27 | 28 | // OcrGeneralocrForPath 银行卡OCR识别 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) OcrGeneralocrForPath(imagePath string) (*OcrResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.OcrGeneralocrForBase64(img) 37 | } 38 | -------------------------------------------------------------------------------- /ocr_handwritingocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrHandwritingocrURI = "/ocr/ocr_handwritingocr" 10 | ) 11 | 12 | // OcrHandwritingocrForBase64 手写体OCR - 检测和识别图像上面手写体的字段信息 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrHandwritingocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ocrResponse := new(OcrResponse) 21 | err := ai.RequestAPI(ocrHandwritingocrURI, params, ocrResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ocrResponse, nil 26 | } 27 | 28 | // OcrHandwritingocrForPath 手写体OCR - 检测和识别图像上面手写体的字段信息 - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) OcrHandwritingocrForPath(imagePath string) (*OcrResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.OcrHandwritingocrForBase64(img) 37 | } 38 | 39 | // OcrHandwritingocrForURL 手写体OCR - 检测和识别图像上面手写体的字段信息 - 图片为url地址 40 | // imageURL 待识别图片url 41 | func (ai *TxAi) OcrHandwritingocrForURL(imageURL string) (*OcrResponse, error) { 42 | params := ai.getPublicParams() 43 | params.Add("image_url", imageURL) 44 | sign := ai.getReqSign(params) 45 | params.Add("sign", sign) 46 | // 响应结果 47 | ocrResponse := new(OcrResponse) 48 | err := ai.RequestAPI(ocrHandwritingocrURI, params, ocrResponse) 49 | if err != nil { 50 | return nil, err 51 | } 52 | return ocrResponse, nil 53 | } 54 | -------------------------------------------------------------------------------- /ocr_idcardocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ocrIdcardocrURL = "/ocr/ocr_idcardocr" 11 | ) 12 | 13 | // OcrIdcardocrForBase64 身份证OCR识别 - 图片为base64格式 14 | // cardType 身份证图片类型,0-正面,1-反面 15 | // image 图片base64后字符串 16 | func (ai *TxAi) OcrIdcardocrForBase64(cardType int, image string) (*OcrIDCardResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("card_type", fmt.Sprint(cardType)) 19 | params.Add("image", image) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | idCardResponse := new(OcrIDCardResponse) 24 | err := ai.RequestAPI(ocrIdcardocrURL, params, idCardResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return idCardResponse, nil 29 | } 30 | 31 | // OcrIdcardocrForPath 身份证OCR识别 - 图片为本地路径 32 | // cardType 身份证图片类型,0-正面,1-反面 33 | // imagePath 本地图片路径 34 | func (ai *TxAi) OcrIdcardocrForPath(cardType int, imagePath string) (*OcrIDCardResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.OcrIdcardocrForBase64(cardType, img) 41 | } 42 | -------------------------------------------------------------------------------- /ocr_plateocr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ocrPlateocrURI = "/ocr/ocr_plateocr" 10 | ) 11 | 12 | // OcrPlateocrForBase64 车牌OCR - 识别车牌上面的字段信息 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) OcrPlateocrForBase64(image string) (*OcrResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ocrResponse := new(OcrResponse) 21 | err := ai.RequestAPI(ocrPlateocrURI, params, ocrResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ocrResponse, nil 26 | } 27 | 28 | // OcrPlateocrForPath 车牌OCR - 图片为本地路径 29 | // imagePath 本地图片路径 30 | func (ai *TxAi) OcrPlateocrForPath(imagePath string) (*OcrResponse, error) { 31 | body, err := ioutil.ReadFile(imagePath) 32 | if err != nil { 33 | return nil, err 34 | } 35 | img := base64.StdEncoding.EncodeToString(body) 36 | return ai.OcrPlateocrForBase64(img) 37 | } 38 | 39 | // OcrPlateocrForURL 车牌OCR - 识别车牌上面的字段信息 - 图片为url地址 40 | // imageURL 待识别图片url 41 | func (ai *TxAi) OcrPlateocrForURL(imageURL string) (*OcrResponse, error) { 42 | params := ai.getPublicParams() 43 | params.Add("image_url", imageURL) 44 | sign := ai.getReqSign(params) 45 | params.Add("sign", sign) 46 | // 响应结果 47 | ocrResponse := new(OcrResponse) 48 | err := ai.RequestAPI(ocrPlateocrURI, params, ocrResponse) 49 | if err != nil { 50 | return nil, err 51 | } 52 | return ocrResponse, nil 53 | } 54 | -------------------------------------------------------------------------------- /ptu_faceage.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | ptuFaceageURI = "/ptu/ptu_faceage" 10 | ) 11 | 12 | // PtuFaceageForBase64 颜龄检测 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) PtuFaceageForBase64(image string) (*PtuResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | ptuResponse := new(PtuResponse) 21 | err := ai.RequestAPI(ptuFaceageURI, params, ptuResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | return ptuResponse, nil 26 | } 27 | 28 | // PtuFaceageForPath 颜龄检测 - 图片为本地路径 29 | // image 图片base64后字符串 30 | // sticker 变妆编码,定义见 https://ai.qq.com/doc/facesticker.shtml 31 | func (ai *TxAi) PtuFaceageForPath(imagePath string) (*PtuResponse, error) { 32 | body, err := ioutil.ReadFile(imagePath) 33 | if err != nil { 34 | return nil, err 35 | } 36 | img := base64.StdEncoding.EncodeToString(body) 37 | return ai.PtuFaceageForBase64(img) 38 | } 39 | -------------------------------------------------------------------------------- /ptu_facecosmetic.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ptuFacecosmeticURI = "/ptu/ptu_facecosmetic" 11 | ) 12 | 13 | // PtuFacecosmeticForBase64 人脸美妆 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // cosmetic 美妆编码,定义见 https://ai.qq.com/doc/facecosmetic.shtml 16 | func (ai *TxAi) PtuFacecosmeticForBase64(image string, cosmetic int) (*PtuResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("cosmetic", fmt.Sprint(cosmetic)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ptuResponse := new(PtuResponse) 24 | err := ai.RequestAPI(ptuFacecosmeticURI, params, ptuResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ptuResponse, nil 29 | } 30 | 31 | // PtuFacecosmeticForPath 人脸美妆 - 图片为本地路径 32 | // imagePath 本地图片路径 33 | // cosmetic 美妆编码,定义见 https://ai.qq.com/doc/facecosmetic.shtml 34 | func (ai *TxAi) PtuFacecosmeticForPath(imagePath string, cosmetic int) (*PtuResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.PtuFacecosmeticForBase64(img, cosmetic) 41 | } 42 | -------------------------------------------------------------------------------- /ptu_facedecoration.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ptuFacedecorationURI = "/ptu/ptu_facedecoration" 11 | ) 12 | 13 | // PtuFacedecorationForBase64 人脸变妆 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // decoration 变妆编码,定义见 https://ai.qq.com/doc/facedecoration.shtml 16 | func (ai *TxAi) PtuFacedecorationForBase64(image string, decoration int) (*PtuResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("decoration", fmt.Sprint(decoration)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ptuResponse := new(PtuResponse) 24 | err := ai.RequestAPI(ptuFacedecorationURI, params, ptuResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ptuResponse, nil 29 | } 30 | 31 | // PtuFacedecorationForPath 人脸变妆 - 图片为本地路径 32 | // imagePath 本地图片路径 33 | // decoration 变妆编码,定义见 https://ai.qq.com/doc/facedecoration.shtml 34 | func (ai *TxAi) PtuFacedecorationForPath(imagePath string, decoration int) (*PtuResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.PtuFacedecorationForBase64(img, decoration) 41 | } 42 | -------------------------------------------------------------------------------- /ptu_facemerge.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ptuFacemergeURI = "/ptu/ptu_facemerge" 11 | ) 12 | 13 | // PtuFacemergeForBase64 人脸融合 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // model 变妆编码,定义见 https://ai.qq.com/doc/facemerge.shtml 16 | func (ai *TxAi) PtuFacemergeForBase64(image string, model int) (*PtuResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("model", fmt.Sprint(model)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ptuResponse := new(PtuResponse) 24 | err := ai.RequestAPI(ptuFacemergeURI, params, ptuResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ptuResponse, nil 29 | } 30 | 31 | // PtuFacemergeForPath 人脸融合 - 图片为本地路径 32 | // image 图片base64后字符串 33 | // model 变妆编码,定义见 https://ai.qq.com/doc/facemerge.shtml 34 | func (ai *TxAi) PtuFacemergeForPath(imagePath string, model int) (*PtuResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.PtuFacemergeForBase64(img, model) 41 | } 42 | -------------------------------------------------------------------------------- /ptu_facesticker.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ptuFacestickerURI = "/ptu/ptu_facesticker" 11 | ) 12 | 13 | // PtuFacestickerForBase64 大头贴 - 图片为base64格式 14 | // image 图片base64后字符串 15 | // sticker 变妆编码,定义见 https://ai.qq.com/doc/facesticker.shtml 16 | func (ai *TxAi) PtuFacestickerForBase64(image string, sticker int) (*PtuResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("sticker", fmt.Sprint(sticker)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ptuResponse := new(PtuResponse) 24 | err := ai.RequestAPI(ptuFacestickerURI, params, ptuResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ptuResponse, nil 29 | } 30 | 31 | // PtuFacestickerForPath 大头贴 - 图片为本地路径 32 | // image 图片base64后字符串 33 | // sticker 变妆编码,定义见 https://ai.qq.com/doc/facesticker.shtml 34 | func (ai *TxAi) PtuFacestickerForPath(imagePath string, sticker int) (*PtuResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.PtuFacestickerForBase64(img, sticker) 41 | } 42 | -------------------------------------------------------------------------------- /ptu_imgfilter.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | ptuImgfilterURI = "/ptu/ptu_imgfilter" 11 | ) 12 | 13 | // PtuImgfilterForBase64 图片滤镜(天天P图) - 图片为base64格式 14 | // image 图片base64后字符串 15 | // filter 变妆编码,定义见 https://ai.qq.com/doc/ptuimgfilter.shtml 16 | func (ai *TxAi) PtuImgfilterForBase64(image string, filter int) (*PtuResponse, error) { 17 | params := ai.getPublicParams() 18 | params.Add("image", image) 19 | params.Add("filter", fmt.Sprint(filter)) 20 | sign := ai.getReqSign(params) 21 | params.Add("sign", sign) 22 | // 响应结果 23 | ptuResponse := new(PtuResponse) 24 | err := ai.RequestAPI(ptuImgfilterURI, params, ptuResponse) 25 | if err != nil { 26 | return nil, err 27 | } 28 | return ptuResponse, nil 29 | } 30 | 31 | // PtuImgfilterForPath 图片滤镜(天天P图) - 图片为本地路径 32 | // imagePath 本地图片路径 33 | // filter 变妆编码,定义见 https://ai.qq.com/doc/ptuimgfilter.shtml 34 | func (ai *TxAi) PtuImgfilterForPath(imagePath string, filter int) (*PtuResponse, error) { 35 | body, err := ioutil.ReadFile(imagePath) 36 | if err != nil { 37 | return nil, err 38 | } 39 | img := base64.StdEncoding.EncodeToString(body) 40 | return ai.PtuImgfilterForBase64(img, filter) 41 | } 42 | -------------------------------------------------------------------------------- /request.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "io/ioutil" 7 | "log" 8 | "net/http" 9 | "net/url" 10 | "strings" 11 | 12 | "github.com/axgle/mahonia" 13 | ) 14 | 15 | // http 请求 16 | 17 | // HttpPost 发起POST请求 18 | func (ai *TxAi) HttpPost(url string, u url.Values) (respBody []byte, err error) { 19 | contentType := "application/x-www-form-urlencoded" 20 | client := http.Client{Timeout: ai.timeout} 21 | request, err := http.NewRequest("POST", url, strings.NewReader(u.Encode())) 22 | if err != nil { 23 | return nil, err 24 | } 25 | request.Header.Set("Content-Type", contentType) 26 | resp, err := client.Do(request) 27 | if err != nil { 28 | return nil, err 29 | } 30 | if resp.StatusCode != 200 { 31 | return nil, errors.New(resp.Status) 32 | } 33 | respBody, err = ioutil.ReadAll(resp.Body) 34 | 35 | return respBody, err 36 | } 37 | 38 | // HttpGet 发起GET请求 39 | func (ai *TxAi) HttpGet(url string, u url.Values) (respBody []byte, err error) { 40 | // log.Println(u.Encode()) 41 | client := http.Client{Timeout: ai.timeout} 42 | request, err := http.NewRequest("GET", url+"?"+u.Encode(), nil) 43 | if err != nil { 44 | return nil, err 45 | } 46 | resp, err := client.Do(request) 47 | if err != nil { 48 | return nil, err 49 | } 50 | if resp.StatusCode != 200 { 51 | return nil, errors.New(resp.Status) 52 | } 53 | respBody, err = ioutil.ReadAll(resp.Body) 54 | 55 | return respBody, err 56 | } 57 | 58 | // RequestAPI 发起请求,并解析响应结果 59 | func (ai *TxAi) RequestAPI(uri string, u url.Values, response BaseResponseInterface) (err error) { 60 | apiURL := BaseURL + uri 61 | if ai.debug == true { 62 | log.Println("Request-URI:", apiURL) 63 | log.Println("Request-Body:", u) 64 | } 65 | // 发起请求 66 | var body []byte 67 | // 只有aaiEvilaudioURI需要必须是get请求 68 | if uri == aaiEvilaudioURI { 69 | body, err = ai.HttpGet(apiURL, u) 70 | } else { 71 | body, err = ai.HttpPost(apiURL, u) 72 | } 73 | 74 | if err != nil { 75 | return err 76 | } 77 | if ai.debug == true { 78 | log.Println("Response-Body", string(body)) 79 | } 80 | // log.Println(u) 81 | // log.Println(string(body)) 82 | // 判断是否是gbk参数的接口 83 | switch uri { 84 | case nlpWordsegURI, nlpWordposURI, nlpWordnerURI, nlpWordsynURI: 85 | enc := mahonia.NewDecoder("gbk") 86 | body = []byte(enc.ConvertString(string(body))) 87 | break 88 | } 89 | // 解析json数据 90 | err = json.Unmarshal(body, response) 91 | if err != nil { 92 | return err 93 | } 94 | ret := response.GetRet() 95 | if ret != 0 { 96 | return GetError(ret) 97 | } 98 | return nil 99 | } 100 | -------------------------------------------------------------------------------- /txai.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/base64" 6 | "errors" 7 | "fmt" 8 | "io/ioutil" 9 | "net/http" 10 | "net/url" 11 | "strings" 12 | "time" 13 | 14 | "github.com/goroom/rand" 15 | ) 16 | 17 | const ( 18 | // BaseURL 腾讯ai接口根地址 19 | BaseURL = "https://api.ai.qq.com/fcgi-bin" 20 | ) 21 | 22 | // TxAi 腾讯ai sqk 23 | type TxAi struct { 24 | AppID string // AppID 从腾讯AI控制台获取 25 | AppKey string // AppKey 从腾讯AI控制台获取 26 | timeout time.Duration // http请求超时 27 | debug bool // 是否调试 28 | } 29 | 30 | // New 创建一个sdk操作对象 := gorequest.New() 31 | func New(appID, appKey string, debug bool) *TxAi { 32 | txAi := &TxAi{ 33 | AppID: appID, 34 | AppKey: appKey, 35 | timeout: 30 * time.Second, 36 | debug: debug, 37 | } 38 | return txAi 39 | } 40 | 41 | // SetDebug 设置是否调试模式 42 | func (ai *TxAi) SetDebug(debug bool) { 43 | ai.debug = debug 44 | } 45 | 46 | // SetRequestTimeout 设置超时时间 47 | func (ai *TxAi) SetRequestTimeout(d time.Duration) { 48 | if d == 0 { 49 | d = 30 * time.Second 50 | } 51 | ai.timeout = d 52 | } 53 | 54 | // URLToBase64 读取url返回base64字符串 55 | func (ai *TxAi) URLToBase64(imageURL string) (string, error) { 56 | client := http.Client{Timeout: ai.timeout} 57 | resp, err := client.Get(imageURL) 58 | if err != nil { 59 | return "", err 60 | } 61 | if resp.StatusCode != 200 { 62 | return "", errors.New(resp.Status) 63 | } 64 | body, err := ioutil.ReadAll(resp.Body) 65 | if err != nil { 66 | return "", err 67 | } 68 | img := base64.StdEncoding.EncodeToString(body) 69 | return img, nil 70 | } 71 | 72 | // 计算签名 73 | func (ai *TxAi) getReqSign(u url.Values) (sign string) { 74 | byte := []byte(fmt.Sprintf("%s&%s=%s", u.Encode(), "app_key", ai.AppKey)) 75 | // 计算md5值 76 | newmd := md5.New() 77 | newmd.Write(byte) 78 | sign_byte := newmd.Sum(nil) 79 | sign = strings.ToUpper(fmt.Sprintf("%x", sign_byte)) 80 | return sign 81 | } 82 | 83 | // 生成随机字符串 84 | func (ai *TxAi) nonceStr() string { 85 | return rand.GetRand().String(16, rand.RST_NUMBER) 86 | } 87 | 88 | // 获取公共参数 89 | func (ai *TxAi) getPublicParams() (u url.Values) { 90 | u = url.Values{} 91 | u.Add("app_id", ai.AppID) 92 | u.Add("time_stamp", fmt.Sprint(time.Now().Unix())) 93 | u.Add("nonce_str", ai.nonceStr()) 94 | return 95 | } 96 | -------------------------------------------------------------------------------- /vision_imgfilter.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "fmt" 6 | "io/ioutil" 7 | ) 8 | 9 | var ( 10 | visionImgfilterURI = "/vision/vision_imgfilter" 11 | ) 12 | 13 | // VisionImgfilterForBase64 图片滤镜(AI Lab) - 图片为base64格式 14 | // image 图片base64后字符串 15 | // session_id 一次请求ID 尽可能唯一,长度上限64字节 16 | // filter 变妆编码,定义见 https://ai.qq.com/doc/ptuimgfilter.shtml 17 | func (ai *TxAi) VisionImgfilterForBase64(image, sessionId string, filter int) (*PtuResponse, error) { 18 | params := ai.getPublicParams() 19 | params.Add("image", image) 20 | params.Add("session_id", sessionId) 21 | params.Add("filter", fmt.Sprint(filter)) 22 | sign := ai.getReqSign(params) 23 | params.Add("sign", sign) 24 | // 响应结果 25 | ptuResponse := new(PtuResponse) 26 | err := ai.RequestAPI(visionImgfilterURI, params, ptuResponse) 27 | if err != nil { 28 | return nil, err 29 | } 30 | return ptuResponse, nil 31 | } 32 | 33 | // VisionImgfilterForPath 图片滤镜(AI Lab) - 图片为本地路径 34 | // imagePath 本地图片路径 35 | // session_id 一次请求ID 尽可能唯一,长度上限64字节 36 | // filter 变妆编码,定义见 https://ai.qq.com/doc/ptuimgfilter.shtml 37 | func (ai *TxAi) VisionImgfilterForPath(imagePath, sessionId string, filter int) (*PtuResponse, error) { 38 | body, err := ioutil.ReadFile(imagePath) 39 | if err != nil { 40 | return nil, err 41 | } 42 | img := base64.StdEncoding.EncodeToString(body) 43 | return ai.VisionImgfilterForBase64(img, sessionId, filter) 44 | } 45 | -------------------------------------------------------------------------------- /vision_imgtotext.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | visionImgtotextURI = "/vision/vision_imgtotext" 10 | ) 11 | 12 | // VisionImgtotextForBase64 看图说话 - 图片为base64格式 13 | // image 图片base64后字符串 14 | // sessionId 一次请求ID 尽可能唯一,长度上限64字节 15 | func (ai *TxAi) VisionImgtotextForBase64(image, sessionId string) (*VisionImgtotextResponse, error) { 16 | params := ai.getPublicParams() 17 | params.Add("image", image) 18 | params.Add("session_id", sessionId) 19 | sign := ai.getReqSign(params) 20 | params.Add("sign", sign) 21 | // 响应结果 22 | visionImgtotextResponse := new(VisionImgtotextResponse) 23 | err := ai.RequestAPI(visionImgtotextURI, params, visionImgtotextResponse) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return visionImgtotextResponse, nil 28 | } 29 | 30 | // VisionImgtotextForPath 行驶证驾驶证OCR识别 - 图片为本地路径 31 | // imagePath 本地图片路径 32 | // sessionId 一次请求ID 尽可能唯一,长度上限64字节 33 | func (ai *TxAi) VisionImgtotextForPath(imagePath, sessionId string) (*VisionImgtotextResponse, error) { 34 | body, err := ioutil.ReadFile(imagePath) 35 | if err != nil { 36 | return nil, err 37 | } 38 | img := base64.StdEncoding.EncodeToString(body) 39 | return ai.VisionImgtotextForBase64(img, sessionId) 40 | } 41 | -------------------------------------------------------------------------------- /vision_objectr.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "errors" 6 | "fmt" 7 | "io/ioutil" 8 | ) 9 | 10 | var ( 11 | visionObjectrURI = "/vision/vision_objectr" 12 | ) 13 | 14 | // VisionObjectrForBase64 物体识别 - 图片为base64格式 15 | // 对图片进行物体识别,快速找出图片中包含的物体信息 16 | // image 图片base64后字符串 17 | // format 图片格式,暂时只支持1 JPG格式(image/jpeg) 18 | // topk 返回结果个数(已按置信度倒排) 19 | func (ai *TxAi) VisionObjectrForBase64(image string, format, topk int) (*VisionObjectrResponse, error) { 20 | if topk < 1 || topk > 5 { 21 | return nil, errors.New("topk range from 1 to 5") 22 | } 23 | if format != 1 { 24 | return nil, errors.New("The picture format can only be jpg [format=1]") 25 | } 26 | 27 | params := ai.getPublicParams() 28 | params.Add("image", image) 29 | params.Add("format", fmt.Sprint(format)) 30 | params.Add("topk", fmt.Sprint(topk)) 31 | sign := ai.getReqSign(params) 32 | params.Add("sign", sign) 33 | // 响应结果 34 | visionObjectrResponse := new(VisionObjectrResponse) 35 | err := ai.RequestAPI(visionObjectrURI, params, visionObjectrResponse) 36 | if err != nil { 37 | return nil, err 38 | } 39 | // 添加场景名 40 | for _, v := range visionObjectrResponse.Data.ObjectList { 41 | v.LabelName = VisionObjectrNames[v.LabelID] 42 | } 43 | return visionObjectrResponse, nil 44 | } 45 | 46 | // VisionObjectrForPath 物体识别 - 图片为本地路径 47 | // 对图片进行物体识别,快速找出图片中包含的物体信息 48 | // imagePath 本地图片路径 49 | // format 图片格式,暂时只支持1 JPG格式(image/jpeg) 50 | // topk 返回结果个数(已按置信度倒排) 51 | func (ai *TxAi) VisionObjectrForPath(imagePath string, format, topk int) (*VisionObjectrResponse, error) { 52 | body, err := ioutil.ReadFile(imagePath) 53 | if err != nil { 54 | return nil, err 55 | } 56 | img := base64.StdEncoding.EncodeToString(body) 57 | return ai.VisionObjectrForBase64(img, format, topk) 58 | } 59 | -------------------------------------------------------------------------------- /vision_objectr_names.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var VisionObjectrNames = map[int]string{ 4 | 0: "鲤鱼", 5 | 1: "金鱼", 6 | 2: "大白鲨", 7 | 3: "虎鲨", 8 | 4: "锤头鲨", 9 | 5: "电鳗", 10 | 6: "黄貂鱼", 11 | 7: "公鸡", 12 | 8: "母鸡", 13 | 9: "鸵鸟", 14 | 10: "燕雀", 15 | 11: "金翅雀", 16 | 12: "朱雀", 17 | 13: "雪鸟", 18 | 14: "雀鸟", 19 | 15: "美洲知更鸟", 20 | 16: "鹎", 21 | 17: "松鸦", 22 | 18: "喜鹊", 23 | 19: "山雀", 24 | 20: "河鸟", 25 | 21: "风筝", 26 | 22: "秃头鹰", 27 | 23: "秃鹫", 28 | 24: "大灰猫头鹰", 29 | 25: "欧洲火蝾螈", 30 | 26: "蝾螈", 31 | 27: "水蜥蜴", 32 | 28: "斑点蝾螈", 33 | 29: "美西螈", 34 | 30: "牛蛙", 35 | 31: "树蛙", 36 | 32: "尾蟾", 37 | 33: "红海龟", 38 | 34: "棱皮龟", 39 | 35: "泥龟", 40 | 36: "鳖", 41 | 37: "箱龟", 42 | 38: "条纹壁虎", 43 | 39: "绿鬣蜥", 44 | 40: "美国变色龙", 45 | 41: "鞭尾蜥蜴", 46 | 42: "飞龙科蜥蜴", 47 | 43: "皱褶蜥蜴", 48 | 44: "鳄蜥", 49 | 45: "毒蜥", 50 | 46: "绿蜥蜴", 51 | 47: "非洲变色龙", 52 | 48: "科莫多龙", 53 | 49: "非洲鳄鱼", 54 | 50: "美国短吻鳄", 55 | 51: "三角龙", 56 | 52: "雷霆蛇", 57 | 53: "环颈蛇", 58 | 54: "猪鼻蛇", 59 | 55: "绿蛇", 60 | 56: "大王蛇", 61 | 57: "乌梢蛇", 62 | 58: "水蛇", 63 | 59: "藤蛇", 64 | 60: "夜蛇", 65 | 61: "蟒蛇", 66 | 62: "岩蟒", 67 | 63: "印度眼镜蛇", 68 | 64: "曼巴蛇", 69 | 65: "海蛇", 70 | 66: "角蝰", 71 | 67: "响尾蛇", 72 | 68: "角响尾蛇", 73 | 69: "三叶虫", 74 | 70: "喜蛛", 75 | 71: "蝎子", 76 | 72: "金园蛛", 77 | 73: "仓蜘", 78 | 74: "园蛛", 79 | 75: "黑寡妇", 80 | 76: "狼蛛", 81 | 77: "狼蛛", 82 | 78: "扁虱", 83 | 79: "蜈蚣", 84 | 80: "黑琴鸡", 85 | 81: "雷鸟", 86 | 82: "鹧鸪", 87 | 83: "草原鸡", 88 | 84: "孔雀", 89 | 85: "鹌鹑", 90 | 86: "鹧鸪", 91 | 87: "非洲灰鹦鹉", 92 | 88: "金刚鹦鹉", 93 | 89: "葵花凤头鹦鹉", 94 | 90: "吸蜜鹦鹉", 95 | 91: "鸦鹃", 96 | 92: "蜂虎", 97 | 93: "犀鸟", 98 | 94: "蜂鸟", 99 | 95: "食虫鸟", 100 | 96: "巨嘴鸟", 101 | 97: "公鸭", 102 | 98: "红胸秋沙鸭", 103 | 99: "鹅", 104 | 100: "黑天鹅", 105 | 101: "塔斯克", 106 | 102: "食蚁兽", 107 | 103: "鸭嘴兽", 108 | 104: "袋鼠", 109 | 105: "考拉", 110 | 106: "袋熊", 111 | 107: "水母", 112 | 108: "海葵", 113 | 109: "脑珊瑚", 114 | 110: "扁虫扁形动物", 115 | 111: "线虫", 116 | 112: "海螺", 117 | 113: "蜗牛", 118 | 114: "鼻涕虫", 119 | 115: "裸鳃海蛞蝓", 120 | 116: "石鳖", 121 | 117: "鹦鹉螺", 122 | 118: "珍宝蟹", 123 | 119: "岩石蟹", 124 | 120: "招潮蟹", 125 | 121: "皇帝蟹", 126 | 122: "美国龙虾", 127 | 123: "龙虾", 128 | 124: "小龙虾", 129 | 125: "寄居蟹", 130 | 126: "等足目动物", 131 | 127: "白鹳", 132 | 128: "黑鹳", 133 | 129: "琵鹭", 134 | 130: "火烈鸟", 135 | 131: "小蓝鹭", 136 | 132: "大白鹭", 137 | 133: "麻鸦", 138 | 134: "鹤", 139 | 135: "锦鸡", 140 | 136: "欧洲水鸡", 141 | 137: "美国黑鸭", 142 | 138: "鸨", 143 | 139: "翻石鹬", 144 | 140: "红背鹬", 145 | 141: "红脚鹬", 146 | 142: "半蹼鹬", 147 | 143: "蛎鹬", 148 | 144: "鹈鹕", 149 | 145: "帝企鹅", 150 | 146: "大海鸟", 151 | 147: "灰鲸", 152 | 148: "虎鲸", 153 | 149: "儒艮", 154 | 150: "海狮", 155 | 151: "墨西哥狗", 156 | 152: "日本猎犬", 157 | 153: "马尔济斯犬", 158 | 154: "哈巴狗", 159 | 155: "狮子狗", 160 | 156: "布莱尼姆猎犬", 161 | 157: "巴比", 162 | 158: "玩具犬", 163 | 159: "罗得西亚脊背犬", 164 | 160: "阿富汗猎犬", 165 | 161: "猎犬", 166 | 162: "比格犬", 167 | 163: "侦探猎犬", 168 | 164: "蓝斑猎狗", 169 | 165: "猎浣熊犬", 170 | 166: "沃克犬", 171 | 167: "英国猎狐犬", 172 | 168: "美洲赤狗", 173 | 169: "俄罗斯猎狼犬", 174 | 170: "爱尔兰猎狼犬", 175 | 171: "意大利灵缇犬", 176 | 172: "惠比特犬", 177 | 173: "依比沙猎犬", 178 | 174: "挪威猎犬", 179 | 175: "奥达猎犬", 180 | 176: "沙克犬瞪羚猎犬", 181 | 177: "苏格兰猎鹿犬", 182 | 178: "威玛猎犬", 183 | 179: "斯塔福德郡斗牛犬", 184 | 180: "美国斗牛犬", 185 | 181: "贝德灵顿犬", 186 | 182: "博德猎狐犬", 187 | 183: "凯丽蓝犬", 188 | 184: "爱尔兰犬", 189 | 185: "诺福克犬", 190 | 186: "诺维奇犬", 191 | 187: "约克郡犬", 192 | 188: "刚毛猎狐犬", 193 | 189: "莱克兰犬", 194 | 190: "锡利哈姆犬", 195 | 191: "艾尔谷犬", 196 | 192: "凯恩犬", 197 | 193: "澳大利亚犬", 198 | 194: "英国小猎犬", 199 | 195: "波士顿犬", 200 | 196: "迷你雪纳瑞", 201 | 197: "巨型雪纳瑞", 202 | 198: "标准雪纳瑞", 203 | 199: "苏格兰犬", 204 | 200: "菊花狗", 205 | 201: "丝毛狗", 206 | 202: "爱尔兰软毛犬", 207 | 203: "西部高地白犬", 208 | 204: "拉萨,拉萨犬", 209 | 205: "平滑毛寻回犬", 210 | 206: "卷毛寻回犬", 211 | 207: "金毛猎犬", 212 | 208: "拉布拉多猎犬", 213 | 209: "乞沙比克猎犬", 214 | 210: "德国短毛猎犬", 215 | 211: "匈牙利维兹拉犬", 216 | 212: "英国赛特犬", 217 | 213: "爱尔兰塞特猎犬", 218 | 214: "戈登雪达犬", 219 | 215: "布列塔尼犬", 220 | 216: "黄毛猎犬", 221 | 217: "英国史宾格犬", 222 | 218: "威尔士激飞猎犬", 223 | 219: "英国可卡犬", 224 | 220: "萨塞克斯猎犬", 225 | 221: "爱尔兰水猎犬", 226 | 222: "哥威斯犬", 227 | 223: "舒柏奇犬", 228 | 224: "牧羊犬", 229 | 225: "马里努阿犬", 230 | 226: "伯瑞犬", 231 | 227: "澳大利亚护羊犬", 232 | 228: "可蒙犬", 233 | 229: "英国牧羊犬", 234 | 230: "喜乐蒂牧羊犬", 235 | 231: "牧羊犬", 236 | 232: "边境牧羊犬", 237 | 233: "法兰德斯畜牧犬", 238 | 234: "罗威犬", 239 | 235: "德国牧羊犬", 240 | 236: "杜宾犬", 241 | 237: "迷你杜宾犬", 242 | 238: "大瑞士山犬", 243 | 239: "伯恩山犬", 244 | 240: "阿彭策尔勒犬", 245 | 241: "恩特雷布赫山犬", 246 | 242: "拳狮犬", 247 | 243: "斗牛獒犬", 248 | 244: "藏獒", 249 | 245: "法国斗牛犬", 250 | 246: "大丹犬", 251 | 247: "圣伯纳德狗", 252 | 248: "爱斯基摩犬", 253 | 249: "雪橇犬", 254 | 250: "西伯利亚雪橇犬", 255 | 251: "达尔马提亚", 256 | 252: "猴犬", 257 | 253: "巴辛吉", 258 | 254: "哈巴狗", 259 | 255: "兰伯格犬", 260 | 256: "纽芬兰犬", 261 | 257: "大白熊犬", 262 | 258: "萨摩犬", 263 | 259: "博美犬", 264 | 260: "松狮犬", 265 | 261: "荷兰毛狮犬", 266 | 262: "布鲁塞尔格林芬犬", 267 | 263: "潘布魯克威尔斯柯基犬", 268 | 264: "卡迪根威尔士柯基犬", 269 | 265: "玩具型贵宾犬", 270 | 266: "迷你型贵宾犬", 271 | 267: "标准型贵宾犬", 272 | 268: "墨西哥无毛犬", 273 | 269: "灰狼", 274 | 270: "白狼", 275 | 271: "红狼", 276 | 272: "草原狼", 277 | 273: "澳洲野犬", 278 | 274: "豺狗", 279 | 275: "三色犬", 280 | 276: "鬣狗", 281 | 277: "红狐狸", 282 | 278: "美洲小狐", 283 | 279: "北极狐", 284 | 280: "灰色的狐狸", 285 | 281: "虎斑", 286 | 282: "猫虎", 287 | 283: "波斯猫", 288 | 284: "暹罗暹罗猫", 289 | 285: "埃及猫", 290 | 286: "美洲狮", 291 | 287: "猞猁", 292 | 288: "豹", 293 | 289: "雪豹", 294 | 290: "美洲虎", 295 | 291: "狮子", 296 | 292: "虎", 297 | 293: "猎豹", 298 | 294: "棕熊", 299 | 295: "黑熊", 300 | 296: "北极熊", 301 | 297: "懒熊", 302 | 298: "猫鼬", 303 | 299: "狐獴", 304 | 300: "虎甲虫", 305 | 301: "瓢虫", 306 | 302: "地面甲虫", 307 | 303: "天牛", 308 | 304: "叶甲", 309 | 305: "粪甲虫", 310 | 306: "犀甲虫", 311 | 307: "象甲", 312 | 308: "飞", 313 | 309: "蜜蜂", 314 | 310: "蚂蚁", 315 | 311: "蚱蜢", 316 | 312: "蟋蟀", 317 | 313: "竹节虫", 318 | 314: "蟑螂", 319 | 315: "螳螂", 320 | 316: "蝉", 321 | 317: "叶蝉", 322 | 318: "中华草蛉", 323 | 319: "蜻蜓,大蚊", 324 | 320: "豆娘", 325 | 321: "花蝶", 326 | 322: "小环蝴蝶", 327 | 323: "帝王蝶", 328 | 324: "菜粉蝶", 329 | 325: "硫蝴蝶", 330 | 326: "灰蝶", 331 | 327: "海星", 332 | 328: "海胆", 333 | 329: "海参", 334 | 330: "木兔", 335 | 331: "野兔", 336 | 332: "兔", 337 | 333: "仓鼠", 338 | 334: "刺猬", 339 | 335: "东方狐松鼠", 340 | 336: "土拨鼠", 341 | 337: "海狸", 342 | 338: "豚鼠", 343 | 339: "酢浆草", 344 | 340: "斑马", 345 | 341: "猪", 346 | 342: "野猪", 347 | 343: "疣猪", 348 | 344: "河马", 349 | 345: "公牛", 350 | 346: "水牛", 351 | 347: "野牛", 352 | 348: "公羊", 353 | 349: "大角羊", 354 | 350: "山羊", 355 | 351: "狷羚", 356 | 352: "黑斑羚", 357 | 353: "瞪羚", 358 | 354: "阿拉伯骆驼", 359 | 355: "美洲驼", 360 | 356: "黄鼠狼", 361 | 357: "水貂", 362 | 358: "艾鼬", 363 | 359: "黑足鼬", 364 | 360: "水獭", 365 | 361: "臭鼬", 366 | 362: "獾", 367 | 363: "犰狳", 368 | 364: "三趾树懒", 369 | 365: "猩猩", 370 | 366: "大猩猩", 371 | 367: "黑猩猩", 372 | 368: "长臂猿", 373 | 369: "合趾猿长臂猿", 374 | 370: "长尾猴", 375 | 371: "猴子", 376 | 372: "狒狒", 377 | 373: "猕猴", 378 | 374: "叶猴", 379 | 375: "疣", 380 | 376: "长鼻猴", 381 | 377: "狨", 382 | 378: "浣熊", 383 | 379: "吼猴", 384 | 380: "伶猴", 385 | 381: "蜘蛛猴", 386 | 382: "松鼠猴", 387 | 383: "马达加斯加猫", 388 | 384: "大狐猴", 389 | 385: "印度大象", 390 | 386: "非洲大象", 391 | 387: "小熊猫", 392 | 388: "熊猫", 393 | 389: "杖鱼", 394 | 390: "鳗鱼", 395 | 391: "银大马哈鱼", 396 | 392: "三色刺蝶鱼", 397 | 393: "海葵鱼", 398 | 394: "鲟鱼", 399 | 395: "雀鳝", 400 | 396: "狮子鱼", 401 | 397: "河豚", 402 | 398: "算盘", 403 | 399: "长袍", 404 | 400: "学位袍", 405 | 401: "手风琴", 406 | 402: "原声吉他", 407 | 403: "航母", 408 | 404: "客机", 409 | 405: "飞船", 410 | 406: "祭坛", 411 | 407: "救护车", 412 | 408: "水陆两用飞机构", 413 | 409: "模拟时钟", 414 | 410: "蜂房", 415 | 411: "围裙", 416 | 412: "垃圾桶", 417 | 413: "突击步枪", 418 | 414: "背包", 419 | 415: "面包店", 420 | 416: "平衡梁", 421 | 417: "气球", 422 | 418: "圆珠笔", 423 | 419: "创可贴", 424 | 420: "班卓琴", 425 | 421: "栏杆", 426 | 422: "杠铃", 427 | 423: "理发椅", 428 | 424: "理发店", 429 | 425: "谷仓", 430 | 426: "气压计", 431 | 427: "木桶", 432 | 428: "手推车", 433 | 429: "棒球", 434 | 430: "篮球", 435 | 431: "摇篮", 436 | 432: "巴松管", 437 | 433: "游泳帽", 438 | 434: "浴巾", 439 | 435: "浴缸", 440 | 436: "沙滩车", 441 | 437: "灯塔", 442 | 438: "烧杯", 443 | 439: "熊皮", 444 | 440: "啤酒瓶", 445 | 441: "啤酒杯", 446 | 442: "钟架", 447 | 443: "围兜", 448 | 444: "双坐自行车", 449 | 445: "比基尼", 450 | 446: "粘合剂", 451 | 447: "望远镜", 452 | 448: "鸟舍", 453 | 449: "船屋", 454 | 450: "雪橇", 455 | 451: "波洛领带", 456 | 452: "阀盖", 457 | 453: "书柜", 458 | 454: "书店", 459 | 455: "瓶盖", 460 | 456: "弓", 461 | 457: "领结", 462 | 458: "黄铜", 463 | 459: "文胸", 464 | 460: "码头", 465 | 461: "盾牌", 466 | 462: "扫帚", 467 | 463: "水桶", 468 | 464: "搭扣", 469 | 465: "防弹背心", 470 | 466: "子弹列车", 471 | 467: "肉店", 472 | 468: "出租车", 473 | 469: "釜", 474 | 470: "蜡烛", 475 | 471: "大炮", 476 | 472: "独木舟", 477 | 473: "开罐器", 478 | 474: "开衫", 479 | 475: "车镜", 480 | 476: "旋转木马", 481 | 477: "木匠工具箱", 482 | 478: "纸箱", 483 | 479: "汽车轮", 484 | 480: "提款机", 485 | 481: "盒式录音带", 486 | 482: "磁带播放器", 487 | 483: "城堡", 488 | 484: "双体船", 489 | 485: "播放器", 490 | 486: "大提琴", 491 | 487: "蜂窝电话", 492 | 488: "链", 493 | 489: "围栏", 494 | 490: "邮件", 495 | 491: "油锯", 496 | 492: "胸部", 497 | 493: "衣柜", 498 | 494: "编钟", 499 | 495: "瓷器柜", 500 | 496: "圣诞袜", 501 | 497: "教堂", 502 | 498: "电影院", 503 | 499: "切肉刀", 504 | 500: "崖居", 505 | 501: "斗篷", 506 | 502: "木鞋", 507 | 503: "鸡尾酒调酒器", 508 | 504: "咖啡杯", 509 | 505: "咖啡壶", 510 | 506: "线圈", 511 | 507: "密码锁", 512 | 508: "电脑键盘", 513 | 509: "糖果", 514 | 510: "集装箱船", 515 | 511: "可转换", 516 | 512: "螺旋形的", 517 | 513: "喇叭", 518 | 514: "牛仔靴", 519 | 515: "牛仔帽", 520 | 516: "摇篮", 521 | 517: "起重机", 522 | 518: "头盔", 523 | 519: "箱", 524 | 520: "婴儿床", 525 | 521: "瓦罐锅", 526 | 522: "槌球", 527 | 523: "拐杖", 528 | 524: "胸甲", 529 | 525: "堤坝", 530 | 526: "书桌", 531 | 527: "台式电脑", 532 | 528: "拨号电话", 533 | 529: "尿布", 534 | 530: "数字时钟", 535 | 531: "数字手表", 536 | 532: "餐桌", 537 | 533: "抹布", 538 | 534: "洗碗机", 539 | 535: "盘式制动器", 540 | 536: "码头", 541 | 537: "狗拉雪橇", 542 | 538: "拱顶", 543 | 539: "门垫", 544 | 540: "钻井平台", 545 | 541: "鼓", 546 | 542: "鼓槌", 547 | 543: "哑铃", 548 | 544: "荷兰烤箱", 549 | 545: "电风扇", 550 | 546: "电吉他", 551 | 547: "电力机车", 552 | 548: "娱乐中心", 553 | 549: "信封", 554 | 550: "咖啡机", 555 | 551: "香粉", 556 | 552: "蟒蛇", 557 | 553: "文件", 558 | 554: "消防船", 559 | 555: "消防车", 560 | 556: "火屏", 561 | 557: "旗杆", 562 | 558: "长笛", 563 | 559: "折叠椅", 564 | 560: "橄榄球头盔", 565 | 561: "叉车", 566 | 562: "喷泉", 567 | 563: "钢笔", 568 | 564: "四柱", 569 | 565: "货运车", 570 | 566: "号角", 571 | 567: "煎锅", 572 | 568: "毛皮大衣", 573 | 569: "垃圾车", 574 | 570: "防毒面具", 575 | 571: "气泵", 576 | 572: "高脚杯", 577 | 573: "卡丁车", 578 | 574: "高尔夫球", 579 | 575: "高尔夫球车", 580 | 576: "贡多拉", 581 | 577: "锣", 582 | 578: "长袍", 583 | 579: "大钢琴", 584 | 580: "苗圃", 585 | 581: "格栅", 586 | 582: "杂货店", 587 | 583: "断头台", 588 | 584: "幻灯片", 589 | 585: "头发喷雾", 590 | 586: "半轨", 591 | 587: "铁锤", 592 | 588: "阻碍", 593 | 589: "手吹风", 594 | 590: "掌上电脑", 595 | 591: "手帕", 596 | 592: "硬盘", 597 | 593: "口风琴", 598 | 594: "竖琴", 599 | 595: "收割机", 600 | 596: "斧头", 601 | 597: "皮套", 602 | 598: "家庭影院", 603 | 599: "蜂窝", 604 | 600: "钩爪", 605 | 601: "衬裙", 606 | 602: "单杠", 607 | 603: "马车", 608 | 604: "沙漏", 609 | 605: "音乐播放器", 610 | 606: "铁", 611 | 607: "南瓜灯", 612 | 608: "牛仔裤", 613 | 609: "吉普车", 614 | 610: "T恤", 615 | 611: "拼图游戏", 616 | 612: "黄包车", 617 | 613: "操纵杆", 618 | 614: "和服", 619 | 615: "护膝", 620 | 616: "结", 621 | 617: "实验室工作服", 622 | 618: "钢包", 623 | 619: "灯罩", 624 | 620: "笔记本电脑", 625 | 621: "割草机", 626 | 622: "镜头盖", 627 | 623: "开信刀", 628 | 624: "图书馆", 629 | 625: "救生艇", 630 | 626: "打火机", 631 | 627: "豪华轿车", 632 | 628: "班轮", 633 | 629: "口红", 634 | 630: "拖鞋", 635 | 631: "洗剂", 636 | 632: "扬声器", 637 | 633: "放大镜", 638 | 634: "锯木厂", 639 | 635: "磁罗盘", 640 | 636: "邮袋", 641 | 637: "信箱", 642 | 638: "紧身衣", 643 | 639: "背带式女浴衣", 644 | 640: "窨井盖", 645 | 641: "沙球", 646 | 642: "马林巴木琴", 647 | 643: "面具", 648 | 644: "火柴", 649 | 645: "花柱", 650 | 646: "迷宫", 651 | 647: "测量杯", 652 | 648: "药箱", 653 | 649: "巨石", 654 | 650: "麦克风", 655 | 651: "微波炉", 656 | 652: "军装", 657 | 653: "奶瓶", 658 | 654: "小巴士", 659 | 655: "迷你裙", 660 | 656: "面包车", 661 | 657: "导弹", 662 | 658: "手套", 663 | 659: "搅拌碗", 664 | 660: "制造家", 665 | 661: "模型", 666 | 662: "调制解调器", 667 | 663: "修道院", 668 | 664: "监控", 669 | 665: "助力车", 670 | 666: "砂浆", 671 | 667: "学位帽", 672 | 668: "清真寺", 673 | 669: "蚊帐", 674 | 670: "摩托车", 675 | 671: "山地自行车", 676 | 672: "登山帐", 677 | 673: "鼠标", 678 | 674: "捕鼠器", 679 | 675: "移动车", 680 | 676: "枪口", 681 | 677: "指甲", 682 | 678: "颈托", 683 | 679: "项链", 684 | 680: "乳头", 685 | 681: "笔记本电脑", 686 | 682: "方尖碑", 687 | 683: "双簧管双簧管", 688 | 684: "陶笛", 689 | 685: "里程表", 690 | 686: "滤油器", 691 | 687: "风琴", 692 | 688: "示波器", 693 | 689: "罩裙", 694 | 690: "牛车", 695 | 691: "氧气面罩", 696 | 692: "小包裹", 697 | 693: "桨", 698 | 694: "明轮", 699 | 695: "挂锁", 700 | 696: "画笔", 701 | 697: "睡衣", 702 | 698: "宫殿", 703 | 699: "排箫", 704 | 700: "纸巾", 705 | 701: "降落伞", 706 | 702: "双杠杆", 707 | 703: "公园的长椅", 708 | 704: "停车收费表", 709 | 705: "客车", 710 | 706: "露台", 711 | 707: "付费电话", 712 | 708: "底座", 713 | 709: "铅笔盒", 714 | 710: "卷笔刀", 715 | 711: "香水", 716 | 712: "培养皿", 717 | 713: "复印机", 718 | 714: "挑", 719 | 715: "头盔", 720 | 716: "栅栏", 721 | 717: "皮卡", 722 | 718: "码头", 723 | 719: "储蓄银行", 724 | 720: "药瓶", 725 | 721: "枕头", 726 | 722: "乒乓球", 727 | 723: "风车", 728 | 724: "海盗船", 729 | 725: "水罐", 730 | 726: "飞机", 731 | 727: "天文馆", 732 | 728: "塑料袋", 733 | 729: "板架", 734 | 730: "犁", 735 | 731: "柱塞", 736 | 732: "宝丽来相机", 737 | 733: "极", 738 | 734: "警车", 739 | 735: "雨披", 740 | 736: "台球桌", 741 | 737: "汽水瓶", 742 | 738: "花盆", 743 | 739: "陶工的轮子", 744 | 740: "电钻", 745 | 741: "祈祷毯", 746 | 742: "打印机", 747 | 743: "监狱", 748 | 744: "导弹", 749 | 745: "投影机", 750 | 746: "冰球", 751 | 747: "沙包", 752 | 748: "钱包", 753 | 749: "羽毛笔", 754 | 750: "被子", 755 | 751: "赛车", 756 | 752: "球拍", 757 | 753: "散热器", 758 | 754: "无线电", 759 | 755: "无线电望远镜", 760 | 756: "雨桶", 761 | 757: "休闲车", 762 | 758: "卷轴", 763 | 759: "反射式照相机", 764 | 760: "冰箱", 765 | 761: "远程遥控", 766 | 762: "餐厅", 767 | 763: "左轮手枪", 768 | 764: "步枪", 769 | 765: "摇椅", 770 | 766: "烤肉店", 771 | 767: "橡皮", 772 | 768: "橄榄球", 773 | 769: "标尺", 774 | 770: "跑步鞋", 775 | 771: "保险箱", 776 | 772: "别针", 777 | 773: "盐瓶", 778 | 774: "凉鞋", 779 | 775: "布裙", 780 | 776: "萨克斯管", 781 | 777: "剑鞘", 782 | 778: "秤", 783 | 779: "校车", 784 | 780: "帆船", 785 | 781: "记分牌", 786 | 782: "屏幕", 787 | 783: "螺丝钉", 788 | 784: "螺丝刀", 789 | 785: "安全带", 790 | 786: "缝纫机", 791 | 787: "小圆盾", 792 | 788: "鞋店", 793 | 789: "障子", 794 | 790: "购物篮", 795 | 791: "购物车", 796 | 792: "铲子", 797 | 793: "淋浴帽", 798 | 794: "浴帘", 799 | 795: "滑雪", 800 | 796: "滑雪面罩", 801 | 797: "睡袋", 802 | 798: "计算尺", 803 | 799: "滑动门", 804 | 800: "赌博机", 805 | 801: "通气管", 806 | 802: "雪橇", 807 | 803: "扫雪机", 808 | 804: "皂液器", 809 | 805: "足球", 810 | 806: "短袜", 811 | 807: "太阳能盘", 812 | 808: "宽边帽", 813 | 809: "一碗汤", 814 | 810: "空格键", 815 | 811: "空间加热器", 816 | 812: "航天飞机", 817 | 813: "铲", 818 | 814: "快艇", 819 | 815: "蜘蛛网", 820 | 816: "主轴", 821 | 817: "跑车", 822 | 818: "聚光灯", 823 | 819: "舞台", 824 | 820: "蒸汽机车", 825 | 821: "钢拱桥", 826 | 822: "钢鼓", 827 | 823: "听诊器", 828 | 824: "长巾", 829 | 825: "石头墙", 830 | 826: "秒表", 831 | 827: "火炉", 832 | 828: "过滤器", 833 | 829: "有轨电车", 834 | 830: "担架", 835 | 831: "工作室沙发", 836 | 832: "佛塔", 837 | 833: "潜艇", 838 | 834: "西服", 839 | 835: "日晷", 840 | 836: "太阳镜", 841 | 837: "墨镜", 842 | 838: "防晒霜", 843 | 839: "悬索桥", 844 | 840: "拖把", 845 | 841: "运动衫", 846 | 842: "游泳裤", 847 | 843: "摆动", 848 | 844: "开关", 849 | 845: "注射器", 850 | 846: "台灯", 851 | 847: "坦克", 852 | 848: "磁带播放器", 853 | 849: "茶壶", 854 | 850: "泰迪熊", 855 | 851: "电视系统", 856 | 852: "网球", 857 | 853: "茅草屋顶", 858 | 854: "剧场幕布", 859 | 855: "顶针", 860 | 856: "脱粒机", 861 | 857: "宝座", 862 | 858: "瓦屋顶", 863 | 859: "烤面包机", 864 | 860: "烟草店", 865 | 861: "马桶座", 866 | 862: "火炬", 867 | 863: "图腾柱", 868 | 864: "拖车", 869 | 865: "玩具店", 870 | 866: "拖拉机", 871 | 867: "拖车", 872 | 868: "托盘", 873 | 869: "风衣", 874 | 870: "三轮车", 875 | 871: "三体船", 876 | 872: "三脚架", 877 | 873: "凯旋门", 878 | 874: "无轨电车", 879 | 875: "长号", 880 | 876: "浴缸", 881 | 877: "十字转门", 882 | 878: "打字机键盘", 883 | 879: "雨伞", 884 | 880: "独轮车", 885 | 881: "立式钢琴", 886 | 882: "真空吸尘器", 887 | 883: "花瓶", 888 | 884: "拱顶", 889 | 885: "天鹅绒", 890 | 886: "自动售货机", 891 | 887: "法衣", 892 | 888: "高架桥", 893 | 889: "小提琴", 894 | 890: "排球", 895 | 891: "松饼机", 896 | 892: "墙上的时钟", 897 | 893: "钱包", 898 | 894: "衣柜", 899 | 895: "军用飞机", 900 | 896: "洗脸盆", 901 | 897: "洗衣机", 902 | 898: "一瓶水", 903 | 899: "水壶", 904 | 900: "水塔", 905 | 901: "威士忌的壶", 906 | 902: "吹口哨", 907 | 903: "假发", 908 | 904: "纱窗", 909 | 905: "百叶窗", 910 | 906: "温莎领带", 911 | 907: "酒瓶", 912 | 908: "翼", 913 | 909: "炒锅", 914 | 910: "木勺子", 915 | 911: "羊毛", 916 | 912: "蠕虫围栏", 917 | 913: "沉船", 918 | 914: "快艇", 919 | 915: "蒙古包", 920 | 916: "网站", 921 | 917: "漫画书", 922 | 918: "纵横填字谜", 923 | 919: "街道标志", 924 | 920: "交通信号灯", 925 | 921: "皮书套", 926 | 922: "菜单", 927 | 923: "盘子", 928 | 924: "鳄梨酱", 929 | 925: "清汤", 930 | 926: "火锅", 931 | 927: "琐事", 932 | 928: "冰淇淋", 933 | 929: "雪糕", 934 | 930: "法国面包", 935 | 931: "百吉饼", 936 | 932: "椒盐脆饼", 937 | 933: "芝士汉堡", 938 | 934: "热狗", 939 | 935: "土豆泥", 940 | 936: "结球甘蓝", 941 | 937: "西兰花", 942 | 938: "菜花", 943 | 939: "西葫芦", 944 | 940: "意大利南瓜", 945 | 941: "小青南瓜", 946 | 942: "南瓜", 947 | 943: "黄瓜", 948 | 944: "朝鲜蓟", 949 | 945: "甜椒", 950 | 946: "刺棘蓟", 951 | 947: "蘑菇", 952 | 948: "澳洲青苹", 953 | 949: "草莓", 954 | 950: "橙色", 955 | 951: "柠檬", 956 | 952: "无花果", 957 | 953: "菠萝", 958 | 954: "香蕉", 959 | 955: "木菠萝", 960 | 956: "蛋奶冻苹果", 961 | 957: "石榴", 962 | 958: "干草", 963 | 959: "培根", 964 | 960: "巧克力酱", 965 | 961: "面团", 966 | 962: "瑞士肉包", 967 | 963: "比萨派", 968 | 964: "馅饼", 969 | 965: "玉米煎饼", 970 | 966: "红葡萄酒", 971 | 967: "意大利浓咖啡", 972 | 968: "杯子", 973 | 969: "蛋奶酒", 974 | 970: "高山", 975 | 971: "气泡", 976 | 972: "悬崖", 977 | 973: "珊瑚礁", 978 | 974: "间歇泉", 979 | 975: "湖边", 980 | 976: "海角", 981 | 977: "沙洲", 982 | 978: "海岸", 983 | 979: "谷", 984 | 980: "火山", 985 | 981: "棒球运动员", 986 | 982: "新郎", 987 | 983: "潜水员", 988 | 984: "油菜", 989 | 985: "雏菊", 990 | 986: "黄色凤仙花", 991 | 987: "玉米", 992 | 988: "橡子", 993 | 989: "玫瑰果", 994 | 990: "七叶树", 995 | 991: "珊瑚菌", 996 | 992: "木耳", 997 | 993: "鹿花菌属", 998 | 994: "鬼笔菌", 999 | 995: "地星", 1000 | 996: "灰树花", 1001 | 997: "牛肝菌", 1002 | 998: "穗", 1003 | 999: "卫生纸", 1004 | } 1005 | -------------------------------------------------------------------------------- /vision_porn.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "io/ioutil" 6 | ) 7 | 8 | var ( 9 | visionPornURI = "/vision/vision_porn" 10 | ) 11 | 12 | // VisionPornForBase64 智能鉴黄 - 图片为base64格式 13 | // image 图片base64后字符串 14 | func (ai *TxAi) VisionPornForBase64(image string) (*VisionPornResponse, error) { 15 | params := ai.getPublicParams() 16 | params.Add("image", image) 17 | sign := ai.getReqSign(params) 18 | params.Add("sign", sign) 19 | // 响应结果 20 | visionPornResponse := new(VisionPornResponse) 21 | err := ai.RequestAPI(visionPornURI, params, visionPornResponse) 22 | if err != nil { 23 | return nil, err 24 | } 25 | // 计算图片级别 26 | hot := 0 27 | normal := 0 28 | for _, v := range visionPornResponse.Data.TagList { 29 | if v.TagName == "normal_hot_porn" && v.TagConfidence > 83 { 30 | visionPornResponse.Level = 2 31 | break 32 | } else if v.TagName == "hot" { 33 | hot = v.TagConfidence 34 | } else if v.TagName == "normal" { 35 | normal = v.TagConfidence 36 | } 37 | } 38 | // 是否是性感图片 39 | if visionPornResponse.Level != 2 && hot > normal { 40 | visionPornResponse.Level = 1 41 | } 42 | return visionPornResponse, nil 43 | } 44 | 45 | // VisionPornForPath 智能鉴黄 - 图片为本地路径 46 | // imagePath 本地图片路径 47 | func (ai *TxAi) VisionPornForPath(imagePath string) (*VisionPornResponse, error) { 48 | body, err := ioutil.ReadFile(imagePath) 49 | if err != nil { 50 | return nil, err 51 | } 52 | img := base64.StdEncoding.EncodeToString(body) 53 | return ai.VisionPornForBase64(img) 54 | } 55 | -------------------------------------------------------------------------------- /vision_scener.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | import ( 4 | "encoding/base64" 5 | "errors" 6 | "fmt" 7 | "io/ioutil" 8 | ) 9 | 10 | var ( 11 | visionScenerURI = "/vision/vision_scener" 12 | ) 13 | 14 | // VisionScenerForBase64 场景识别 - 图片为base64格式 15 | // 对图片进行场景识别,快速找出图片中包含的场景信息 16 | // image 图片base64后字符串 17 | // format 图片格式,暂时只支持1 JPG格式(image/jpeg) 18 | // topk 返回结果个数(已按置信度倒排) 19 | func (ai *TxAi) VisionScenerForBase64(image string, format, topk int) (*VisionScenerResponse, error) { 20 | if topk < 1 || topk > 5 { 21 | return nil, errors.New("topk range from 1 to 5") 22 | } 23 | if format != 1 { 24 | return nil, errors.New("The picture format can only be jpg [format=1]") 25 | } 26 | 27 | params := ai.getPublicParams() 28 | params.Add("image", image) 29 | params.Add("format", fmt.Sprint(format)) 30 | params.Add("topk", fmt.Sprint(topk)) 31 | sign := ai.getReqSign(params) 32 | params.Add("sign", sign) 33 | // 响应结果 34 | visionScenerResponse := new(VisionScenerResponse) 35 | err := ai.RequestAPI(visionScenerURI, params, visionScenerResponse) 36 | if err != nil { 37 | return nil, err 38 | } 39 | // 添加场景名 40 | for _, v := range visionScenerResponse.Data.SceneList { 41 | v.LabelName = VisionScenerNames[v.LabelID] 42 | } 43 | return visionScenerResponse, nil 44 | } 45 | 46 | // VisionScenerForPath 场景识别 - 图片为本地路径 47 | // 对图片进行场景识别,快速找出图片中包含的场景信息 48 | // imagePath 本地图片路径 49 | // format 图片格式,暂时只支持1 JPG格式(image/jpeg) 50 | // topk 返回结果个数(已按置信度倒排) 51 | func (ai *TxAi) VisionScenerForPath(imagePath string, format, topk int) (*VisionScenerResponse, error) { 52 | body, err := ioutil.ReadFile(imagePath) 53 | if err != nil { 54 | return nil, err 55 | } 56 | img := base64.StdEncoding.EncodeToString(body) 57 | return ai.VisionScenerForBase64(img, format, topk) 58 | } 59 | -------------------------------------------------------------------------------- /vision_scener_names.go: -------------------------------------------------------------------------------- 1 | package txai 2 | 3 | var VisionScenerNames = map[int]string{ 4 | 0: "机场", 5 | 1: "机舱", 6 | 2: "机场航站楼", 7 | 3: "胡同", 8 | 4: "游乐场", 9 | 5: "游乐园", 10 | 6: "公寓大楼外", 11 | 7: "水族馆", 12 | 8: "渡槽", 13 | 9: "游乐中心", 14 | 10: "考古发掘", 15 | 11: "档案文件", 16 | 12: "曲棍球", 17 | 13: "性能", 18 | 14: "牛仔竞技比赛", 19 | 15: "陆军基地", 20 | 16: "艺术画廊", 21 | 17: "艺术学校", 22 | 18: "艺术工作室", 23 | 19: "装配线", 24 | 20: "户外田径场地", 25 | 21: "阁楼", 26 | 22: "大礼堂", 27 | 23: "汽车厂", 28 | 24: "汽车展厅", 29 | 25: "荒地", 30 | 26: "商店", 31 | 27: "外部", 32 | 28: "内部", 33 | 29: "球坑", 34 | 30: "舞厅", 35 | 31: "竹林", 36 | 32: "银行金库", 37 | 33: "宴会厅", 38 | 34: "酒吧", 39 | 35: "棒球场", 40 | 36: "地下室", 41 | 37: "室内篮球场", 42 | 38: "浴室", 43 | 39: "室内市场", 44 | 40: "户外市场", 45 | 41: "海滩", 46 | 42: "美容院", 47 | 43: "卧室", 48 | 44: "泊位", 49 | 45: "生物学实验室", 50 | 46: "木板路", 51 | 47: "船的甲板上", 52 | 48: "船屋", 53 | 49: "书店", 54 | 50: "公用电话亭里面", 55 | 51: "植物园", 56 | 52: "室内的弓形窗", 57 | 53: "保龄球馆", 58 | 54: "拳击台", 59 | 55: "桥", 60 | 56: "建筑立面", 61 | 57: "斗牛场", 62 | 58: "车内", 63 | 59: "公交车站内", 64 | 60: "肉店", 65 | 61: "巴特", 66 | 62: "小屋内", 67 | 63: "自助餐厅", 68 | 64: "营地", 69 | 65: "校园", 70 | 66: "自然的", 71 | 67: "城市的", 72 | 68: "糖果店", 73 | 69: "峡谷", 74 | 70: "汽车内饰", 75 | 71: "旋转木马", 76 | 72: "城堡", 77 | 73: "地下墓穴", 78 | 74: "墓地", 79 | 75: "化学实验室", 80 | 76: "孩子的房间", 81 | 77: "礼堂内", 82 | 78: "礼堂外", 83 | 79: "教室", 84 | 80: "悬崖", 85 | 81: "衣柜", 86 | 82: "服装店", 87 | 83: "海岸", 88 | 84: "驾驶舱", 89 | 85: "咖啡店", 90 | 86: "电脑室", 91 | 87: "会议室", 92 | 88: "施工现场", 93 | 89: "玉米田", 94 | 90: "畜栏", 95 | 91: "走廊", 96 | 92: "庭院", 97 | 93: "小溪", 98 | 94: "决口", 99 | 95: "人行横道", 100 | 96: "水坝", 101 | 97: "熟食店", 102 | 98: "百货商店", 103 | 99: "沙", 104 | 100: "植被", 105 | 101: "沙漠公路", 106 | 102: "路边小饭店", 107 | 103: "餐厅", 108 | 104: "餐厅", 109 | 105: "迪斯科舞厅", 110 | 106: "宿舍", 111 | 107: "市中心", 112 | 108: "更衣室", 113 | 109: "车道", 114 | 110: "药店", 115 | 111: "门", 116 | 112: "电梯大堂", 117 | 113: "电梯井", 118 | 114: "发动机室", 119 | 115: "室内自动扶梯", 120 | 116: "开挖", 121 | 117: "布艺店", 122 | 118: "农场", 123 | 119: "快餐店", 124 | 120: "栽培", 125 | 121: "野生的", 126 | 122: "场路", 127 | 123: "火灾逃生", 128 | 124: "消防站", 129 | 125: "鱼塘", 130 | 126: "室内跳蚤市场", 131 | 127: "室内花店", 132 | 128: "美食广场", 133 | 129: "足球场", 134 | 130: "阔叶", 135 | 131: "森林的小路", 136 | 132: "林道", 137 | 133: "正式的花园", 138 | 134: "喷泉", 139 | 135: "厨房", 140 | 136: "车库内", 141 | 137: "车库外", 142 | 138: "加油站", 143 | 139: "外部", 144 | 140: "杂货店内", 145 | 141: "礼品店", 146 | 142: "冰川", 147 | 143: "高尔夫球场", 148 | 144: "温室内", 149 | 145: "温室外", 150 | 146: "石窟", 151 | 147: "体育馆内", 152 | 148: "飞机棚内", 153 | 149: "飞机棚外", 154 | 150: "港", 155 | 151: "五金店", 156 | 152: "海菲尔德", 157 | 153: "直升机场", 158 | 154: "公路", 159 | 155: "家庭办公室", 160 | 156: "医院的房间", 161 | 157: "温泉", 162 | 158: "酒店外", 163 | 159: "酒店房间", 164 | 160: "房子", 165 | 161: "冰淇淋店", 166 | 162: "浮冰", 167 | 163: "冰架", 168 | 164: "室内溜冰场", 169 | 165: "室外溜冰场", 170 | 166: "冰山", 171 | 167: "工业区", 172 | 168: "胰岛", 173 | 169: "浴缸里", 174 | 170: "监狱", 175 | 171: "日本花园", 176 | 172: "珠宝店", 177 | 173: "垃圾场", 178 | 174: "城堡", 179 | 175: "狗屋外面", 180 | 176: "幼儿园的教室", 181 | 177: "厨房", 182 | 178: "泻湖", 183 | 179: "自然的", 184 | 180: "垃圾填埋", 185 | 181: "降落甲板", 186 | 182: "草坪", 187 | 183: "图书馆室内", 188 | 184: "灯塔", 189 | 185: "客厅", 190 | 186: "大堂", 191 | 187: "更衣室", 192 | 188: "商店外面", 193 | 189: "商店里面", 194 | 190: "沼泽", 195 | 191: "武术馆", 196 | 192: "水", 197 | 193: "清真寺外面", 198 | 194: "山", 199 | 195: "山间小道", 200 | 196: "山上的雪", 201 | 197: "电影院室内", 202 | 198: "博物馆室内", 203 | 199: "音乐工作室", 204 | 200: "自然历史博物馆", 205 | 201: "婴儿室", 206 | 202: "海洋", 207 | 203: "办公室", 208 | 204: "办公隔间", 209 | 205: "石油钻台", 210 | 206: "操作室", 211 | 207: "果园", 212 | 208: "乐池", 213 | 209: "宝塔", 214 | 210: "宫殿", 215 | 211: "食品贮藏室", 216 | 212: "公园", 217 | 213: "室内停车场", 218 | 214: "停车场", 219 | 215: "牧场", 220 | 216: "亭阁", 221 | 217: "宠物店", 222 | 218: "药房", 223 | 219: "电话亭", 224 | 220: "码头", 225 | 221: "比萨店", 226 | 222: "操场", 227 | 223: "广场", 228 | 224: "池塘", 229 | 225: "酒馆内", 230 | 226: "赛马场", 231 | 227: "滚道", 232 | 228: "筏", 233 | 229: "铁路轨道", 234 | 230: "雨林", 235 | 231: "接待", 236 | 232: "娱乐室", 237 | 233: "修理店", 238 | 234: "餐厅", 239 | 235: "餐厅厨房", 240 | 236: "餐厅的露台", 241 | 237: "稻田", 242 | 238: "河", 243 | 239: "岩拱", 244 | 240: "索桥", 245 | 241: "废墟", 246 | 242: "沙盒", 247 | 243: "桑拿", 248 | 244: "服务器机房", 249 | 245: "鞋店", 250 | 246: "大商场室内", 251 | 247: "淋浴", 252 | 248: "滑雪度假村", 253 | 249: "天空", 254 | 250: "摩天大楼", 255 | 251: "雪地", 256 | 252: "足球场", 257 | 253: "稳定的", 258 | 254: "棒球", 259 | 255: "足球", 260 | 256: "室内舞台", 261 | 257: "户外舞台", 262 | 258: "楼梯", 263 | 259: "街道", 264 | 260: "地铁站台", 265 | 261: "超市", 266 | 262: "寿司店", 267 | 263: "沼泽", 268 | 264: "游泳池", 269 | 265: "室内游泳池", 270 | 266: "户外游泳池", 271 | 267: "电视演播室", 272 | 268: "亚洲", 273 | 269: "王座室", 274 | 270: "售票厅", 275 | 271: "修剪花园", 276 | 272: "塔", 277 | 273: "玩具店", 278 | 274: "列车内部", 279 | 275: "火车站台", 280 | 276: "林场", 281 | 277: "树屋", 282 | 278: "沟槽", 283 | 279: "苔原", 284 | 280: "海洋的深处", 285 | 281: "实用的房间", 286 | 282: "山谷", 287 | 283: "植物园", 288 | 284: "兽医办公室", 289 | 285: "高架桥", 290 | 286: "村庄", 291 | 287: "葡萄园", 292 | 288: "火山", 293 | 289: "户外排球场", 294 | 290: "水上公园", 295 | 291: "水塔", 296 | 292: "瀑布", 297 | 293: "浇水洞", 298 | 294: "波动", 299 | 295: "小麦田", 300 | 296: "风电场", 301 | 297: "院子", 302 | 298: "禅园", 303 | } 304 | --------------------------------------------------------------------------------