Skip to content

Commit b3e68c7

Browse files
committed
✨ feature: 预添加语速参数支持,更新相关API和正则表达式
1 parent 5d41a4e commit b3e68c7

File tree

6 files changed

+181
-23
lines changed

6 files changed

+181
-23
lines changed

README.md

+13-13
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ git clone https://github.com/Cvandia/nonebot-plugin-fishspeech-tts
8484

8585
**在.env中添加以下配置**
8686

87-
| 基础配置 | 类型 | 必填项 | 默认值 | 说明 |
88-
| :--------------: | :-----: | :----: | :---------------: | :---------------------------------------------------------: |
89-
| tts_is_online | bool || True | 是否使用云端api |
90-
| tts_chunk_length | literal || "normal" | 请求时音频分片长度,默认为normal,可选:short, normal, long |
91-
| tts_max_new_tokens | int || 800 | 最大音频长度,默认为800,设置为0则为不限制 |
92-
| tts_audio_path | str || "./data/参考音频" | 语音素材路径,默认为"./data/参考音频" |
93-
| tts_prefix | str || None | 触发前缀,默认为None |
87+
| 基础配置 | 类型 | 必填项 | 默认值 | 说明 |
88+
| :----------------: | :-----: | :----: | :---------------: | :---------------------------------------------------------: |
89+
| tts_is_online | bool || True | 是否使用云端api |
90+
| tts_chunk_length | literal || "normal" | 请求时音频分片长度,默认为normal,可选:short, normal, long |
91+
| tts_max_new_tokens | int || 800 | 最大音频长度,默认为800,设置为0则为不限制 |
92+
| tts_audio_path | str || "./data/参考音频" | 语音素材路径,默认为"./data/参考音频" |
93+
| tts_prefix | str || None | 触发前缀,默认为None |
9494

9595
**注:参考音频的文件名格式为:[角色名]音频对应的文字标签.[音频后缀名]**
9696

@@ -103,12 +103,12 @@ ___
103103

104104
如果你想使用官方的api,请将配置项`tts_is_online`设置为`True`并配置以下
105105

106-
| 配置项 | 类型 | 必填项 | 默认值 | 说明 |
107-
| :------------------: | :---: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
108-
| online_api_url | str || "https://api.fish-audio.cn"| 官网api地址 |
109-
| online_authorization | str || "xxxxx" | 官网api鉴权秘钥,详见[链接](https://fish.audio/zh-CN/go-api/api-keys/) |
110-
| online_model_first | bool || True | 如果你想调用官方模型,通过自己的参考音频,定制角色音色,将此项设为`False`。当然,如果你没有准备参考音频,也会调用官网已经有的音色,具体详见[链接](https://fish.audio/zh-CN/) |
111-
| online_api_proxy | str || None | 代理地址,如:http://127.0.0.1:7890 |
106+
| 配置项 | 类型 | 必填项 | 默认值 | 说明 |
107+
| :------------------: | :---: | :----: | :-------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
108+
| online_api_url | str || "https://api.fish-audio.cn" | 官网api地址,可选https://api.fish.audio(被墙)或者默认值 |
109+
| online_authorization | str || "xxxxx" | 官网api鉴权秘钥,详见[链接](https://fish.audio/zh-CN/go-api/api-keys/) |
110+
| online_model_first | bool || True | 如果你想调用官方模型,通过自己的参考音频,定制角色音色,将此项设为`False`。当然,如果你没有准备参考音频,也会调用官网已经有的音色,具体详见[链接](https://fish.audio/zh-CN/) |
111+
| online_api_proxy | str || None | 代理地址,如:http://127.0.0.1:7890 |
112112

113113
---
114114

nonebot_plugin_fishspeech_tts/fish_audio_api.py

+2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ async def generate_servettsrequest(
8989
text: str,
9090
speaker_name: str,
9191
chunk_length: ChunkLength = ChunkLength.NORMAL,
92+
# TODO: speed: int = 0,
9293
) -> ServeTTSRequest:
9394
"""
9495
生成TTS请求
@@ -97,6 +98,7 @@ async def generate_servettsrequest(
9798
text: 待合成文本
9899
speaker_name: 说话人姓名
99100
chunk_length: 分片长度
101+
TODO:speed: 语速
100102
101103
Returns:
102104
ServeTTSRequest: TTS请求

nonebot_plugin_fishspeech_tts/fish_speech_api.py

+3
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,16 @@ async def generate_servettsrequest(
4343
text: str,
4444
speaker_name: str,
4545
chunk_length: ChunkLength = ChunkLength.NORMAL,
46+
# TODO: speed: int = 0,
4647
) -> ServeTTSRequest:
4748
"""
4849
生成TTS请求
4950
5051
Args:
5152
text: 文本
5253
speaker_name: 说话人姓名
54+
chunk_length: 请求语音的切片长度
55+
TODO:speed: 语速
5356
Returns:
5457
ServeTTSRequest: TTS请求
5558
"""

nonebot_plugin_fishspeech_tts/matcher.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from nonebot import get_driver, on_command, on_regex
22
from nonebot.adapters import Message
3+
from nonebot.params import RegexDict
34
from nonebot.rule import to_me
4-
from nonebot_plugin_alconna import Reply, Text, UniMessage, UniMsg
5+
from nonebot_plugin_alconna import Reply, UniMessage, UniMsg
56

67
from .config import config
78
from .exception import APIException
@@ -26,16 +27,19 @@
2627
config.tts_chunk_length, ChunkLength.NORMAL
2728
) # 请求语音长度
2829

29-
30-
tts_handler = on_regex(rf"^{prefix}(.+?)说([\s\S]*)", block=False)
30+
# "xxx说xxx -s int"
31+
tts_handler = on_regex(
32+
rf"^{prefix}(?P<speaker>.+?)说(?P<text>.+)?(?:\s+-s\s+(?P<speed>.+))?$",
33+
priority=15,
34+
)
3135
speaker_list = on_command(
3236
"语音列表", aliases={"语音角色列表"}, block=True, rule=to_me()
3337
)
3438
balance = on_command("语音余额", block=True, rule=to_me())
3539

3640

3741
@tts_handler.handle()
38-
async def tts_handle(message: UniMsg):
42+
async def tts_handle(message: UniMsg, regex_group: dict = RegexDict()): # noqa: B008
3943
if message.has(Reply):
4044
front_reply = message[Reply, 0].msg
4145
if isinstance(front_reply, Message):
@@ -44,11 +48,12 @@ async def tts_handle(message: UniMsg):
4448
text = front_reply
4549
else:
4650
text = str(front_reply)
47-
reply_msg = message[Text, 0].text
48-
speaker = reply_msg.split("说", 1)[0]
51+
speaker = regex_group["speaker"]
52+
# TODO: speed = regex_group["speed"]
4953
else:
50-
speaker, text = (message[Text, 0].text).split("说", 1)
51-
speaker = speaker.replace(prefix, "").strip() # 去除前缀
54+
text = regex_group["text"]
55+
speaker = regex_group["speaker"]
56+
# TODO: speed = regex_group["speed"]
5257

5358
try:
5459
fish_audio_api = FishAudioAPI()
@@ -58,12 +63,14 @@ async def tts_handle(message: UniMsg):
5863
request = await fish_audio_api.generate_servettsrequest(
5964
text, speaker, chunk_length
6065
)
66+
# TODO: request = await fish_audio_api.generate_ttsrequest(text, speaker, speed)
6167
audio = await fish_audio_api.generate_tts(request)
6268
else:
6369
await tts_handler.send("正在通过本地api合成语音, 请稍等")
6470
request = await fish_speech_api.generate_servettsrequest(
6571
text, speaker, chunk_length
6672
)
73+
# TODO: request = await fish_speech_api.generate_ttsrequest(text, speaker, speed)
6774
audio = await fish_speech_api.generate_tts(request)
6875
await UniMessage.voice(raw=audio).finish()
6976

0 commit comments

Comments
 (0)