This commit is contained in:
yumoqing 2025-05-25 13:57:53 +00:00
parent 2f6c70f836
commit 33c535bec4
3 changed files with 43 additions and 36 deletions

View File

@ -1,4 +1,6 @@
import os
import io
import base64
import sys
import asyncio
import codecs
@ -125,8 +127,7 @@ class F5TTS:
return {
'text': gen_text,
'audio':audio,
'sample_rate':final_sample_rate,
'spectragram':spectragram
'sample_rate':final_sample_rate
}
def speed_convert(self, output_audio_np, speed_factor):
@ -151,6 +152,7 @@ class F5TTS:
async def split_text(self, text_gen, speaker):
chunks = split_text_with_dialog_preserved(text_gen)
debug(f'{len(chunks)=}')
# reg2 = self.config.speaker_match
reg2 = r"\[\[(\w+)\]\]"
ret = []
@ -183,6 +185,7 @@ class F5TTS:
async def _inference_stream(self, prompt, speaker, speed_factor=1.0):
text_gen = prompt
chunks = await self.split_text(prompt, speaker)
debug(f'{len(chunks)=}')
for chunk in chunks:
gen_text = chunk['text']
ref_audio = chunk['ref_audio']
@ -196,10 +199,17 @@ class F5TTS:
debug(f'{gen_text=} inference error\n{format_exc()}')
async def inference_stream(self, prompt, speaker, speed_factor=1.0):
for d in self._inference_stream(prompt, speaker, speed_factor=speed_factor):
async for d in self._inference_stream(prompt, speaker, speed_factor=speed_factor):
audio_b64=audio_ndarray_to_base64(d['audio'], d['sample_rate'])
d['audio'] = audio_b64
yield d
d['done'] = False
txt = json.dumps(d, ensure_ascii=False)
yield txt + '\n'
d = {
'done': True
}
txt = json.dumps(d, ensure_ascii=False)
yield txt + '\n'
def setup_voices(self):
config = getConfig()

View File

@ -1,46 +1,42 @@
{
"widgettype":"VBox",
"widgettype":"HBox",
"options":{
"height":"100%"
},
"subwidgets":[
{
"widgettype":"Filler",
"options":{},
"subwidgets":[
{
"widgettype":"Form",
"id":"form",
"options":{
"title":"流式返回",
"submit_url":"{{entire_url('/v1/infer_stream')}}",
"fields":[
{
"name":"speaker",
"label":"播音员",
"uitype":"code",
"value":"main",
"dataurl":"{{entire_url('/get_speakers.dspy')}}"
},
{
"name":"prompt",
"label":"文本",
"uitype":"text",
"uiparams":{
"rows":20,
"cols":80
}
}
]
"widgettype":"Form",
"id":"form",
"options":{
"width":"50%",
"title":"流式返回",
"submit_url":"{{entire_url('/v1/infer_stream')}}",
"fields":[
{
"name":"speaker",
"label":"播音员",
"uitype":"code",
"value":"main",
"dataurl":"{{entire_url('/get_speakers.dspy')}}"
},
{
"name":"prompt",
"label":"文本",
"uitype":"text",
"uiparams":{
"rows":20,
"cols":80
}
}
}
]
]
}
},
{
"id":"audio",
"widgettype":"AudioPlayer",
"widgettype":"TextedAudioPlayer",
"options":{
"height":"40px",
"width": "50%",
"height":"100%",
"auto_play":true
}
}

View File

@ -1,4 +1,5 @@
# normal mode
debug(f'{params_kw=}')
speaker = params_kw.speaker or 'main'
path = await infer(params_kw.prompt, speaker)
ret = entire_url(f'/idfile?path={path}')