修復(fù) SadTalker 無(wú)法在新版本 Stable Diffusion WebUI 中運(yùn)行的問(wèn)題,你學(xué)會(huì)了嗎?
大家好,我是每天分享AI應(yīng)用的螢火君!
使用 Stable Diffusion WebUI 的同學(xué)可能會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,升級(jí)到新版本之后(大約是1.9.0之后的版本),原本可以正常使用的 SadTalker 生成時(shí)報(bào)錯(cuò)了,用不了了。本文就來(lái)分析和解決這個(gè)問(wèn)題。
簡(jiǎn)單介紹下SadTalker:SadTalker 可以說(shuō)是比較早的開(kāi)源數(shù)字人生產(chǎn)工具,只需要一張人物的照片和語(yǔ)音,我們就可以生成一個(gè)人物說(shuō)話的視頻。雖然現(xiàn)在已經(jīng)有效果更好、更豐富的各種數(shù)字人產(chǎn)品,不過(guò)SadTalker還是有一些用處的。
言歸正傳,SadTalker在新版 Stable Diffusion WebUI 中到底發(fā)生了什么問(wèn)題呢?
分析問(wèn)題
即然它能運(yùn)行在老版本的 Stable Diffusion WebUI 中,我猜就是程序兼容性的問(wèn)題了。
那么到底哪里不兼容呢?程序出了問(wèn)題,我們一般要先看看錯(cuò)誤信息是什么。
前端頁(yè)面中只顯示了一個(gè) Error,具體的錯(cuò)誤還得看控制臺(tái)中輸出的日志,我這里給大家粘貼出來(lái):
File "/root/SDWebUI/program/extensions/SadTalker/src/face3d/util/my_awing_arch.py", line 18, in calculate_points
preds = preds.astype(np.float, copy=False)
File "/root/miniconda3/envs/SDWebUI/lib/python3.10/site-packages/numpy/__init__.py", line 324, in __getattr__
raise AttributeError(__former_attrs__[attr])
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations. Did you mean: 'cfloat'?
看不懂英文的同學(xué)不要害怕,可以找個(gè)工具自行翻譯下。
這個(gè)錯(cuò)誤從上往下看是SadTalk中的這個(gè)文件報(bào)錯(cuò)了,位置是第18行:
SadTalker/src/face3d/util/my_awing_arch.py
繼續(xù)往下看是 Python3.10 中的 numpy 包拋出的錯(cuò)誤:
python3.10/site-packages/numpy/__init__.py
再往下是詳細(xì)的錯(cuò)誤說(shuō)明,大概是說(shuō)程序使用了 numpy 包中不存在的屬性 float,np.float 是一個(gè)過(guò)期的別名:
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`.
而且錯(cuò)誤說(shuō)明還給了一個(gè)明確的解決方案,直接使用 float 或者使用 np.float64。
To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
我們做個(gè)總結(jié):SadTalk使用了 numpy 中的一個(gè)被過(guò)期刪除的屬性,然后程序報(bào)錯(cuò)了,解決方案是換個(gè)用法。
另外,這個(gè)問(wèn)題僅在新版本的 Stable Diffusion WebUI 中出現(xiàn),可以猜測(cè)是新版 SD WebUI 依賴的 numpy 版本升級(jí)了,而 SadTalker 沒(méi)有同步升級(jí),還在使用舊的 numpy。
解決問(wèn)題
既然問(wèn)題說(shuō)的這么明白了,解決起來(lái)就很簡(jiǎn)單了。
我們不能將 numpy 降低到舊的版本,因?yàn)橛械某绦蛐枰掳姹荆蔷椭荒苄薷?SadTalker 使用新的方式了。
找到 src/face3d/util/my_awing_arch.py 第18行:
preds = preds.astype(np.float, copy=False)
修改為:
preds = preds.astype(float, copy=False)
除了這個(gè)地方,還有一處需要修改:
src/face3d/util/preprocess.py 第101行
trans_params = np.array([w0, h0, s, t[0], t[1]])
修改為:
trans_params = np.array([w0, h0, s, t[0][0], t[1][0]])
這個(gè)問(wèn)題也是 numpy 版本升級(jí)導(dǎo)致的,t[0] 和 t[1] 是兩個(gè)序列,不能直接作為數(shù)組中的元素。根據(jù)上下文我們使用索引取其中的第一個(gè)元素就可以了。
修改了這兩處代碼,SadTalker 又能正確的生成視頻了。
安裝插件
修改后的 SadTalker 我也發(fā)布在 Github上了,大家也可以直接使用下面這個(gè)鏈接來(lái)安裝插件:
https://github.com/bosima/SadTalker
圖片
安裝成功之后別忘了重啟 Stable Diffusion WebUI。