Skip to main content

四、将翻译的内容通过OSC传给VRChat显示在角色头顶

 基本流程:

  1. 新增依赖:脚本现在需要 python-osc 库。如果尚未安装,请运行:
    Bash

    pip install python-osc
    
  2. OSC客户端初始化
    • 在脚本开头导入 argparsepythonosc.udp_client
    • main() 函数的开始部分,设置 argparse 来获取 OSC 服务器的 IP 和端口(默认为 127.0.0.1:9000)。
    • 初始化 SimpleUDPClient
  3. 发送OSC消息
    • 修改 process_transcription_and_translate 函数。
    • 在该函数中,当同时获得原文和译文后,将它们组合成一个字符串,格式为 原文内容\n译文内容
    • 使用 OSC 客户端将这个组合后的字符串发送到 VRChat 的 /chatbox/input 地址。

详细代码:

  1. 导入模块

    Python

    import argparse # For OSC client arguments
    from pythonosc import udp_client # For OSC communication
    
  2. OSC 客户端全局变量

    Python

    osc_client = None
    
  3. main() 函数中初始化 OSC 客户端

    Python

    # 0. 设置OSC参数解析器
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="127.0.0.1", help="The IP address of the OSC server (VRChat)")
    parser.add_argument("--port", type=int, default=9000, help="The port the OSC server (VRChat) is listening on")
    args = parser.parse_args()
    
    try:
        osc_client = udp_client.SimpleUDPClient(args.ip, args.port)
        print(f"OSC 客户端已初始化,将发送到 {args.ip}:{args.port}")
    except Exception as e:
        print(f"初始化 OSC 客户端失败: {e}")
        print("程序将继续运行,但不会发送 OSC 消息到 VRChat。")
        osc_client = None # 确保客户端为 None
    

    现在您可以在运行脚本时通过命令行参数指定 VRChat 的 IP 和端口,例如: python your_script_name.py --ip 192.168.1.100 --port 9001

  4. 新增 send_text_to_vrchat() 函数

    Python

    def send_text_to_vrchat(original_text, translated_text):
        """将原文和译文通过OSC发送到VRChat。"""
        global osc_client
        if not osc_client:
            print("OSC 客户端未初始化,跳过发送到 VRChat。")
            return
    
        if translated_text: # 确保有译文才发送
            message_to_send = f"{original_text}\n{translated_text}"
            # VRChat 聊天框对消息长度有限制
            max_bytes = 140 
            message_bytes = message_to_send.encode('utf-8')
            if len(message_bytes) > max_bytes:
                temp_message = message_to_send
                while len(temp_message.encode('utf-8')) > max_bytes:
                    temp_message = temp_message[:-1]
                message_to_send = temp_message + "..." if temp_message != message_to_send else temp_message
                print(f"警告: 消息过长,已截断。发送内容: {message_to_send}")
            try:
                # VRChat OSC /chatbox/input 通常接收一个字符串参数,以及一个可选的布尔值立即发送 (True)
                # 和一个可选的布尔值来触发通知声音 (默认为True,这里设为False避免频繁响铃)
                osc_client.send_message("/chatbox/input", [message_to_send, True, False]) 
                print(f"已通过 OSC 发送消息到 VRChat: /chatbox/input")
            except Exception as e:
                print(f"通过 OSC 发送消息到 VRChat 时出错: {e}")
        else: # 如果只有原文
            try:
                osc_client.send_message("/chatbox/input", [original_text, True, False])
                print(f"已通过 OSC (仅原文) 发送消息到 VRChat: /chatbox/input")
            except Exception as e:
                print(f"通过 OSC (仅原文) 发送消息到 VRChat 时出错: {e}")
    
    • 此函数会组合原文和译文。
    • 重要:VRChat 的聊天框输入对消息长度有限制(大约144字节,UTF-8编码下中文字符占比较多)。代码中加入了一个非常基础的截断逻辑,以防止消息过长导致发送失败或显示不全。您可能需要根据实际情况调整这个截断逻辑。
    • send_message 的第二个参数 True 表示立即发送,第三个参数 False 表示不播放VRChat的聊天通知音(避免过于频繁的提示音)。
  5. process_transcription_and_translate() 中调用 send_text_to_vrchat()

    Python

    def process_transcription_and_translate(transcribed_text):
        # ... (原有代码) ...
    
        # 无论翻译是否成功,都尝试发送 (如果翻译失败,translated_text_content会是None)
        send_text_to_vrchat(transcribed_text, translated_text_content)
    

运行前的准备:

  • 安装 python-oscpip install python-osc
  • 确保 VRChat OSC 已启用:在 VRChat 的 Action Menu (快捷菜单) -> Options -> OSC -> Enabled。
  • FunASR API 和 Ollama 服务:确保它们仍在运行。

现在,当脚本识别并翻译文本后,它会尝试将结果通过 OSC 发送到您在 VRChat 中运行的客户端的聊天框。