From: qydysky Date: Sun, 13 Jun 2021 14:29:26 +0000 (+0800) Subject: TTS支持有道 X-Git-Tag: v0.5.10~41^2~99 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=d8583ca31d99a38ff468e277014808965ecd2f9a;p=bili_danmu%2F.git TTS支持有道 --- diff --git a/README.md b/README.md index 16b294a..bf3e68d 100644 --- 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默认不编译 diff --git a/Reply/F.go b/Reply/F.go index 22cb913..fe02427 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -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, diff --git a/Reply/tts.go b/Reply/tts.go index 68b51ac..2363738 100644 --- a/Reply/tts.go +++ b/Reply/tts.go @@ -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 diff --git a/demo/config/config_K_v.json b/demo/config/config_K_v.json index 6c288f8..e1bfb84 100644 --- a/demo/config/config_K_v.json +++ b/demo/config/config_K_v.json @@ -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": "弹幕相关", diff --git a/demo/go.mod b/demo/go.mod index f10fd37..a098100 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -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 diff --git a/demo/go.sum b/demo/go.sum index 41115e0..433354c 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -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 4816e42..b2c2e35 100644 --- 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 5ac7a6f..62a7966 100644 --- 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=