feat: update emotion handling in audiobook segments and UI for multi-emotion selection
This commit is contained in:
@@ -445,19 +445,35 @@ class IndexTTS2Backend:
|
||||
|
||||
@staticmethod
|
||||
def _emo_text_to_vector(emo_text: str) -> Optional[list]:
|
||||
text = emo_text.lower()
|
||||
tokens = [t.strip() for t in emo_text.split('+') if t.strip()]
|
||||
matched = []
|
||||
for idx, words in enumerate(IndexTTS2Backend._EMO_KEYWORDS):
|
||||
for word in words:
|
||||
if word in text:
|
||||
matched.append(idx)
|
||||
break
|
||||
for tok in tokens:
|
||||
if ':' in tok:
|
||||
name_part, w_str = tok.rsplit(':', 1)
|
||||
try:
|
||||
weight: Optional[float] = float(w_str)
|
||||
except ValueError:
|
||||
weight = None
|
||||
else:
|
||||
name_part = tok
|
||||
weight = None
|
||||
name_lower = name_part.lower().strip()
|
||||
for idx, words in enumerate(IndexTTS2Backend._EMO_KEYWORDS):
|
||||
for word in words:
|
||||
if word in name_lower:
|
||||
matched.append((idx, weight))
|
||||
break
|
||||
if not matched:
|
||||
return None
|
||||
vec = [0.0] * 8
|
||||
score = 0.8 if len(matched) == 1 else 0.5
|
||||
for idx in matched:
|
||||
vec[idx] = 0.2 if idx == 1 else score
|
||||
has_explicit = any(w is not None for _, w in matched)
|
||||
if has_explicit:
|
||||
for idx, w in matched:
|
||||
vec[idx] = w if w is not None else 0.5
|
||||
else:
|
||||
score = 0.8 if len(matched) == 1 else 0.5
|
||||
for idx, _ in matched:
|
||||
vec[idx] = 0.2 if idx == 1 else score
|
||||
return vec
|
||||
|
||||
async def generate(
|
||||
|
||||
Reference in New Issue
Block a user