使用OpenVoice v2时遇OSError: [WinError 6]句柄无效问题求助
问题:OpenVoice v2调用tts_to_file触发WinError 6无效句柄
开发基于Llama3.1、Whisper、OpenVoice v2的语音对话机器人时,在获取Llama3.1文本回复后调用OpenVoice v2转换语音,执行model.tts_to_file(text, speaker_id, src_path, speed=1.0)时出现错误:
OSError: [WinError 6] Handle is invalid
环境:Windows 11 + VSCode虚拟环境,已修复虚拟环境GPU不可用问题,文件路径确认无误。
相关代码:
def text_to_speech(text, reference_speaker, language='ja'): tone_color_converter, device, output_dir = init_openvoice() # Extract target speaker embedding from the reference speaker target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, vad=True) # Use MeloTTS for base speaker text-to-speech generation model = TTS(language=language, device=device) speaker_ids = model.hps.data.spk2id base_speaker_key = list(speaker_ids.keys())[0] # Use the first base speaker for simplicity speaker_id = speaker_ids[base_speaker_key] # Generate the base TTS audio src_path = f'{output_dir}/tmp.wav' model.tts_to_file(text, speaker_id, src_path, speed=1.0) # Run tone color conversion to match the reference speaker's voice save_path = f'{output_dir}/final_output.wav' source_se = torch.load(f'checkpoints_v2/base_speakers/ses/{base_speaker_key}.pth', map_location=device) tone_color_converter.convert( audio_src_path=src_path, src_se=source_se, tgt_se=target_se, output_path=save_path, message="@MyShell" )
解决方法
- 排查文件句柄占用:Windows下该错误多因文件未正确释放导致。先删除
output_dir下的旧tmp.wav文件,避免残留进程占用;每次生成前可主动清理:import os if os.path.exists(src_path): os.remove(src_path) - 显式指定设备:即使GPU已修复,MeloTTS可能存在设备识别偏差,手动指定设备测试:
import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' model = TTS(language=language, device=device) - 替换tts_to_file为手动保存:绕开内置方法的文件句柄问题,直接生成音频数据再保存:
import soundfile as sf # 替换原model.tts_to_file行 audio_data = model.tts(text, speaker_id, speed=1.0) sf.write(src_path, audio_data, samplerate=model.hps.data.sampling_rate) - 使用绝对路径:避免相对路径的解析问题,将路径转为绝对路径:
src_path = os.path.abspath(os.path.join(output_dir, 'tmp.wav')) save_path = os.path.abspath(os.path.join(output_dir, 'final_output.wav')) - 更新依赖:检查并更新
torch、soundfile、MeloTTS等依赖包,修复版本兼容性问题。
内容的提问来源于stack exchange,提问作者정희준




