Skip to content

Commit b050b5d

Browse files
authored
🐛 修复tts语音切换问题 (#890)
* 🐛 修复tts语音切换问题 * 🎨 文案不变化 * 🎨 语音放到上层方法 * ✨ 添加新回复模式 * ✨ 优化回复内容 * 🐛 调整顺序
1 parent 2ff164c commit b050b5d

File tree

7 files changed

+103
-89
lines changed

7 files changed

+103
-89
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -977,7 +977,7 @@ print("run[CQ:image,file="+j["img"]+"]")
977977

978978
- [x] 发病 嘉然
979979

980-
- [x][塔菲|嘉然|东雪莲]说我测尼玛
980+
- [x] 让[嘉然|塔菲|东雪莲|懒羊羊|科比|孙笑川|陈泽|丁真|空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然]说我测尼玛
981981

982982
</details>
983983
<details>
@@ -1610,7 +1610,7 @@ print("run[CQ:image,file="+j["img"]+"]")
16101610
- [x] 随机污句子
16111611
- [x] 随机美句
16121612
- [x] 土味情话
1613-
- [x][丁真|陈泽|梅西|孙笑川|科比|懒羊羊|胡桃|雫るる]说我测尼玛
1613+
- [x][lulu]说我测尼玛
16141614

16151615
</details>
16161616

@@ -1633,7 +1633,7 @@ print("run[CQ:image,file="+j["img"]+"]")
16331633

16341634
- [x] @Bot 任意文本(任意一句话回复)
16351635

1636-
- [x] 设置回复模式[青云客 | 小爱 | ChatGPT]
1636+
- [x] 设置文字回复模式[婧枫|沫沫|青云客|小爱|ChatGPT]
16371637

16381638
- [x] 设置 ChatGPT api key xxx
16391639

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.20
44

55
require (
66
github.com/Baidu-AIP/golang-sdk v1.1.1
7-
github.com/FloatTech/AnimeAPI v1.7.1-0.20240411073357-0be3d9a5706d
7+
github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a
88
github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6
99
github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08
1010
github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/Baidu-AIP/golang-sdk v1.1.1 h1:RQsAmgDSAkiq22I6n7XJ2t3afgzFeqjY46FGhv
22
github.com/Baidu-AIP/golang-sdk v1.1.1/go.mod h1:bXnGw7xPeKt8aF7UCELKrV6UZ/46spItONK1RQBQj1Y=
33
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
44
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
5-
github.com/FloatTech/AnimeAPI v1.7.1-0.20240411073357-0be3d9a5706d h1:eKJxkCzayyHPvQ7+uhF6acGBTnoq5c9K7J6sHbv6xwQ=
6-
github.com/FloatTech/AnimeAPI v1.7.1-0.20240411073357-0be3d9a5706d/go.mod h1:bNHsYcUd1+Y5Al3CR6tdzKxcc0XLivXjmUsL9xG6sSw=
5+
github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a h1:K+1RAkIBb+3kkSxSkSTdTugSIsXJXrjEbwuv/BwUsP8=
6+
github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a/go.mod h1:bNHsYcUd1+Y5Al3CR6tdzKxcc0XLivXjmUsL9xG6sSw=
77
github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6 h1:Vaj8ulVbN8vTD4W7aj+BYeT6x8iKFneDnkgBCezomDY=
88
github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6/go.mod h1:TeTlp+hTxpJti4JSdmUqzxGEr4wUBOVct9YWBepilpc=
99
github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08 h1:dPLeoiTVSBlgls+66EB/UJ2e38BaASmBN5nANaycSBU=

plugin/ai_reply/ai_tts.go

Lines changed: 50 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,29 @@ import (
1111
"github.com/FloatTech/AnimeAPI/tts"
1212
"github.com/FloatTech/AnimeAPI/tts/baidutts"
1313
"github.com/FloatTech/AnimeAPI/tts/genshin"
14+
"github.com/FloatTech/AnimeAPI/tts/lolimi"
1415
"github.com/FloatTech/AnimeAPI/tts/ttscn"
1516
ctrl "github.com/FloatTech/zbpctrl"
1617
"github.com/FloatTech/zbputils/control"
1718
)
1819

19-
// 数据结构: [4 bits] [4 bits] [8 bits] [8 bits]
20-
// [ttscn模式] [百度模式] [tts模式] [回复模式]
20+
// 数据结构: [8 bits] [8 bits] [8 bits]
21+
// [具体人物] [tts模式] [回复模式]
2122

2223
// defaultttsindexkey
23-
// 数据结构: [4 bits] [4 bits] [8 bits]
24-
// [ttscn模式] [百度模式] [tts模式]
24+
// 数据结构: [8 bits] [8 bits]
25+
// [具体人物] [tts模式]
2526

26-
// [tts模式]: 0~200 genshin 201 baidu 202 ttscn
27+
// [tts模式]: 0~200 genshin 201 baidu 202 ttscn 203 lolimi
2728

2829
const (
29-
lastgsttsindex = 200 + iota
30-
baiduttsindex
30+
baiduttsindex = 201 + iota
3131
ttscnttsindex
32+
lolimittsindex
3233
)
3334

3435
// extrattsname is the tts other than genshin vits
35-
var extrattsname = []string{"百度", "TTSCN"}
36+
var extrattsname = []string{"百度", "TTSCN", "桑帛云"}
3637

3738
var ttscnspeakers = [...]string{
3839
"晓晓(女 - 年轻人)",
@@ -84,7 +85,7 @@ func (r replymode) setReplyMode(ctx *zero.Ctx, name string) error {
8485
if !ok {
8586
return errors.New("no such plugin")
8687
}
87-
return m.SetData(gid, (m.GetData(index)&^0xff)|(index&0xff))
88+
return m.SetData(gid, (m.GetData(gid)&^0xff)|(index&0xff))
8889
}
8990

9091
func (r replymode) getReplyMode(ctx *zero.Ctx) aireply.AIReply {
@@ -96,18 +97,22 @@ func (r replymode) getReplyMode(ctx *zero.Ctx) aireply.AIReply {
9697
if ok {
9798
switch m.GetData(gid) & 0xff {
9899
case 0:
99-
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
100+
return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
100101
case 1:
101-
return aireply.NewXiaoAi(aireply.XiaoAiURL, aireply.XiaoAiBotName)
102+
return aireply.NewLolimiAi(aireply.MomoURL, aireply.MomoBotName)
102103
case 2:
104+
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
105+
case 3:
106+
return aireply.NewXiaoAi(aireply.XiaoAiURL, aireply.XiaoAiBotName)
107+
case 4:
103108
k := ཆཏ.k
104109
if k != "" {
105110
return aireply.NewChatGPT(aireply.ChatGPTURL, k)
106111
}
107-
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
112+
return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
108113
}
109114
}
110-
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
115+
return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
111116
}
112117

113118
var ttsins = func() map[string]tts.TTS {
@@ -119,8 +124,8 @@ var ttsins = func() map[string]tts.TTS {
119124
}()
120125

121126
var ttsModes = func() []string {
122-
s := append(genshin.SoundList[:], make([]string, lastgsttsindex-len(genshin.SoundList))...) // 0-200
123-
s = append(s, extrattsname...) // 201 202 ...
127+
s := append(genshin.SoundList[:], make([]string, baiduttsindex-len(genshin.SoundList))...) // 0-200
128+
s = append(s, extrattsname...) // 201 202 ...
124129
return s
125130
}()
126131

@@ -146,14 +151,14 @@ func newttsmode() *ttsmode {
146151
if ok {
147152
index := m.GetData(defaultttsindexkey)
148153
msk := index & 0xff
149-
if msk >= 0 && (msk < int64(len(genshin.SoundList)) || msk == baiduttsindex || msk == ttscnttsindex) {
154+
if msk >= 0 && (msk < int64(len(ttsModes))) {
150155
(*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, index)
151156
}
152157
}
153158
return t
154159
}
155160

156-
func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt int) error {
161+
func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, character int) error {
157162
gid := ctx.Event.GroupID
158163
if gid == 0 {
159164
gid = -ctx.Event.UserID
@@ -165,7 +170,7 @@ func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt
165170
var index = int64(-1)
166171
for i, s := range genshin.SoundList {
167172
if s == name {
168-
index = int64(i)
173+
index = int64(i + 1)
169174
break
170175
}
171176
}
@@ -175,13 +180,17 @@ func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt
175180
index = baiduttsindex
176181
case extrattsname[1]:
177182
index = ttscnttsindex
183+
case extrattsname[2]:
184+
index = lolimittsindex
178185
default:
179186
return errors.New("语音人物" + name + "未注册index")
180187
}
181188
}
182189
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
183-
(*syncx.Map[int64, int64])(t).Store(gid, index)
184-
return m.SetData(gid, (m.GetData(gid)&^0xffff00)|((index<<8)&0xff00)|((int64(baiduper)<<16)&0x0f0000)|((int64(mockingsynt)<<20)&0xf00000))
190+
//按原来的逻辑map存的是前16位
191+
storeIndex := (m.GetData(gid) &^ 0xffff00) | ((index << 8) & 0xff00) | ((int64(character) << 16) & 0xff0000)
192+
(*syncx.Map[int64, int64])(t).Store(gid, (storeIndex>>8)&0xffff)
193+
return m.SetData(gid, storeIndex)
185194
}
186195

187196
func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
@@ -195,8 +204,12 @@ func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
195204
i = m.GetData(gid) >> 8
196205
}
197206
m := i & 0xff
198-
if m < 0 || (m >= int64(len(genshin.SoundList)) && m != baiduttsindex && m != ttscnttsindex) {
207+
if m <= 0 || (m >= int64(len(ttsModes))) {
199208
i, _ = (*syncx.Map[int64, int64])(t).Load(defaultttsindexkey)
209+
if i == 0 {
210+
i = ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).GetData(defaultttsindexkey)
211+
(*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, i)
212+
}
200213
m = i & 0xff
201214
}
202215
mode := ttsModes[m]
@@ -205,20 +218,22 @@ func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
205218
switch mode {
206219
case extrattsname[0]:
207220
id, sec, _ := strings.Cut(.k, ",")
208-
ins = baidutts.NewBaiduTTS(int(i&0x0f00)>>8, id, sec)
221+
ins = baidutts.NewBaiduTTS(int(i&0xff00)>>8, id, sec)
209222
case extrattsname[1]:
210223
var err error
211-
ins, err = ttscn.NewTTSCN("中文(普通话,简体)", ttscnspeakers[int(i&0xf000)>>12], ttscn.KBRates[0])
224+
ins, err = ttscn.NewTTSCN("中文(普通话,简体)", ttscnspeakers[int(i&0xff00)>>8], ttscn.KBRates[0])
212225
if err != nil {
213226
return nil, err
214227
}
228+
case extrattsname[2]:
229+
ins = lolimi.NewLolimi(int(i&0xff00) >> 8)
215230
default: // 原神
216231
k := .k
217232
if k != "" {
218-
ins = genshin.NewGenshin(int(m), .k)
233+
ins = genshin.NewGenshin(int(m-1), .k)
219234
ttsins[mode] = ins
220235
} else {
221-
return nil, errors.New("no valid speaker")
236+
ins = lolimi.NewLolimi(int(i&0xff00) >> 8)
222237
}
223238
}
224239
}
@@ -231,19 +246,20 @@ func (t *ttsmode) resetSoundMode(ctx *zero.Ctx) error {
231246
gid = -ctx.Event.UserID
232247
}
233248
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
234-
index := m.GetData(defaultttsindexkey)
235-
return m.SetData(gid, (m.GetData(gid)&0xff)|((index&^0xff)<<8)) // 重置数据
249+
// 只保留后面8位
250+
(*syncx.Map[int64, int64])(t).Delete(gid)
251+
return m.SetData(gid, (m.GetData(gid) & 0xff)) // 重置数据
236252
}
237253

238-
func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) error {
254+
func (t *ttsmode) setDefaultSoundMode(name string, character int) error {
239255
_, ok := ttsins[name]
240256
if !ok {
241257
return errors.New("不支持设置语音人物" + name)
242258
}
243259
index := int64(-1)
244260
for i, s := range genshin.SoundList {
245261
if s == name {
246-
index = int64(i)
262+
index = int64(i + 1)
247263
break
248264
}
249265
}
@@ -253,6 +269,8 @@ func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) er
253269
index = baiduttsindex
254270
case extrattsname[1]:
255271
index = ttscnttsindex
272+
case extrattsname[2]:
273+
index = lolimittsindex
256274
default:
257275
return errors.New("语音人物" + name + "未注册index")
258276
}
@@ -261,6 +279,7 @@ func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) er
261279
if !ok {
262280
return errors.New("[tts] service not found")
263281
}
264-
(*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, index)
265-
return m.SetData(defaultttsindexkey, (index&0xff)|((int64(baiduper)<<8)&0x0f00)|((int64(mockingsynt)<<12)&0xf000))
282+
storeIndex := (index & 0xff) | ((int64(character) << 8) & 0xff00)
283+
(*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, storeIndex)
284+
return m.SetData(defaultttsindexkey, storeIndex)
266285
}

0 commit comments

Comments
 (0)