diff --git a/README.md b/README.md
index cfcb503b..52ac5ff8 100644
--- a/README.md
+++ b/README.md
@@ -728,6 +728,21 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 符号说明: C5是中央C,后面不写数字,默认接5,Cb6<1,b代表降调,#代表升调,6比5高八度,<1代表音长×2,<3代表音长×8,<-1代表音长×0.5,<-3代表音长×0.125,R是休止符
+
+
+ 日韩 VITS 模型拟声
+
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moegoe"`
+
+ - [x] 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)
+
+ - [x] 让[수아|미미르|아린|연화|유화|선배]说(韩语)
+
+```
+记录在"0 10 * * *"触发的指令
+摸鱼提醒
+```
+
摸鱼
diff --git a/main.go b/main.go
index d557b719..247b2a7c 100644
--- a/main.go
+++ b/main.go
@@ -87,6 +87,7 @@ import (
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moegoe" // 日韩 VITS 模型拟声
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu" // 摸鱼
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu_calendar" // 摸鱼人日历
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/music" // 点歌
diff --git a/plugin/moegoe/main.go b/plugin/moegoe/main.go
new file mode 100644
index 00000000..9c14c81a
--- /dev/null
+++ b/plugin/moegoe/main.go
@@ -0,0 +1,45 @@
+// Package moegoe 日韩 VITS 模型拟声
+package moegoe
+
+import (
+ "fmt"
+ "net/url"
+
+ zero "github.com/wdvxdr1123/ZeroBot"
+ "github.com/wdvxdr1123/ZeroBot/message"
+
+ ctrl "github.com/FloatTech/zbpctrl"
+ "github.com/FloatTech/zbputils/control"
+ "github.com/FloatTech/zbputils/ctxext"
+)
+
+const (
+ jpapi = "https://moegoe.azurewebsites.net/api/speak?text=%s&id=%d"
+ krapi = "https://moegoe.azurewebsites.net/api/speakkr?text=%s&id=%d"
+)
+
+var speakers = map[string]uint{
+ "宁宁": 0, "爱瑠": 1, "芳乃": 2, "茉子": 3, "丛雨": 4, "小春": 5, "七海": 6,
+ "수아": 0, "미미르": 1, "아린": 2, "연화": 3, "유화": 4, "선배": 5,
+}
+
+func init() {
+ en := control.Register("moegoe", &ctrl.Options[*zero.Ctx]{
+ DisableOnDefault: false,
+ Help: "moegoe\n" +
+ "- 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)\n" +
+ "- 让[수아|미미르|아린|연화|유화|선배]说(韩语)",
+ }).ApplySingle(ctxext.DefaultSingle)
+ en.OnRegex(`^让(宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海)说([A-Za-z\s\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]+)$`).Limit(ctxext.LimitByGroup).SetBlock(true).
+ Handle(func(ctx *zero.Ctx) {
+ text := ctx.State["regex_matched"].([]string)[2]
+ id := speakers[ctx.State["regex_matched"].([]string)[1]]
+ ctx.SendChain(message.Record(fmt.Sprintf(jpapi, url.QueryEscape(text), id)))
+ })
+ en.OnRegex(`^让(수아|미미르|아린|연화|유화|선배)说([A-Za-z\s\d\u3131-\u3163\uac00-\ud7ff]+)$`).Limit(ctxext.LimitByGroup).SetBlock(true).
+ Handle(func(ctx *zero.Ctx) {
+ text := ctx.State["regex_matched"].([]string)[2]
+ id := speakers[ctx.State["regex_matched"].([]string)[1]]
+ ctx.SendChain(message.Record(fmt.Sprintf(krapi, url.QueryEscape(text), id)))
+ })
+}