diff --git a/main/xiaozhi-server/core/providers/tts/base.py b/main/xiaozhi-server/core/providers/tts/base.py index f34158d1..b83f6f06 100644 --- a/main/xiaozhi-server/core/providers/tts/base.py +++ b/main/xiaozhi-server/core/providers/tts/base.py @@ -30,13 +30,15 @@ class TTSProviderBase(ABC): asyncio.run(self.text_to_speak(text, tmp_file)) except Exception as e: logger.bind(tag=TAG).error(f"语音生成失败: {text},错误: {e}") + if not os.path.exists(tmp_file): max_repeat_time -= 1 if max_repeat_time > 0: logger.bind(tag=TAG).error(f"再试{max_repeat_time}次") - asyncio.sleep(max_repeat_time / 10) if max_repeat_time > 0: - logger.bind(tag=TAG).info(f"语音生成成功: {text}:{tmp_file},重试{5 - max_repeat_time}次") + logger.bind(tag=TAG).info( + f"语音生成成功: {text}:{tmp_file},重试{5 - max_repeat_time}次" + ) return tmp_file except Exception as e: @@ -52,9 +54,11 @@ class TTSProviderBase(ABC): # 获取文件后缀名 file_type = os.path.splitext(audio_file_path)[1] if file_type: - file_type = file_type.lstrip('.') + file_type = file_type.lstrip(".") # 读取音频文件,-nostdin 参数:不要从标准输入读取数据,否则FFmpeg会阻塞 - audio = AudioSegment.from_file(audio_file_path, format=file_type, parameters=["-nostdin"]) + audio = AudioSegment.from_file( + audio_file_path, format=file_type, parameters=["-nostdin"] + ) # 转换为单声道/16kHz采样率/16位小端编码(确保与编码器匹配) audio = audio.set_channels(1).set_frame_rate(16000).set_sample_width(2) @@ -76,11 +80,11 @@ class TTSProviderBase(ABC): # 按帧处理所有音频数据(包括最后一帧可能补零) for i in range(0, len(raw_data), frame_size * 2): # 16bit=2bytes/sample # 获取当前帧的二进制数据 - chunk = raw_data[i:i + frame_size * 2] + chunk = raw_data[i : i + frame_size * 2] # 如果最后一帧不足,补零 if len(chunk) < frame_size * 2: - chunk += b'\x00' * (frame_size * 2 - len(chunk)) + chunk += b"\x00" * (frame_size * 2 - len(chunk)) # 转换为numpy数组处理 np_frame = np.frombuffer(chunk, dtype=np.int16)