mirror of
https://github.com/FunAudioLLM/CosyVoice.git
synced 2026-02-05 18:09:24 +08:00
support streaming tts
This commit is contained in:
@@ -395,38 +395,45 @@ def run_sync_streaming_inference(
|
||||
# Reconstruct audio using cross-fade (from client_grpc_streaming.py)
|
||||
actual_duration = 0
|
||||
if audios:
|
||||
cross_fade_samples = int(chunk_overlap_duration * save_sample_rate)
|
||||
fade_out = np.linspace(1, 0, cross_fade_samples)
|
||||
fade_in = np.linspace(0, 1, cross_fade_samples)
|
||||
reconstructed_audio = None
|
||||
# Only spark_tts model uses cross-fade
|
||||
if model_name == "spark_tts":
|
||||
cross_fade_samples = int(chunk_overlap_duration * save_sample_rate)
|
||||
fade_out = np.linspace(1, 0, cross_fade_samples)
|
||||
fade_in = np.linspace(0, 1, cross_fade_samples)
|
||||
reconstructed_audio = None
|
||||
|
||||
# Simplified reconstruction based on client_grpc_streaming.py
|
||||
if not audios:
|
||||
print("Warning: No audio chunks received.")
|
||||
reconstructed_audio = np.array([], dtype=np.float32) # Empty array
|
||||
elif len(audios) == 1:
|
||||
reconstructed_audio = audios[0]
|
||||
# Simplified reconstruction based on client_grpc_streaming.py
|
||||
if not audios:
|
||||
print("Warning: No audio chunks received.")
|
||||
reconstructed_audio = np.array([], dtype=np.float32) # Empty array
|
||||
elif len(audios) == 1:
|
||||
reconstructed_audio = audios[0]
|
||||
else:
|
||||
reconstructed_audio = audios[0][:-cross_fade_samples] # Start with first chunk minus overlap
|
||||
for i in range(1, len(audios)):
|
||||
# Cross-fade section
|
||||
cross_faded_overlap = (audios[i][:cross_fade_samples] * fade_in +
|
||||
audios[i - 1][-cross_fade_samples:] * fade_out)
|
||||
# Middle section of the current chunk
|
||||
middle_part = audios[i][cross_fade_samples:-cross_fade_samples]
|
||||
# Concatenate
|
||||
reconstructed_audio = np.concatenate([reconstructed_audio, cross_faded_overlap, middle_part])
|
||||
# Add the last part of the final chunk
|
||||
reconstructed_audio = np.concatenate([reconstructed_audio, audios[-1][-cross_fade_samples:]])
|
||||
|
||||
if reconstructed_audio is not None and reconstructed_audio.size > 0:
|
||||
actual_duration = len(reconstructed_audio) / save_sample_rate
|
||||
# Save reconstructed audio
|
||||
sf.write(audio_save_path, reconstructed_audio, save_sample_rate, "PCM_16")
|
||||
else:
|
||||
print("Warning: No audio chunks received or reconstructed.")
|
||||
actual_duration = 0 # Set duration to 0 if no audio
|
||||
else:
|
||||
reconstructed_audio = audios[0][:-cross_fade_samples] # Start with first chunk minus overlap
|
||||
for i in range(1, len(audios)):
|
||||
# Cross-fade section
|
||||
cross_faded_overlap = (audios[i][:cross_fade_samples] * fade_in +
|
||||
audios[i - 1][-cross_fade_samples:] * fade_out)
|
||||
# Middle section of the current chunk
|
||||
middle_part = audios[i][cross_fade_samples:-cross_fade_samples]
|
||||
# Concatenate
|
||||
reconstructed_audio = np.concatenate([reconstructed_audio, cross_faded_overlap, middle_part])
|
||||
# Add the last part of the final chunk
|
||||
reconstructed_audio = np.concatenate([reconstructed_audio, audios[-1][-cross_fade_samples:]])
|
||||
|
||||
if reconstructed_audio is not None and reconstructed_audio.size > 0:
|
||||
reconstructed_audio = np.concatenate(audios)
|
||||
print(f"reconstructed_audio: {reconstructed_audio.shape}")
|
||||
actual_duration = len(reconstructed_audio) / save_sample_rate
|
||||
# Save reconstructed audio
|
||||
os.makedirs(os.path.dirname(audio_save_path), exist_ok=True)
|
||||
sf.write(audio_save_path, reconstructed_audio, save_sample_rate, "PCM_16")
|
||||
else:
|
||||
print("Warning: No audio chunks received or reconstructed.")
|
||||
actual_duration = 0 # Set duration to 0 if no audio
|
||||
|
||||
else:
|
||||
print("Warning: No audio chunks received.")
|
||||
@@ -667,6 +674,7 @@ async def main():
|
||||
manifest_item_list = split_data(manifest_item_list, num_tasks)
|
||||
|
||||
os.makedirs(args.log_dir, exist_ok=True)
|
||||
|
||||
tasks = []
|
||||
start_time = time.time()
|
||||
for i in range(num_tasks):
|
||||
|
||||
Reference in New Issue
Block a user