]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
TTS支持有道
authorqydysky <qydysky@foxmail.com>
Sun, 13 Jun 2021 14:29:26 +0000 (22:29 +0800)
committerqydysky <qydysky@foxmail.com>
Sun, 13 Jun 2021 14:29:26 +0000 (22:29 +0800)
README.md
Reply/F.go
Reply/tts.go
demo/config/config_K_v.json
demo/go.mod
demo/go.sum
go.mod
go.sum

index 16b294aec7b92e87beaf63276e43c9038505ead5..bf3e68dee534ad53fe87b18b1b2140c9e70cd943 100644 (file)
--- a/README.md
+++ b/README.md
@@ -92,11 +92,10 @@ golang go version go1.15 linux/amd64
 - [x] 使用http代理
 - [x] cookie加密
 - [x] 弹幕自动重连(30s无响应)
-- [x] 命令行重载弹幕
 - [x] 直播流开播自动下载
 - [x] 直播流断流再保存
 - [x] 直播hls流均衡负载
-- [x] 命令行支持房间切换、弹幕发送、启停录制
+- [x] 命令行支持房间切换、弹幕发送、启停录制、重载弹幕
 - [x] GTK信息窗支持房间切换、弹幕格式化发送、时长统计
 - [x] GTK弹幕窗支持自定义人/事件消息停留
 
@@ -301,6 +300,16 @@ key为demo/face下的文件名
     "?":"问号"
 }
 ```
+
+在`demo/config/config_K_v.json`中可选使用的服务api
+```
+    "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS",
+    "TTS_服务器": "youdao",
+    "TTS_服务器_youdaoId": "",
+    "TTS_服务器_youdaoKey": "",
+```
+支持baidu和[有道](https://ai.youdao.com/gw.s#/),如使用有道则需要Id和Key。
+
 #### 弹幕窗
 构建gtk需要gtk3,先行安装[gtk](https://www.gtk.org/)
 release Linux默认编译gtk界面 Windows默认不编译
index 22cb9136a466ba406d7313a6d91a9e9239041d13..fe024273bfa5a438a39a186863934bac0ef8086e 100644 (file)
@@ -795,7 +795,7 @@ func Savestreamf(){
                                        } else if r.Response.StatusCode != 200 {
                                                l.L(`W: `,`请求退出`,r.Id(),e,r.Response.Status,string(r.Respon))
                                        } else {
-                                               l.L(`W: `,`请求退出`,r.Id(),e,r.Response.Status)
+                                               l.L(`W: `,`请求退出`,r.Id())
                                        }
                                }(req,reqf.Rval{
                                        Url:link,
index 68b51ac35521e615a6c9b13ab807776ad9d43367..23637381e1bd6d64a5a32a4796a6fd17f779b82f 100644 (file)
@@ -19,7 +19,9 @@ var (
                "0gift":"感谢{D}",
                "0superchat":"感谢{D}",
        }
-       tts_setting_replace = map[string]string{}
+       tts_setting_replace = map[string]string{
+               "\n":" ",
+       }
 )
 var tts_List = make(chan interface{},20)
 
@@ -28,29 +30,41 @@ var tts_limit = limit.New(1,5000,15000)//频率限制1次/5s,最大等待时
 var tts_log = c.Log.Base_add(`TTS`)
 
 var (
+       tts_ser = "baidu"
+       tts_ser_map = map[string]func(string)reqf.Rval{
+               `baidu`:baidu,
+               `youdao`:youdao,
+       }
        tts_prog = "ffplay"
        tts_prog_set = "-autoexit -nodisp"
 )
 
 func init(){
        {//tts配置
-               buf := s.New()
-               buf.Load("config/config_K_v.json")
-               for k,v := range buf.B {
-                       if k == `TTS_使用程序路径` {
-                               if tmp,ok := v.(string);ok && tmp != ``{
-                                       tts_prog = tmp
-                               } else{tts_log.L(`E: `,`TTS_使用程序路径不是字符串或为空`)}
-                       }else if k == `TTS_使用程序参数` {
-                               if tmp,ok := v.(string);ok{
-                                       tts_prog_set = tmp
-                               } else{tts_log.L(`E: `,`TTS_使用程序参数不是字符串`)}
-                       }else if k == `TTS_总开关` {
-                               if tmp,ok := v.(bool);ok && !tmp{
-                                       return
-                               }
+
+               if v, ok := c.K_v.LoadV(`TTS_总开关`).(bool);ok && !v {
+                       return
+               }
+               if v, ok := c.K_v.LoadV(`TTS_使用程序路径`).(string);ok && v != ``{
+                       tts_prog = v
+               } else {
+                       tts_log.L(`E: `,`TTS_使用程序路径不是字符串或为空`)
+               }
+               if v, ok := c.K_v.LoadV(`TTS_使用程序参数`).(string);ok && v != ``{
+                       tts_prog_set = v
+               } else {
+                       tts_log.L(`E: `,`TTS_使用程序参数不是字符串`)
+               }
+               if v, ok := c.K_v.LoadV(`TTS_服务器`).(string);ok && v != "" {
+                       if _,ok := tts_ser_map[v];ok{
+                               tts_ser = v
+                       } else {
+                               tts_log.L(`I: `,`未支持设定服务提供商,使用baidu`)
+                               tts_ser = `baidu`
                        }
                }
+               
+               buf := s.New()
                buf.Load("config/config_tts.json")
                if onoff,ok := buf.Get(`onoff`);ok {
                        for k,v := range onoff.(map[string]interface{}) {
@@ -109,21 +123,89 @@ func TTS(uid,msg string) {
                msg = strings.ReplaceAll(msg, k, v)
        }
 
-       req := reqf.New()
-       if err := req.Reqf(reqf.Rval{
-               Url:`https://fanyi.baidu.com/gettts?lan=zh&text=`+ url.QueryEscape(msg) +`&spd=5&source=web`,
-               SaveToPath:p.Sys().Cdir()+`/tts.mp3`,
-               Timeout:3*1000,
-               Retry:1,
-               SleepTime:5000,
-               Proxy:c.Proxy,
-       });err != nil {
+       var (
+               req = reqf.New()
+               rval reqf.Rval
+       )
+       if f,ok := tts_ser_map[tts_ser];ok{
+               rval = f(msg)
+       } else {
+               rval = baidu(msg)
+       }
+       if rval.Url == `` {
+               tts_log.L(`E: `, `rval.Url`)
+               return
+       }
+
+       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))
+               return
+       }
+       
        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{
+               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,
+       }
+}
+
+var (
+       appId string
+       appKey string
+)
+func init(){
+       if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoId`).(string);ok && v != ``{
+               appId = v
+       }
+       if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoKey`).(string);ok && v != ``{
+               appKey = v
+       }
+       if tts_ser == `youdao` && (appId == `` || appKey == ``) {
+               tts_log.L(`W: `, `未提供youdaoId、Key,使用baidu`)
+               tts_ser = `baidu`
+       }
+}
+func youdao(msg string) reqf.Rval {
+       if appId == "" || appKey == "" {
+               return baidu(msg)
+       }
+
+       var (
+               api = map[string]string{
+                       `q`:msg,
+                       `langType`:"auto",
+                       `appKey`:appId,
+                       `salt`:p.Stringf().Rand(1, 8),
+               }
+               postS string
+       )
+       api[`sign`] = strings.ToUpper(p.Md5().Md5String(api[`appKey`]+api[`q`]+api[`salt`]+appKey))
+       for k,v := range api {
+               if postS != "" {postS += "&"}
+               postS += k+`=`+v
+       }
+       return reqf.Rval{
+               Url:`https://openapi.youdao.com/ttsapi`,
+               PostStr:url.PathEscape(postS),
+               SaveToPath:p.Sys().Cdir()+`/tts.mp3`,
+               Timeout:3*1000,
+               Retry:1,
+               SleepTime:5000,
+               Proxy:c.Proxy,
+       }
 }
\ No newline at end of file
index 6c288f8a3b8afdef3c057f5e46e2caeaeaea763a..e1bfb843d2ca053067462baa77e80dce0d9b099d 100644 (file)
@@ -7,6 +7,10 @@
     "弹幕私信(额外)": "[弹幕机测试 额外]:弹幕",
     "TTS_配置-help": "将会运行[TTS_使用程序路径 获取的音频路径 TTS_使用程序参数]",
     "TTS_总开关": true,
+    "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS",
+    "TTS_服务器": "baidu",
+    "TTS_服务器_youdaoId": "",
+    "TTS_服务器_youdaoKey": "",
     "TTS_使用程序路径": "ffplay",
     "TTS_使用程序参数": "-autoexit -nodisp -volume 60",
     "弹幕-help": "弹幕相关",
index f10fd377468deecc67d241750994400d4bdce838..a098100026ea1788057643a656980697d7edb065 100644 (file)
@@ -14,7 +14,7 @@ require (
        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.24 // indirect
+       github.com/qydysky/part v0.5.25 // 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
index 41115e06883f1c45360574a68a85979326946123..433354c7226b11145757978c5212957824c09f78 100644 (file)
@@ -310,6 +310,8 @@ github.com/qydysky/part v0.5.23 h1:JaP+t+ILHScJh7FPE6AUPqrkdMhfRIXSgAetJNPFTp0=
 github.com/qydysky/part v0.5.23/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 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/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=
diff --git a/go.mod b/go.mod
index 4816e4227b3b7988daba8682aee76f505077526a..b2c2e3547c0860e208378c8492b754f039bacc56 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -12,7 +12,7 @@ require (
        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.24
+       github.com/qydysky/part v0.5.25
        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
diff --git a/go.sum b/go.sum
index 5ac7a6fbb5f537e42020598fce594848f2b0472a..62a7966434153ea2db33bc0245ef9fc898eaf22d 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -84,6 +84,8 @@ github.com/qydysky/part v0.5.23 h1:JaP+t+ILHScJh7FPE6AUPqrkdMhfRIXSgAetJNPFTp0=
 github.com/qydysky/part v0.5.23/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 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/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=