修復(fù) SadTalker 無法在新版本 Stable Diffusion WebUI 中運行的問題,你學(xué)會了嗎?
大家好,我是每天分享AI應(yīng)用的螢火君!
使用 Stable Diffusion WebUI 的同學(xué)可能會發(fā)現(xiàn)一個問題,升級到新版本之后(大約是1.9.0之后的版本),原本可以正常使用的 SadTalker 生成時報錯了,用不了了。本文就來分析和解決這個問題。
簡單介紹下SadTalker:SadTalker 可以說是比較早的開源數(shù)字人生產(chǎn)工具,只需要一張人物的照片和語音,我們就可以生成一個人物說話的視頻。雖然現(xiàn)在已經(jīng)有效果更好、更豐富的各種數(shù)字人產(chǎn)品,不過SadTalker還是有一些用處的。
言歸正傳,SadTalker在新版 Stable Diffusion WebUI 中到底發(fā)生了什么問題呢?
分析問題
即然它能運行在老版本的 Stable Diffusion WebUI 中,我猜就是程序兼容性的問題了。
那么到底哪里不兼容呢?程序出了問題,我們一般要先看看錯誤信息是什么。
前端頁面中只顯示了一個 Error,具體的錯誤還得看控制臺中輸出的日志,我這里給大家粘貼出來:
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é)不要害怕,可以找個工具自行翻譯下。
這個錯誤從上往下看是SadTalk中的這個文件報錯了,位置是第18行:
SadTalker/src/face3d/util/my_awing_arch.py
繼續(xù)往下看是 Python3.10 中的 numpy 包拋出的錯誤:
python3.10/site-packages/numpy/__init__.py
再往下是詳細的錯誤說明,大概是說程序使用了 numpy 包中不存在的屬性 float,np.float 是一個過期的別名:
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`.
而且錯誤說明還給了一個明確的解決方案,直接使用 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.
我們做個總結(jié):SadTalk使用了 numpy 中的一個被過期刪除的屬性,然后程序報錯了,解決方案是換個用法。
另外,這個問題僅在新版本的 Stable Diffusion WebUI 中出現(xiàn),可以猜測是新版 SD WebUI 依賴的 numpy 版本升級了,而 SadTalker 沒有同步升級,還在使用舊的 numpy。
解決問題
既然問題說的這么明白了,解決起來就很簡單了。
我們不能將 numpy 降低到舊的版本,因為有的程序需要新版本,那就只能修改 SadTalker 使用新的方式了。
找到 src/face3d/util/my_awing_arch.py 第18行:
preds = preds.astype(np.float, copy=False)
修改為:
preds = preds.astype(float, copy=False)
除了這個地方,還有一處需要修改:
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]])
這個問題也是 numpy 版本升級導(dǎo)致的,t[0] 和 t[1] 是兩個序列,不能直接作為數(shù)組中的元素。根據(jù)上下文我們使用索引取其中的第一個元素就可以了。
修改了這兩處代碼,SadTalker 又能正確的生成視頻了。
安裝插件
修改后的 SadTalker 我也發(fā)布在 Github上了,大家也可以直接使用下面這個鏈接來安裝插件:
https://github.com/bosima/SadTalker
圖片
安裝成功之后別忘了重啟 Stable Diffusion WebUI。