Arkueid / live2d-py

Live2D for Python (C++ Wrapper): Supports model loading, lip-sync and basic face rigging.
https://arkueid.github.io/live2d-py-docs/
MIT License
21 stars 4 forks source link

使用self.model.SetParameterValue()后意外退出 #4

Closed HowardJoness closed 1 month ago

HowardJoness commented 1 month ago

系统版本:Microsoft Windows 10 Pro 10.0.19045 N/A Build 19045

Python 版本:Python 3.12.0

窗口库:pygame 2.6.0

如题,当我运行self.model.SetParameterValue("ParamMouthY", 1.0)代码时,Live2D输出窗口会先无响应一下,然后程序退出。请问如何解决此问题

HowardJoness commented 1 month ago

或者说 能否推荐一个根据tts输出的speech.wav自动对口型的方法?

Arkueid commented 1 month ago

系统版本:Microsoft Windows 10 Pro 10.0.19045 N/A Build 19045

Python 版本:Python 3.12.0

窗口库:pygame 2.6.0

如题,当我运行self.model.SetParameterValue("ParamMouthY", 1.0)代码时,Live2D输出窗口会先无响应一下,然后程序退出。请问如何解决此问题

SetParameterValue有三个参数,会不会是这个问题?(不确定是不是打错了)


或者说 能否推荐一个根据tts输出的speech.wav自动对口型的方法?

目前想到有两种方法:

在对应模型的配置文件xxx.model3.json中定义一个动作组tts,把Sound路径换成tts生成的音频路径:

"Motions": {
            "tts": [
                {
                    "File": "",
                    "Sound": "tts_results/speech.wav"
                }
            ],
            "Idle": [
                {
                    "File": "motions/haru_g_idle.motion3.json",
                    "FadeInTime": 0.5,
                    "FadeOutTime": 0.5,
                    "Sound": "",
                    "Text": ""
                },
                {
                    "File": "motions/haru_g_m15.motion3.json",
                    "FadeInTime": 0.5,
                    "FadeOutTime": 0.5,
                    "Sound": "",
                    "Text": ""
                }
            ],
...

tts生成后播放动作model.StartMotion("tts", 0, live2d.MotionPriority.FORCE.value),播放动作时同时也会读取音频文件进行口型同步。

另一种方法比较麻烦,需要自行写一个算法,读取wav文件的波形数据,转换为ParamMouthOpenY的值,并同步到绘制上。

HowardJoness commented 1 month ago

tts生成后播放动作model.StartMotion("tts", 0, live2d.MotionPriority.FORCE.value),播放动作时同时也会读取音频文件进行口型同步。

试了这个方法 但是模型没有张嘴qwq (日志显示Speak动作在极短的时间内完成了 image image image image

Arkueid commented 1 month ago

用第二种方法吧。

添加了读取 wav 文件响度的工具:package/live2d/utils/lipsync.py

用法:

关闭内置的口型同步

model.SetLipSyncEnable(False)

创建 wavHandler 对象并设置口型同步幅度

wavHandler = WavHandler()
lipSyncN = 3

在播放动作的时候,同时播放音频并进行口型同步

def start_callback(group, no):
        pygame.mixer.music.load("audio1.wav")
        pygame.mixer.music.play()
        print("start lipsync")
        wavHandler.Start("audio1.wav")

model.StartMotion("Speak", 0, live2d.MotionPriority.FORCE.value, start_callback)

将 wav 响度同步到 ParamMouthOpenY

if wavHandler.Update():  # 获取 wav 的下一帧片段,并返回当前音频是否已结束
        model.SetParameterValue("ParamMouthOpenY", wavHandler.GetRms() * lipSyncN, 1)

完整代码

HowardJoness commented 1 month ago

好了 万分感谢您的帮助