Skip to content

Commit dc34a33

Browse files
authored
修复tts默认语音设置不成功问题 (#445)
* Update main.go * Update ai_tts.go
1 parent 2922854 commit dc34a33

2 files changed

Lines changed: 135 additions & 102 deletions

File tree

plugin/ai_reply/ai_tts.go

Lines changed: 87 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313

1414
const (
1515
cnapi = "https://genshin.azurewebsites.net/api/speak?format=mp3&id=%d&text=%s"
16-
// testString = "这是测试语音......"
1716
)
1817

1918
// 每个角色的测试文案
@@ -86,6 +85,51 @@ var (
8685
}
8786
)
8887

88+
/*************************************************************
89+
*******************************AIreply************************
90+
*************************************************************/
91+
func setReplyMode(ctx *zero.Ctx, name string) error {
92+
gid := ctx.Event.GroupID
93+
if gid == 0 {
94+
gid = -ctx.Event.UserID
95+
}
96+
var ok bool
97+
var index int64
98+
for i, s := range replyModes {
99+
if s == name {
100+
ok = true
101+
index = int64(i)
102+
break
103+
}
104+
}
105+
if !ok {
106+
return errors.New("no such mode")
107+
}
108+
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
109+
if !ok {
110+
return errors.New("no such plugin")
111+
}
112+
return m.SetData(gid, index)
113+
}
114+
115+
func getReplyMode(ctx *zero.Ctx) (name string) {
116+
gid := ctx.Event.GroupID
117+
if gid == 0 {
118+
gid = -ctx.Event.UserID
119+
}
120+
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
121+
if ok {
122+
index := m.GetData(gid)
123+
if int(index) < len(replyModes) {
124+
return replyModes[index]
125+
}
126+
}
127+
return "青云客"
128+
}
129+
130+
/*************************************************************
131+
***********************tts************************************
132+
*************************************************************/
89133
type ttsmode struct {
90134
sync.RWMutex
91135
mode map[int64]int64
@@ -106,10 +150,16 @@ func list(list []string, num int) string {
106150

107151
func newttsmode() *ttsmode {
108152
tts := &ttsmode{}
153+
tts.Lock()
154+
defer tts.Unlock()
109155
m, ok := control.Lookup(ttsServiceName)
110-
tts.mode = make(map[int64]int64)
156+
tts.mode = make(map[int64]int64, 2*len(soundList))
157+
tts.mode[-2905] = 1
111158
if ok {
112-
tts.mode[-2905] = m.GetData(-2905)
159+
index := m.GetData(-2905)
160+
if index > 0 && index < int64(len(soundList)) {
161+
tts.mode[-2905] = index
162+
}
113163
}
114164
return tts
115165
}
@@ -119,52 +169,70 @@ func (tts *ttsmode) setSoundMode(ctx *zero.Ctx, name string) error {
119169
if gid == 0 {
120170
gid = -ctx.Event.UserID
121171
}
122-
var i int
123-
var s string
124-
for i, s = range soundList {
172+
var index int64
173+
for i, s := range soundList {
125174
if s == name {
175+
index = int64(i + 1)
126176
break
127177
}
128178
}
179+
if index == 0 {
180+
return errors.New("不支持设置语音人物" + name)
181+
}
129182
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
130183
tts.Lock()
131184
defer tts.Unlock()
132-
tts.mode[gid] = int64(i)
133-
return m.SetData(gid, int64(i))
185+
tts.mode[gid] = index
186+
return m.SetData(gid, index)
134187
}
135188

136-
func (tts *ttsmode) getSoundMode(ctx *zero.Ctx) (i int64) {
189+
func (tts *ttsmode) getSoundMode(ctx *zero.Ctx) int64 {
137190
gid := ctx.Event.GroupID
138191
if gid == 0 {
139192
gid = -ctx.Event.UserID
140193
}
141-
tts.RLock()
142-
defer tts.RUnlock()
143-
return tts.mode[gid]
194+
tts.Lock()
195+
defer tts.Unlock()
196+
i, ok := tts.mode[gid]
197+
if !ok {
198+
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
199+
i = m.GetData(gid)
200+
}
201+
if i <= 0 || i >= int64(len(soundList)) {
202+
i = tts.mode[-2905]
203+
}
204+
return i - 1
144205
}
145206

146-
func (tts *ttsmode) resetSoundMode(ctx *zero.Ctx) {
207+
func (tts *ttsmode) resetSoundMode(ctx *zero.Ctx) error {
147208
gid := ctx.Event.GroupID
148209
if gid == 0 {
149210
gid = -ctx.Event.UserID
150211
}
151212
tts.Lock()
152213
defer tts.Unlock()
153214
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
154-
tts.mode[gid] = m.GetData(-2905)
215+
tts.mode[gid] = 0
216+
return m.SetData(gid, 0) // 重置数据
155217
}
156218

157-
func setDefaultSoundMode(name string) error {
158-
var i int
159-
var s string
160-
for i, s = range soundList {
219+
func (tts *ttsmode) setDefaultSoundMode(name string) error {
220+
var index int64
221+
for i, s := range soundList {
161222
if s == name {
223+
index = int64(i + 1)
162224
break
163225
}
164226
}
227+
if index == 0 {
228+
return errors.New("不支持设置语音人物" + name)
229+
}
230+
tts.Lock()
231+
defer tts.Unlock()
165232
m, ok := control.Lookup(ttsServiceName)
166233
if !ok {
167234
return errors.New("[tts] service not found")
168235
}
169-
return m.SetData(-2905, int64(i))
236+
tts.mode[-2905] = index
237+
return m.SetData(-2905, index)
170238
}

plugin/ai_reply/main.go

Lines changed: 48 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
package aireply
33

44
import (
5-
"errors"
65
"fmt"
76
"net/url"
87
"strconv"
@@ -26,7 +25,7 @@ const (
2625
var replyModes = [...]string{"青云客", "小爱"}
2726

2827
func init() { // 插件主体
29-
engine := control.Register(ttsServiceName, &ctrl.Options[*zero.Ctx]{
28+
enOftts := control.Register(ttsServiceName, &ctrl.Options[*zero.Ctx]{
3029
DisableOnDefault: true,
3130
Help: "语音回复(大家一起来炼丹)\n" +
3231
"- @Bot 任意文本(任意一句话回复)\n" +
@@ -36,15 +35,49 @@ func init() { // 插件主体
3635
"当前适用的原神人物含有以下:\n" + list(soundList[:], 5),
3736
})
3837
tts := newttsmode()
39-
engine.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
38+
enOfreply := control.Register(replyServiceName, &ctrl.Options[*zero.Ctx]{
39+
DisableOnDefault: false,
40+
Help: "人工智能回复\n" +
41+
"- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱]",
42+
})
43+
/*************************************************************
44+
*******************************AIreply************************
45+
*************************************************************/
46+
enOfreply.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
47+
Handle(func(ctx *zero.Ctx) {
48+
aireply := aireply.NewAIReply(getReplyMode(ctx))
49+
reply := message.ParseMessageFromString(aireply.Talk(ctx.ExtractPlainText(), zero.BotConfig.NickName[0]))
50+
// 回复
51+
time.Sleep(time.Second * 1)
52+
if zero.OnlyPublic(ctx) {
53+
reply = append(reply, message.Reply(ctx.Event.MessageID))
54+
ctx.Send(reply)
55+
return
56+
}
57+
ctx.Send(reply)
58+
})
59+
enOfreply.OnPrefix("设置回复模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
60+
param := ctx.State["args"].(string)
61+
err := setReplyMode(ctx, param)
62+
if err != nil {
63+
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
64+
return
65+
}
66+
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("成功"))
67+
})
68+
/*************************************************************
69+
***********************tts************************************
70+
*************************************************************/
71+
enOftts.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
4072
Handle(func(ctx *zero.Ctx) {
4173
msg := ctx.ExtractPlainText()
4274
// 获取回复模式
4375
r := aireply.NewAIReply(getReplyMode(ctx))
4476
// 获取回复的文本
4577
reply := r.TalkPlain(msg, zero.BotConfig.NickName[0])
4678
// 获取语音
47-
record := message.Record(fmt.Sprintf(cnapi, tts.getSoundMode(ctx), url.QueryEscape(
79+
index := tts.getSoundMode(ctx)
80+
record := message.Record(fmt.Sprintf(cnapi, index, url.QueryEscape(
4881
// 将数字转文字
4982
re.ReplaceAllStringFunc(reply, func(s string) string {
5083
f, err := strconv.ParseFloat(s, 64)
@@ -55,16 +88,12 @@ func init() { // 插件主体
5588
return numcn.EncodeFromFloat64(f)
5689
}),
5790
))).Add("cache", 0)
58-
if record.Data == nil {
59-
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
60-
return
61-
}
6291
// 发送语音
6392
if ID := ctx.SendChain(record); ID.ID() == 0 {
6493
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
6594
}
6695
})
67-
engine.OnRegex(`^设置语音模式(.*)$`, zero.AdminPermission, func(ctx *zero.Ctx) bool {
96+
enOftts.OnRegex(`^设置语音模式(.*)$`, zero.AdminPermission, func(ctx *zero.Ctx) bool {
6897
param := ctx.State["regex_matched"].([]string)[1]
6998
if _, ok := testRecord[param]; !ok {
7099
return false
@@ -92,7 +121,7 @@ func init() { // 插件主体
92121
time.Sleep(time.Second * 2)
93122
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功"))
94123
})
95-
engine.OnRegex(`^设置默认语音模式(.*)$`, zero.SuperUserPermission, func(ctx *zero.Ctx) bool {
124+
enOftts.OnRegex(`^设置默认语音模式(.*)$`, zero.SuperUserPermission, func(ctx *zero.Ctx) bool {
96125
param := ctx.State["regex_matched"].([]string)[1]
97126
if _, ok := testRecord[param]; !ok {
98127
return false
@@ -101,85 +130,21 @@ func init() { // 插件主体
101130
}).SetBlock(true).Handle(func(ctx *zero.Ctx) {
102131
param := ctx.State["regex_matched"].([]string)[1]
103132
// 保存设置
104-
err := setDefaultSoundMode(param)
133+
err := tts.setDefaultSoundMode(param)
105134
if err != nil {
106135
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
107136
return
108137
}
109138
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功"))
110139
})
111-
engine.OnFullMatch("恢复成默认语音模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
112-
tts.resetSoundMode(ctx)
140+
enOftts.OnFullMatch("恢复成默认语音模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
141+
err := tts.resetSoundMode(ctx)
142+
if err != nil {
143+
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
144+
return
145+
}
113146
// 设置验证
114-
name := tts.getSoundMode(ctx)
115-
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功,当前为", name))
147+
index := tts.getSoundMode(ctx)
148+
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功,当前为", soundList[index]))
116149
})
117-
engine = control.Register(replyServiceName, &ctrl.Options[*zero.Ctx]{
118-
DisableOnDefault: false,
119-
Help: "人工智能回复\n" +
120-
"- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱]",
121-
})
122-
// 回复 @和包括名字
123-
engine.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
124-
Handle(func(ctx *zero.Ctx) {
125-
aireply := aireply.NewAIReply(getReplyMode(ctx))
126-
reply := message.ParseMessageFromString(aireply.Talk(ctx.ExtractPlainText(), zero.BotConfig.NickName[0]))
127-
// 回复
128-
time.Sleep(time.Second * 1)
129-
if zero.OnlyPublic(ctx) {
130-
reply = append(reply, message.Reply(ctx.Event.MessageID))
131-
ctx.Send(reply)
132-
return
133-
}
134-
ctx.Send(reply)
135-
})
136-
engine.OnPrefix("设置回复模式").SetBlock(true).
137-
Handle(func(ctx *zero.Ctx) {
138-
param := ctx.State["args"].(string)
139-
err := setReplyMode(ctx, param)
140-
if err != nil {
141-
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
142-
return
143-
}
144-
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("成功"))
145-
})
146-
}
147-
148-
func setReplyMode(ctx *zero.Ctx, name string) error {
149-
gid := ctx.Event.GroupID
150-
if gid == 0 {
151-
gid = -ctx.Event.UserID
152-
}
153-
var ok bool
154-
var index int64
155-
for i, s := range replyModes {
156-
if s == name {
157-
ok = true
158-
index = int64(i)
159-
break
160-
}
161-
}
162-
if !ok {
163-
return errors.New("no such mode")
164-
}
165-
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
166-
if !ok {
167-
return errors.New("no such plugin")
168-
}
169-
return m.SetData(gid, index)
170-
}
171-
172-
func getReplyMode(ctx *zero.Ctx) (name string) {
173-
gid := ctx.Event.GroupID
174-
if gid == 0 {
175-
gid = -ctx.Event.UserID
176-
}
177-
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
178-
if ok {
179-
index := m.GetData(gid)
180-
if int(index) < len(replyModes) {
181-
return replyModes[index]
182-
}
183-
}
184-
return "青云客"
185150
}

0 commit comments

Comments
 (0)