四、将翻译的内容通过OSC传给VRChat显示在角色头顶
基本流程:
- 新增依赖:脚本现在需要
python-osc
库。如果尚未安装,请运行:Bashpip install python-osc
- OSC客户端初始化:
- 在脚本开头导入
argparse
和pythonosc.udp_client
。 - 在
main()
函数的开始部分,设置argparse
来获取 OSC 服务器的 IP 和端口(默认为127.0.0.1:9000
)。 - 初始化
SimpleUDPClient
。
- 在脚本开头导入
- 发送OSC消息:
- 修改
process_transcription_and_translate
函数。 - 在该函数中,当同时获得原文和译文后,将它们组合成一个字符串,格式为
原文内容\n译文内容
。 - 使用 OSC 客户端将这个组合后的字符串发送到 VRChat 的
/chatbox/input
地址。
- 修改
详细代码:
-
导入模块:
Pythonimport argparse # For OSC client arguments from pythonosc import udp_client # For OSC communication
-
OSC 客户端全局变量:
Pythonosc_client = None
-
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
-
新增
send_text_to_vrchat()
函数:Pythondef 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的聊天通知音(避免过于频繁的提示音)。
-
在
process_transcription_and_translate()
中调用send_text_to_vrchat()
:Pythondef process_transcription_and_translate(transcribed_text): # ... (原有代码) ... # 无论翻译是否成功,都尝试发送 (如果翻译失败,translated_text_content会是None) send_text_to_vrchat(transcribed_text, translated_text_content)
运行前的准备:
- 安装
python-osc
:pip install python-osc
- 确保 VRChat OSC 已启用:在 VRChat 的 Action Menu (快捷菜单) -> Options -> OSC -> Enabled。
- FunASR API 和 Ollama 服务:确保它们仍在运行。
现在,当脚本识别并翻译文本后,它会尝试将结果通过 OSC 发送到您在 VRChat 中运行的客户端的聊天框。
No Comments