]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
tts支持讯飞
authorqydysky <qydysky@foxmail.com>
Mon, 14 Jun 2021 19:55:19 +0000 (03:55 +0800)
committerqydysky <qydysky@foxmail.com>
Mon, 14 Jun 2021 19:55:19 +0000 (03:55 +0800)
README.md
Reply/tts.go
demo/config/config_K_v.json
demo/go.mod
demo/go.sum
go.mod
go.sum

index 25bfb923ba6b033ab41618034dcb30314cfd31dc..24b98fab2a6ff3876e21cc5bcd56853a819152ac 100644 (file)
--- a/README.md
+++ b/README.md
@@ -170,6 +170,10 @@ I: 2021/04/13 20:07:45 命令行操作 [直播Web服务: http://192.168.31.245:3
   - [mpv](https://mpv.io/)
   - [MXPlayer](https://sites.google.com/site/mxvpen/home)
 
+**特殊的**
+
+由于hls流使用浏览器支持的编码格式,故可以使用浏览器直接打开mp4直播流链接,即上述带`?type=mp4`的链接。
+
 
 #### 命令行操作
 在准备动作完成(`T: 2021/03/06 16:22:39 命令行操作 [回车查看帮助]`)后,输入回车将显示帮助
@@ -309,7 +313,24 @@ release默认编译tts
     "TTS_服务器_youdaoId": "",
     "TTS_服务器_youdaoKey": "",
 ```
-支持baidu和[有道](https://ai.youdao.com/gw.s#/),如使用有道则需要Id和Key。
+支持baidu、[有道](https://ai.youdao.com/gw.s#/)、[讯飞](https://www.xfyun.cn/)。
+
+使用有道则需要Id和Key。
+```
+    "TTS_服务器_youdaoId": "7xxxxxxxxxxxxxxa",
+    "TTS_服务器_youdaoKey": "yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxP",
+
+```
+
+使用讯飞则需要应用Id、Key、Secret。可设置发音人。
+```
+    "TTS_服务器_xfId": "6xxxxxxb",
+    "TTS_服务器_xfKey": "4xxxxxxxx9",
+    "TTS_服务器_xfSecret": "YxxxxxxxBh",
+    "TTS_服务器_xfVoice-help": "讯飞发音人 xiaoyan:小燕甜美女声 aisjiuxu:许久亲切男声 aisxping:小萍知性女声 aisjinger:小婧亲切女声 aisbabyxu:许小宝可爱童声 random:随机",
+    "TTS_服务器_xfVoice": "random",
+
+```
 
 #### 弹幕窗
 构建gtk需要gtk3,先行安装[gtk](https://www.gtk.org/)
index 899907edfe4cd73b8cb5cedbc0a855e697eadd29..5d8781adf4da0a9aeb13c6224b920a1e756d78b1 100644 (file)
@@ -1,16 +1,25 @@
 package reply
 
 import (
+       "fmt"
+       "time"
+       "errors"
+       "crypto/sha256"
        "os/exec"
        "net/url"
        "strings"
+       "encoding/base64"
+       "encoding/json"
+       "crypto/hmac"
        c "github.com/qydysky/bili_danmu/CV"
 
        p "github.com/qydysky/part"
        msgq "github.com/qydysky/part/msgq"
+       ws "github.com/qydysky/part/websocket"
        s "github.com/qydysky/part/buf"
        reqf "github.com/qydysky/part/reqf"
        limit "github.com/qydysky/part/limit"
+       funcCtrl "github.com/qydysky/part/funcCtrl"
 )
 
 var (
@@ -31,9 +40,10 @@ var tts_log = c.Log.Base_add(`TTS`)
 
 var (
        tts_ser = "baidu"
-       tts_ser_map = map[string]func(string)reqf.Rval{
+       tts_ser_map = map[string]func(string)error{
                `baidu`:baidu,
                `youdao`:youdao,
+               `xf`:xf,
        }
        tts_prog = "ffplay"
        tts_prog_set = "-autoexit -nodisp"
@@ -86,7 +96,7 @@ func init(){
                        for len(tts_List) > 0 && len(s) < 100 {
                                s += " " + <- tts_List
                        }
-                       TTS(<- tts_List)
+                       TTS(s)
                }
        }()
        
@@ -135,65 +145,63 @@ func init(){
 func TTS(msg string) {
        if tts_limit.TO() {return}
 
-       var (
-               req = reqf.New()
-               rval reqf.Rval
-       )
+       var err error
        if f,ok := tts_ser_map[tts_ser];ok{
-               rval = f(msg)
+               err = f(msg)
        } else {
-               rval = baidu(msg)
-       }
-       if rval.Url == `` {
-               tts_log.L(`E: `, `rval.Url`)
-               return
+               err = baidu(msg)
        }
-
-       if err := req.Reqf(rval);err != nil {
-               tts_log.L(`E: `,err)
-               return
-       }
-       if req.Response.Header.Get(`Content-type`) == `application/json` {
-               tts_log.L(`W: `, `错误`, req.Response.StatusCode, string(req.Respon))
+       
+       if err != nil {
+               tts_log.L(`E: `, err)
                return
        }
        
+       return
+}
+
+func play(){
        var prog = []string{}
        prog = append(prog, p.Sys().Cdir()+"/tts.mp3")
        prog = append(prog, strings.Split(tts_prog_set," ")...)
        p.Exec().Run(false, tts_prog, prog...)
-       return
+
 }
 
-func baidu(msg string) reqf.Rval {
-       return reqf.Rval{
+func baidu(msg string) error {
+       req := reqf.New()
+       if err := req.Reqf(reqf.Rval{
                Url:`https://fanyi.baidu.com/gettts?lan=zh&text=`+ url.PathEscape(msg) +`&spd=5&source=web`,
                SaveToPath:p.Sys().Cdir()+`/tts.mp3`,
                Timeout:3*1000,
                Retry:1,
                SleepTime:5000,
                Proxy:c.Proxy,
+       });err != nil {
+               return err
        }
+       play()
+       return nil
 }
 
 var (
-       appId string
-       appKey string
+       youdaoId string
+       youdaoappKey string
 )
 func init(){
        if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoId`).(string);ok && v != ``{
-               appId = v
+               youdaoId = v
        }
        if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoKey`).(string);ok && v != ``{
-               appKey = v
+               youdaoappKey = v
        }
-       if tts_ser == `youdao` && (appId == `` || appKey == ``) {
+       if tts_ser == `youdao` && (youdaoId == `` || youdaoappKey == ``) {
                tts_log.L(`W: `, `未提供youdaoId、Key,使用baidu`)
                tts_ser = `baidu`
        }
 }
-func youdao(msg string) reqf.Rval {
-       if appId == "" || appKey == "" {
+func youdao(msg string) error {
+       if youdaoId == "" || youdaoappKey == "" {
                return baidu(msg)
        }
 
@@ -202,17 +210,19 @@ func youdao(msg string) reqf.Rval {
                api = map[string]string{
                        `q`:msg,
                        `langType`:"zh-CHS",
-                       `appKey`:appId,
+                       `youdaoappKey`:youdaoId,
                        `salt`:p.Stringf().Rand(1, 8),
                }
                postS string
        )
-       api[`sign`] = strings.ToUpper(p.Md5().Md5String(api[`appKey`]+api[`q`]+api[`salt`]+appKey))
+       api[`sign`] = strings.ToUpper(p.Md5().Md5String(api[`youdaoappKey`]+api[`q`]+api[`salt`]+youdaoappKey))
        for k,v := range api {
                if postS != "" {postS += "&"}
                postS += k+`=`+v
        }
-       return reqf.Rval{
+
+       req := reqf.New()
+       if err := req.Reqf(reqf.Rval{
                Url:`https://openapi.youdao.com/ttsapi`,
                PostStr:url.PathEscape(postS),
                SaveToPath:p.Sys().Cdir()+`/tts.mp3`,
@@ -220,5 +230,212 @@ func youdao(msg string) reqf.Rval {
                Retry:1,
                SleepTime:5000,
                Proxy:c.Proxy,
+       });err != nil {
+               return err
+       }
+       if req.Response.Header.Get(`Content-type`) == `application/json` {
+               return errors.New(`错误 ` + req.Response.Status + string(req.Respon))
+       }
+       play()
+       return nil
+}
+
+var (
+       xfId string
+       xfKey string
+       xfSecret string
+       xfVoice = "random"
+       xfVmap = map[string]bool{
+               `xiaoyan`:true,
+               `aisjiuxu`:true,
+               `aisxping`:true,
+               `aisjinger`:true,
+               `aisbabyxu`:true,
+       }
+       xfwsClient *ws.Client
+       xf_req func()
+       xf_req_block funcCtrl.BlockFunc
+)
+func init(){
+       if v, ok := c.K_v.LoadV(`TTS_服务器_xfId`).(string);ok && v != ``{
+               xfId = v
+       }
+       if v, ok := c.K_v.LoadV(`TTS_服务器_xfKey`).(string);ok && v != ``{
+               xfKey = v
+       }
+       if v, ok := c.K_v.LoadV(`TTS_服务器_xfSecret`).(string);ok && v != ``{
+               xfSecret = v
+       }
+       if v, ok := c.K_v.LoadV(`TTS_服务器_xfVoice`).(string);ok && v != ``{
+               if _,ok := xfVmap[v];ok || v == `random` {
+                       xfVoice = v
+               } else {
+                       tts_log.L(`I: `,`未支持设定发音,使用随机`)
+               }
+       }
+       if tts_ser == `xf` && (xfId == `` || xfKey == `` || xfSecret == ``) {
+               tts_log.L(`W: `, `未提供讯飞Id、Key、Secret,使用baidu`)
+               tts_ser = `baidu`
+       }
+
+       //@hosturl :  like  wss://tts-api.xfyun.cn/v2/tts
+    //@apikey : apiKey
+    //@apiSecret : apiSecret
+       assembleAuthUrl := func (hosturl string, apiKey, apiSecret string) (string,error) {
+        ul, err := url.Parse(hosturl)
+        if err != nil {
+            return "",err
+        }
+        //签名时间
+        date := time.Now().UTC().Format(time.RFC1123)
+        //参与签名的字段 host ,date, request-line
+        signString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"}
+        //拼接签名字符串
+        sgin := strings.Join(signString, "\n")
+        //签名
+               mac := hmac.New(sha256.New, []byte(apiSecret))
+               mac.Write([]byte(sgin))
+        sha := base64.StdEncoding.EncodeToString(mac.Sum(nil))
+        //构建请求参数 此时不需要urlencoding
+        authUrl := fmt.Sprintf("api_key=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha)
+        //将请求参数使用base64编码
+        authorization:= base64.StdEncoding.EncodeToString([]byte(authUrl))
+        v := url.Values{}
+        v.Add("host", ul.Host)
+        v.Add("date", date)
+        v.Add("authorization", authorization)
+        //将编码后的字符串url encode后添加到url后面
+        callurl := hosturl + "?" + v.Encode()
+        return callurl,nil
+    }
+
+       wsUrl,err := assembleAuthUrl("wss://tts-api.xfyun.cn/v2/tts", xfKey, xfSecret)
+
+       if err != nil {
+               tts_log.L(`E: `, `错误,使用百度`, err)
+               tts_ser = `baidu`
+               return
+       }
+
+       xf_req = func(){
+               xf_req_block.Block()//cant call in same time
+               defer xf_req_block.UnBlock()
+
+               xfwsClient = ws.New_client(ws.Client{
+                       Url:wsUrl,
+                       Proxy:c.Proxy,
+                       Header: map[string]string{
+                               `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0`,
+                               `Accept`: `*/*`,
+                               `Accept-Language`: `zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2`,
+                               `Pragma`: `no-cache`,
+                               `Cache-Control`: `no-cache`,
+                       },
+               }).Handle()
+               if xfwsClient.Isclose() {
+                       tts_log.L(`E: `,"连接错误,使用百度", xfwsClient.Error())
+                       tts_ser = `baidu`
+               } else {
+                       go func(){
+                               var buf []byte
+                               for !xfwsClient.Isclose() {
+                                       data := <- xfwsClient.RecvChan
+                                       if len(data) == 0 {break}
+
+                                       var partS struct {
+                                               Code    int    `json:"code"`
+                                               Message string `json:"message"`
+                                               Sid     string `json:"sid"`
+                                               Data    struct {
+                                                       Audio  string `json:"audio"`
+                                                       Ced    string `json:"ced"`
+                                                       Status int    `json:"status"`
+                                               } `json:"data"`
+                                       }
+                                       if e := json.Unmarshal(data, &partS);e != nil {
+                                               tts_log.L(`E: `,"错误", e, data)
+                                               xfwsClient.Close()
+                                               return
+                                       } else {
+                                               if partS.Code != 0 {
+                                                       tts_log.L(`W: `,fmt.Sprintf("code:%d msg:%s", partS.Code, partS.Message))
+                                                       break
+                                               }
+                                               if partS.Data.Audio != "" {
+                                                       if part,e := base64.StdEncoding.DecodeString(partS.Data.Audio);e != nil {
+                                                               tts_log.L(`E: `,"错误", e)
+                                                               break
+                                                       } else {
+                                                               buf = append(buf, part...)
+                                                       }
+                                               }
+                                               if partS.Data.Status == 2 {
+                                                       break
+                                               }
+                                       }
+                               }
+                               if len(buf) != 0 {
+                                       p.File().FileWR(p.Filel{
+                                               File:p.Sys().Cdir()+`/tts.mp3`,
+                                               Context:[]interface{}{buf},
+                                       })
+                                       play()
+                               }
+                               xfwsClient.Close()
+                       }()
+               }
+               
+       }
+       xf_req()
+}
+func xf(msg string) error {
+       if xfId == `` || xfKey == `` || xfSecret == `` {
+               tts_log.L(`T: `,"参数不足,使用百度")
+               return baidu(msg)
+       }
+
+       voice := xfVoice
+       if voice == `random` {
+               for k,_ := range xfVmap {
+                       voice = k
+                       break
+               }
+       }
+
+       type rec struct {
+               Common struct {
+                       AppID string `json:"app_id"`
+               } `json:"common"`
+               Business struct {
+                       Aue   string `json:"aue"`
+                       Vcn   string `json:"vcn"`
+                       Tte   string `json:"tte"`
+                       Sfl   int `json:"sfl"`
+               } `json:"business"`
+               Data struct {
+                       Status int    `json:"status"`
+                       Text   string `json:"text"`
+               } `json:"data"`
+       }
+
+       {//msg
+               var postS = rec{}
+               postS.Common.AppID = xfId
+               postS.Business.Aue = "lame"
+               postS.Business.Sfl = 1
+               postS.Business.Tte = "UTF8"
+               postS.Business.Vcn = voice
+               postS.Data.Status = 2
+               postS.Data.Text = base64.StdEncoding.EncodeToString([]byte(msg))
+       
+               if b,e := json.Marshal(postS);e != nil {
+                       return e
+               } else {
+                       if xfwsClient.Isclose() {
+                               xf_req()
+                       }
+                       xfwsClient.SendChan <- b
+               }
        }
+       return nil
 }
\ No newline at end of file
index e1bfb843d2ca053067462baa77e80dce0d9b099d..51a4cfdc52afd0e88b8a9be7001cad7a5b310c2d 100644 (file)
@@ -7,10 +7,15 @@
     "弹幕私信(额外)": "[弹幕机测试 额外]:弹幕",
     "TTS_配置-help": "将会运行[TTS_使用程序路径 获取的音频路径 TTS_使用程序参数]",
     "TTS_总开关": true,
-    "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS",
+    "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS xf:讯飞TTS",
     "TTS_服务器": "baidu",
     "TTS_服务器_youdaoId": "",
     "TTS_服务器_youdaoKey": "",
+    "TTS_服务器_xfId": "",
+    "TTS_服务器_xfKey": "",
+    "TTS_服务器_xfSecret": "",
+    "TTS_服务器_xfVoice-help": "讯飞发音人 xiaoyan:小燕甜美女声 aisjiuxu:许久亲切男声 aisxping:小萍知性女声 aisjinger:小婧亲切女声 aisbabyxu:许小宝可爱童声 random:随机",
+    "TTS_服务器_xfVoice": "aisjinger",
     "TTS_使用程序路径": "ffplay",
     "TTS_使用程序参数": "-autoexit -nodisp -volume 60",
     "弹幕-help": "弹幕相关",
index a098100026ea1788057643a656980697d7edb065..2c16db5fbe6a7448bf76aeb34679dfb74e1af74a 100644 (file)
@@ -9,17 +9,17 @@ require (
        github.com/gofrs/uuid v4.0.0+incompatible // indirect
        github.com/gorilla/websocket v1.4.2 // indirect
        github.com/gotk3/gotk3 v0.6.0 // indirect
-       github.com/klauspost/compress v1.13.0 // indirect
+       github.com/klauspost/compress v1.13.1 // indirect
        github.com/mdp/qrterminal/v3 v3.0.0 // indirect
        github.com/miekg/dns v1.1.42 // indirect
        github.com/mitchellh/mapstructure v1.4.1 // indirect
        github.com/qydysky/bili_danmu v0.5.9
-       github.com/qydysky/part v0.5.25 // indirect
+       github.com/qydysky/part v0.5.26 // indirect
        github.com/shirou/gopsutil v3.21.5+incompatible // indirect
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
        github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
        github.com/tklauser/go-sysconf v0.3.6 // indirect
-       golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect
+       golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
        golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 // indirect
 )
 
index 433354c7226b11145757978c5212957824c09f78..3e22fe35f1c39e2d4098f925a1182801cacc4442 100644 (file)
@@ -113,6 +113,8 @@ github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/Vq
 github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs=
 github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
+github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
 github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -312,6 +314,8 @@ github.com/qydysky/part v0.5.24 h1:hnHI5SPpm6I61/q7s83D3NlHgIMHjsvukw6xAbZeanc=
 github.com/qydysky/part v0.5.24/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 github.com/qydysky/part v0.5.25 h1:jDxxwml175gc9pcyuMGdlAX1ErLk5CWKv58Jr1UWdy4=
 github.com/qydysky/part v0.5.25/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
+github.com/qydysky/part v0.5.26 h1:h2rwwgE4o0CgkPKNHxWVFqFIzDcv+tj4vp3o97YmjLs=
+github.com/qydysky/part v0.5.26/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad h1:Jtzf509lQrkUMGTV0Sc6IDCAiR1VrBcHrIban7hpye4=
 github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg=
 github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8=
@@ -428,6 +432,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6O
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A=
 golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
diff --git a/go.mod b/go.mod
index b2c2e3547c0860e208378c8492b754f039bacc56..f218f48993ea6df336218b958fd03bcb1b6ed765 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -8,17 +8,17 @@ require (
        github.com/christopher-dG/go-obs-websocket v0.0.0-20200720193653-c4fed10356a5
        github.com/gofrs/uuid v4.0.0+incompatible
        github.com/gotk3/gotk3 v0.6.0
-       github.com/klauspost/compress v1.13.0 // indirect
+       github.com/klauspost/compress v1.13.1 // indirect
        github.com/mdp/qrterminal/v3 v3.0.0
        github.com/miekg/dns v1.1.42 // indirect
        github.com/mitchellh/mapstructure v1.4.1 // indirect
-       github.com/qydysky/part v0.5.25
+       github.com/qydysky/part v0.5.26
        github.com/shirou/gopsutil v3.21.5+incompatible // indirect
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
        github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
        github.com/tklauser/go-sysconf v0.3.6 // indirect
        golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect
-       golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect
+       golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
        golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 // indirect
        golang.org/x/text v0.3.6
 )
diff --git a/go.sum b/go.sum
index 62a7966434153ea2db33bc0245ef9fc898eaf22d..8a9602c4a06615a35d8591a7ea38a991b6fbd2fd 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -37,6 +37,8 @@ github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/Vq
 github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs=
 github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
+github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@@ -86,6 +88,8 @@ github.com/qydysky/part v0.5.24 h1:hnHI5SPpm6I61/q7s83D3NlHgIMHjsvukw6xAbZeanc=
 github.com/qydysky/part v0.5.24/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 github.com/qydysky/part v0.5.25 h1:jDxxwml175gc9pcyuMGdlAX1ErLk5CWKv58Jr1UWdy4=
 github.com/qydysky/part v0.5.25/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
+github.com/qydysky/part v0.5.26 h1:h2rwwgE4o0CgkPKNHxWVFqFIzDcv+tj4vp3o97YmjLs=
+github.com/qydysky/part v0.5.26/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8=
 github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg=
 github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
@@ -139,6 +143,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6O
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A=
 golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=