Răsfoiți Sursa

fix(bug).when generating text that contains only punctuation marks or whitespace characters, the CPU usage reaches 100%, and the process crashes.

0xCAFEBABE0 11 luni în urmă
părinte
comite
84015697c2
2 a modificat fișierele cu 11 adăugiri și 0 ștergeri
  1. 4 0
      cosyvoice/cli/model.py
  2. 7 0
      cosyvoice/utils/common.py

+ 4 - 0
cosyvoice/cli/model.py

@@ -19,6 +19,7 @@ from torch.nn import functional as F
 from contextlib import nullcontext
 import uuid
 from cosyvoice.utils.common import fade_in_out
+from cosyvoice.utils.common import is_only_punctuation
 
 
 class CosyVoiceModel:
@@ -145,6 +146,9 @@ class CosyVoiceModel:
             llm_prompt_speech_token=torch.zeros(1, 0, dtype=torch.int32),
             flow_prompt_speech_token=torch.zeros(1, 0, dtype=torch.int32),
             prompt_speech_feat=torch.zeros(1, 0, 80), stream=False, speed=1.0, **kwargs):
+        if is_only_punctuation(text):
+            logging.info('only punctuation, skip synthesis:{}'.format(text))
+            return {'tts_speech': torch.zeros(1, int(0.01 * 22050))}    #返回10ms空白音频,保证了一致的上下游处理逻辑
         # this_uuid is used to track variables related to this inference thread
         this_uuid = str(uuid.uuid1())
         with self.lock:

+ 7 - 0
cosyvoice/utils/common.py

@@ -20,6 +20,7 @@ from typing import List
 
 import numpy as np
 import torch
+import regex
 
 IGNORE_ID = -1
 
@@ -153,3 +154,9 @@ def set_all_random_seed(seed):
     np.random.seed(seed)
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
+
+
+def is_only_punctuation(text):
+    # Regular expression: Match strings that consist only of punctuation marks or are empty.
+    punctuation_pattern = r'^[\p{P}\p{S}]*$'
+    return bool(regex.fullmatch(punctuation_pattern, text))