You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用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'))
    
  • 更新依赖:检查并更新torchsoundfileMeloTTS等依赖包,修复版本兼容性问题。

内容的提问来源于stack exchange,提问作者정희준

火山引擎 最新活动