2024年12月21日 星期六

如何使用 Intel AI PC 及 OpenVINO 實現虛擬主播

作者: Jack OmniXRI 2024/12/12
20241212_Digital_Human_Fig00

2022年底 OpenAI 引爆大語言模型(Large Lauguage Model, LLM)及生成式人工智慧(Generative Artificial Intelligence, GenAI),從此有各種文字、聲音、影像及多模態的應用,其中「虛擬主播」就是很常的應用例,如像民視的「敏熙」就是很經典的案例。

說到虛擬主播,其演進歷史也有數十年,早年需由美工人員大費周章設計好 3D 人物模型,再請配音員配上固定對白,最後由動畫人員把肢體動作、對白和嘴形對好,才能完成影片輸出,常見於高階 3D 電玩中較精緻的非玩家角色(Non-Player Character, NPC)。

後來隨著傳統電腦視覺及 3D 動畫技術演進,慢慢開始有了虛擬代理人(Virtual Agent)VTuber (Video + Youtuber)出現,只要事先準備好可愛的 3D 人物模型(公仔),加上高階動作補捉器(Motion Capture),再請真人表演肢體及臉部動作來驅動 3D 公仔,這樣可大幅減少美工及動畫人員的工作。早期電腦性能較差只能採預錄加上後處理合成方式處理,像日本「初音未來」這類「虛擬偶像」及擬真 3D 電影「阿凡達」就是知名代表。

後來隨電腦性能及電腦視覺技術成熟,只需使用一般網路攝影機,就能即時偵測到表演者的動作、表情並驅動 3D 公仔,一般會稱呼表演者為 VTuber(Video Youtuber),像日本知名「絆愛」、台灣 Yahoo TV 的「虎妮」就屬此類。這樣的技術很適合哪些不露臉的表演者和真實世界的互動,但缺點也是沒有真人就無法操作了,且真人表演不流暢也會影響虛擬人物表現。

十多年前深度學習電腦視覺及自然語言處理(Natual Language Processing, NLP)技術興起,讓電腦有機會能完全控制 3D 公仔的肢體動作、語音轉文字(Speech To Text, STT)、自然語言理解(Natual Language Understanding, NLU)、對話內容產生、語音轉文字(Text To Speech, TTS),於是開始有了虛擬助理(Vitrual Assistant)和虛擬代理人(Virtual Agent)出現。而隨著大語言模型及生成式技術越來越成熟,像真人一樣互動的數位分身(大陸慣稱數字人)(Digital Human, Meta Human)也開始出現在各種場域中,如捷運站的虛擬客服。

20241212_Digital_Human_Fig01
Fig. 1 虛擬分身演進,3D人物、人臉建模,動作、表情補捉、真人驅動VTuber,大語言模型及生成式AI客服、主播。(OmniXRI整理製作, 2024/12/12)

為了使大家能更進一步理解如何實作一個簡單離線版(邊緣端)的虛擬主播,可以輸入所需文字,產生對應語音,配合閉嘴人物影片生成新的對嘴影片。接下來就分別從「推論硬體及環境建置介紹」、「MeloTTS 文字轉語音生成」、「Wav2Lip 自動對嘴影片生成」及「建置完整虛擬主播」等四大部份作更進一步說明。

完整範例程式可參考下列網址。
(註:本文範例不適用 Google Colab 執行,僅限 Intel OpenVINO Notebooks 虛擬環境下使用)
https://github.com/OmniXRI/digital_human

1. 推論硬體及環境建置介紹

這裡選用了 Intel AI PC Asus NUC 14 Pro (Core Ultra 5 125H, 內建 Arc GPU, 10TOPS NPU, DDR5 32GB),作為邊緣推論裝置,完整規格可參考[1]。建議使用前先到官網更新一下 NPU 驅動程式[2]。
註:如果你仍是使用 Core i3/i5/i7 12/13/14代CPU,執行在 Windows 10,原則上以下各範例還是可以執行,只是速度上會慢上許多。

本文主要使用 Windows 11,工作環境是根據 Intel OpenVINO Notebooks 建議的 Python 虛擬環境。如果你未曾安裝過 OpenVINO 及 Notebooks 則可參考官方 Github 說明 [3] 進行全新的安裝。
註:如需中文安裝說明,可參考[4]第2小節說明

OpenVINO Notebooks 目前最新版(latest)為 2024.5 版,原則大部份的範例都可執行在 OpenVINO 2024.x 版。由於 w2vlip 範例[5] 只存在 2024.5版中,所以如果電腦中已安裝過較舊版本 OpenVINO Notebooks,請先下載最新版 openvinotoolkit/openvino_notebooks 的ZIP格式檔案,解壓縮後再把 /notebooks/wav2lip 整個檔案夾複製到自己電腦上原先 /openvino_notebooks/notebooks 路徑下,才能進行後面的工作。

不管全新或部份安裝,為避免影響到原先的範例程式,所以請先將 /notebooks/wav2lip 檔案夾複製一份並更名為 /notebooks/digital_humnan,以便後續將 MeloTTS 和 Wav2Lip 整合在一起。接著將 https://github.com/OmniXRI/digital_human 中三個 ipynb 範例下載到 \digitl_human 路徑下,以利後續測試。

另外由於程式會使用到影音相關處理函式,但這些未包括在 OpenVINO & Notebooks 範例中,所以需手動安裝 ffmpeg 函式庫。請確認已進入 OpenVINO Notebooks Python 虛擬環境中後再安裝,如下指令所示。

pip install ffmpeg

2. MeloTTS 文字轉語音生成

目前 OpenVINO 在文字轉語音(TTS)方面雖有提供 OuteTTS 和 Parler-TTS 範例,但本文使用另一個更輕量的模型 MeloTTS [6]。它提供了多國語言,如英文、法文、日文、韓文、西班牙文等,其中當然也有包含中文(可中英文混合)。使用上非常簡單,只需提供待發音之文字內容、語速即可。

由於 MeloTTS 尚未正式加入 OpenVINO Notebooks 中,所以這裡我們需要手動安裝相關套件。安裝前,首先啟動 OpenVINO Notebooks Python 虛擬環境,但先不要啟動 Jupyter Notebooks 環境,進到 /openvino_notebooks/notebooks/ 路徑中準備安裝。

接著到 https://github.com/zhaohb/MeloTTS-OV/tree/speech-enhancement-and-npu ,按下綠色「<> Code」,選擇「Download ZIP」,解壓縮後把 \MeloTTS-OV-speech-enhancement-and-npu 檔案夾內所有內容複製到 \openvino_notebooks\notebooks\digital_human 下。
註:請不要直接複製網頁上 git clone 命令,這樣會誤下載到標準版本,導致 OpenVINO 無法正確執行。

再來進到指定路徑,開始安裝必要套件。

cd digital_human pip install -r requirements.txt pip install openvino nncf python setup.py develop # or pip install -e . python -m unidic download python -m nltk.downloader averaged_perceptron_tagger_eng pip install deepfilternet # optional for enhancing speech pip install ffmpeg # 一定要裝,不然影音內容無法顯示

完成後執行下列命令進行文字轉語音測試。這裡 language 設為 ZH(中英混合)即可, tts_device 可設為 CPU, GPU, 而 bert_device 則可設為 CPU, GPU, NPU。

python test_tts.py --language ZH --tts_device CPU --bert_device CPU

第一次執行會花比較多的時間下載模型及轉換成 OpenVINO 用的 IR格式(bin+xml),完成的模型會存放在 \tts_ov_ZH 路徑下。執行完成後會得到 ov_en_int8_ZH.wav ,語音內容為「我們探討如何在 Intel 平台上轉換和優化 atificial intelligence 模型。」,可開啟聲音播放軟體進行檢查。

完成上述步驟後才能執行下列簡易版帶介面程式 MeloTTS_run.ipynb 。這個範例有提供 Gradio 介面,方便大家以網頁方式重覆輸入測試字串及檢查生成聲音檔案內容。

下次想要測試時,由於已有轉換好的模型,所以直接開啟並執行這個範例即可執行文字轉語音工作。

# MeloTTS for OpenVINO 單獨執行含Gradio介面範例 # <MeloTTS_run.ipynb> # by Jack OmniXRI, 2024/12/12 from melo.api import TTS from pathlib import Path import time # MeloTTS 文字轉語音基本參數設定 speed = 1.0 # 調整語速 use_ov = True # True 使用 OpenVINO, False 使用 PyTorch use_int8 = True # True 啟用 INT8 格式 speech_enhance = True # True 啟用語音增強模式 tts_device = "CPU" # 指定 TTS 推論裝置 , "CPU" 或 "GPU"(這裡指 Intel GPU) bert_device = "CPU" # 指定 Bert 推論裝置, "CPU" 或 "GPU" 或 "NPU" lang = "ZH" # 設定語系, EN 英文, ZH 中文(含混合英文、簡繁中文皆可) # 指定測試文字轉語音字串 if lang == "ZH": text = "我們討如何在 Intel 平台上轉換和優化 artificial intelligence 模型" elif lang == "EN": text = "For Intel platforms, we explore the methods for converting and optimizing models." # 若指定語音增強模式則新增 process_audio() 函式 if speech_enhance: from df.enhance import enhance, init_df, load_audio, save_audio import torchaudio # 將輸入聲音檔案處理後轉存到新檔案中 def process_audio(input_file: str, output_file: str, new_sample_rate: int = 48000): """ Load an audio file, enhance it using a DeepFilterNet, and save the result. Parameters: input_file (str): Path to the input audio file. output_file (str): Path to save the enhanced audio file. new_sample_rate (int): Desired sample rate for the output audio file (default is 48000 Hz). """ model, df_state, _ = init_df() audio, sr = torchaudio.load(input_file) # Resample the WAV file to meet the requirements of DeepFilterNet resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=new_sample_rate) resampled_audio = resampler(audio) enhanced = enhance(model, df_state, resampled_audio) # Save the enhanced audio save_audio(output_file, enhanced, df_state.sr()) # 初始化 TTS model = TTS(language=lang, tts_device=tts_device, bert_device=bert_device, use_int8=use_int8) # 取得語者資訊 speaker_ids = model.hps.data.spk2id speakers = list(speaker_ids.keys()) # 若指定使用 OpenVINO, 檢查該語系是否已處理過,若無則進行轉換,結果會存在 \tts_ov_語系 路徑下 if use_ov: ov_path = f"tts_ov_{lang}" if not Path(ov_path).exists(): # 將原始模型轉換成 OpenVINO IR (bin+xml) 格式 model.tts_convert_to_ov(ov_path, language= lang) # 進行模型初始化 model.ov_model_init(ov_path, language = lang) if not use_ov: # 若未使用 OpenVINO for speaker in speakers: output_path = 'en_pth_{}.wav'.format(str(speaker)) start = time.perf_counter() model.tts_to_file(text, speaker_ids[speaker], output_path, speed=speed*0.75, use_ov = use_ov) end = time.perf_counter() else: # 若使用 OpenVINO for speaker in speakers: output_path = 'ov_en_int8_{}.wav'.format(speaker) if use_int8 else 'en_ov_{}.wav'.format(speaker) start = time.perf_counter() model.tts_to_file(text, speaker_ids[speaker], output_path, speed=speed, use_ov=use_ov) if speech_enhance: print("Use speech enhance") process_audio(output_path,output_path) end = time.perf_counter() dur_time = (end - start) * 1000 print(f"MeloTTS 文字轉語音共花費: {dur_time:.2f} ms") # 使用 Gradio 產生互動介面 import gradio as gr # 定義文字轉語音處理函式 tts() # 輸入: content(字串)、 use_ov(布林值)、 speed(數值) # 輸出: "MeloTTS 文字轉語音共花費: xx.xx ms"(字串)、 語音檔案名稱(字串) def tts(content, use_ov, speed): start = time.perf_counter() model.tts_to_file(content, speaker_ids[speaker], output_path, speed=speed/100, use_ov=use_ov) if speech_enhance: print("Use speech enhance") process_audio(output_path,output_path) end = time.perf_counter() dur_time = (end - start) * 1000 audio = "ov_en_int8_ZH.wav" result = f"MeloTTS 文字轉語音共花費: {dur_time:.2f} ms" return result, audio # 建立輸人及輸出簡單應用介面 # fn: 介面函數名稱 # inputs: 輸人格式, 文字(標籤:名字, 值: “請輸入文字內容")、使用 OpenVINO(複選盒)、滑動桿(標籤:語速(%),最小值50,最大值200,預設值100) # outputs: 輸出格式,結果字串(標籤:輸出)、輸出音檔(標籤:輸出結果, 檔格式式: filetype) demo = gr.Interface( fn=tts, inputs=[gr.Textbox(label="文字", value = "請輸入文字內容"), gr.Checkbox(value=True, label="Use_OpenCV"), gr.Slider(50, 200, value=100, label="語速(%)") ], outputs=[gr.Textbox(label="轉換時間"), gr.Audio(label="輸出結果", type="filepath")], ) # 執行顯示介面 demo.launch()

20241212_Digital_Human_Fig02
Fig. 2 執行 MeloTTS_run.ipynb 生成語音結果。(OmniXRI整理製作, 2024/12/12)

3. Wav2Lip 自動對嘴影片生成

由於前面已於 \digital_human 路徑下備妥 wav2lip 相關範例,此時啟動 OpenVINO Notebooks Python 虛擬環境後,即可進入 Jupyter Notebooks 環境,進到 /openvino_notebooks/notebooks/digital_human ,開啟 wav2lip.ipynb 全部執行即可。

在這個範例中,共需使用到二個模型,一個負責臉部偵測(Face Detection),另一個則負責將產生對應聲音的嘴形影像(Wave to Lip)。

第一次執行會花費很多時間,因為程式會下載相關模型並轉換好 OpenVINO 所需 IR格式(bin+xml),預設會存放在 \models 路徑下。 Gradio 介面啟動後,點擊最下方的 Example ,就會自動將實驗用影音檔載入輸入端,接著按下「Submit」等待一段時間後就能得到輸出影片,預設會存放在 \Results 路徑下,名為 result_voice.mp4 。

這裡也支援直接從網路攝影機錄影、錄音,再進行影像生成。錄製時建議影片長度要大於聲音長度,否則會發生自動重播造成的不連續跳動感。

完成上述步驟後才能執行下列簡易版帶介面程式 wav2lip_run.ipynb 。這個範例有提供 Gradio 介面,方便大家以網頁方式重覆輸入影音檔案及檢查生成影像檔案內容。

由於 wav2lip.ipynb 並不會自動偵測模型是否已下載和轉換,所以當重新執行時非常耗時,建議第二次執行時,直接開啟 wav2lip_run.ipynb 並執行,由於已有轉換好的模型,可直接執行影音對嘴轉換,節省許多時間。

# wav2lip 單獨執行含Gradio介面範例 # <wav2lip_run.ipynb> # by Jack_OmniXRI, 2024/12/12 from notebook_utils import device_widget # 設定下拉式選單,以選擇推論裝置 (CPU, GPU, NPU, AUTO) (這裡的GPU是指Intel內顯) device = device_widget() device import os import sys from pathlib import Path #print(os.path.abspath('.')) sys.path.append('./wav2lip') # 為了讓系統找得到 wav2lip 相關函式,所以手動加入相關路徑 OV_FACE_DETECTION_MODEL_PATH = Path("models/face_detection.xml") # 指定人臉偵測模型路徑 OV_WAV2LIP_MODEL_PATH = Path("models/wav2lip.xml") # 指定 wav2lip 模型路徑 from ov_inference import ov_inference # 確認存放輸出結果路徑是否存在,若否則建立 \results 路徑 if not os.path.exists("results"): os.mkdir("results") # 使用 OpenVINO 進行推論 ov_inference( "data_video_sun_5s.mp4", # 指定原始影片檔案 "data_audio_sun_5s.wav", # 指定聲音檔案 face_detection_path=OV_FACE_DETECTION_MODEL_PATH, # 指定人臉偵測模型路徑 wav2lip_path=OV_WAV2LIP_MODEL_PATH, # 指定 wav2lip 模型路徑 inference_device=device.value, # 指定推論裝置 outfile="results/result_voice.mp4", # 輸出結果檔案名稱 ) # 使用 Gradio 產生互動介面 from gradio_helper import make_demo demo = make_demo(fn=ov_inference) try: demo.queue().launch(debug=True) except Exception: demo.queue().launch(debug=True, share=True)

20241212_Digital_Human_Fig03
Fig. 3 執行 wav2lip_run.ipynb 生成對嘴影像結果。(OmniXRI整理製作, 2024/12/12)

4. 建置完整虛擬主播

當已可成功執行上述二個範例( melotts_run.ipynb, wav2lip_run.ipynb )後,代表相關環境都已準備好,此時才能執行 digital_human.ipynb 這個「虛擬主播」完整範例。

使用時可依下列步驟在 Gradio 介面上進行操作。

  1. 在文字欄位輸入一段文字。
  2. 調整語速(50% ~ 200%,預計100%)
  3. 按下「生成語音」鍵即可透過 MeloTTS 產生一個聲音檔案,預設為 "ov_en_int8_ZH.wav"。
  4. 接著按下「載入樣本」鍵即可載入一個預設的影片(data_video_sun_5s.mp4)和剛才生成的聲音檔案。這裡亦可直接上傳影片和聲音檔案或開啟網路攝影機直接錄影、錄音再進行合成。
  5. 按下「生成影片」鍵即可開始使用 Wav2Lip 進行影片生成。
  6. 完成生成後,點擊影片左下方播放鍵可檢視生成結果。
  7. 如果有需要,點擊影片右上方下載鍵可將檔案下載到電腦上。

如想自行調整 Gradio 介面可參考【vMaker Edge AI專欄 #24】 如何使用 Gradio 快速搭建人工智慧應用圖形化人機介面

# Digital Human 虛擬主播 # <digital_human.ipynb> # by Jack_OmniXRI, 2024/12/12 import os import sys from pathlib import Path from melo.api import TTS import time import gradio as gr #print(os.path.abspath('.')) sys.path.append('./wav2lip') # 為了讓系統找得到 wav2lip 相關函式,所以手動加入相關路徑 from notebook_utils import device_widget from ov_inference import ov_inference # MeloTTS 文字轉語音設定及處理函式 speed = 1.0 # 調整語速 use_ov = True # True 使用 OpenVINO, False 使用 PyTorch use_int8 = True # True 啟用 INT8 格式 speech_enhance = True # True 啟用語音增強模式 tts_device = "CPU" # 指定 TTS 推論裝置 , "CPU" 或 "GPU"(這裡指 Intel GPU) bert_device = "CPU" # 指定 Bert 推論裝置, "CPU" 或 "GPU" 或 "NPU" lang = "ZH" # 設定語系, EN 英文, ZH 中文(含混合英文、簡繁中文皆可) # 指定測試文字轉語音字串 if lang == "ZH": text = "我們討如何在 Intel 平台上轉換和優化 artificial intelligence 模型" elif lang == "EN": text = "For Intel platforms, we explore the methods for converting and optimizing models." # 若指定語音增強模式則新增 process_audio() 函式 if speech_enhance: from df.enhance import enhance, init_df, load_audio, save_audio import torchaudio # 將輸入聲音檔案處理後轉存到新檔案中 def process_audio(input_file: str, output_file: str, new_sample_rate: int = 48000): """ Load an audio file, enhance it using a DeepFilterNet, and save the result. Parameters: input_file (str): Path to the input audio file. output_file (str): Path to save the enhanced audio file. new_sample_rate (int): Desired sample rate for the output audio file (default is 48000 Hz). """ model, df_state, _ = init_df() audio, sr = torchaudio.load(input_file) # Resample the WAV file to meet the requirements of DeepFilterNet resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=new_sample_rate) resampled_audio = resampler(audio) enhanced = enhance(model, df_state, resampled_audio) # Save the enhanced audio save_audio(output_file, enhanced, df_state.sr()) # 初始化 TTS model = TTS(language=lang, tts_device=tts_device, bert_device=bert_device, use_int8=use_int8) # 取得語者資訊 speaker_ids = model.hps.data.spk2id speakers = list(speaker_ids.keys()) # 若指定使用 OpenVINO, 檢查該語系是否已處理過,若無則進行轉換,結果會存在 \tts_ov_語系 路徑下 if use_ov: ov_path = f"tts_ov_{lang}" if not Path(ov_path).exists(): # 將原始模型轉換成 OpenVINO IR (bin+xml) 格式 model.tts_convert_to_ov(ov_path, language= lang) # 進行模型初始化 model.ov_model_init(ov_path, language = lang) if not use_ov: # 若未使用 OpenVINO for speaker in speakers: output_path = 'en_pth_{}.wav'.format(str(speaker)) start = time.perf_counter() model.tts_to_file(text, speaker_ids[speaker], output_path, speed=speed*0.75, use_ov = use_ov) end = time.perf_counter() else: # 若使用 OpenVINO for speaker in speakers: output_path = 'ov_en_int8_{}.wav'.format(speaker) if use_int8 else 'en_ov_{}.wav'.format(speaker) start = time.perf_counter() model.tts_to_file(text, speaker_ids[speaker], output_path, speed=speed, use_ov=use_ov) if speech_enhance: print("Use speech enhance") process_audio(output_path,output_path) end = time.perf_counter() dur_time = (end - start) * 1000 print(f"MeloTTS 文字轉語音共花費: {dur_time:.2f} ms") # 聲音自動對嘴生成設定及處理函式 from notebook_utils import device_widget # 設定下拉式選單,以選擇推論裝置 (CPU, GPU, NPU, AUTO) (這裡的GPU是指Intel內顯) device = device_widget() device import os import sys from pathlib import Path #print(os.path.abspath('.')) sys.path.append('./wav2lip') # 為了讓系統找得到 wav2lip 相關函式,所以手動加入相關路徑 OV_FACE_DETECTION_MODEL_PATH = Path("models/face_detection.xml") # 指定人臉偵測模型路徑 OV_WAV2LIP_MODEL_PATH = Path("models/wav2lip.xml") # 指定 wav2lip 模型路徑 from ov_inference import ov_inference # 確認存放輸出結果路徑是否存在,若否則建立 \results 路徑 if not os.path.exists("results"): os.mkdir("results") # 使用 OpenVINO 進行推論(至少跑一次) ov_inference( "data_video_sun_5s.mp4", # 指定原始影片檔案 "data_audio_sun_5s.wav", # 指定聲音檔案 face_detection_path=OV_FACE_DETECTION_MODEL_PATH, # 指定人臉偵測模型路徑 wav2lip_path=OV_WAV2LIP_MODEL_PATH, # 指定 wav2lip 模型路徑 inference_device=device.value, # 指定推論裝置 outfile="results/result_voice.mp4", # 輸出結果檔案名稱 ) # 使用 Gradio 產生互動介面 # import gradio as gr # 定義文字轉語音處理函式 tts() # 輸入: content(字串)、 use_ov(布林值)、 speed(數值) # 輸出: "MeloTTS 文字轉語音共花費: xx.xx ms"(字串)、 語音檔案名稱(字串) def tts(content, use_ov, speed): start = time.perf_counter() model.tts_to_file(content, speaker_ids[speaker], output_path, speed=speed/100, use_ov=use_ov) if speech_enhance: print("Use speech enhance") process_audio(output_path,output_path) end = time.perf_counter() dur_time = (end - start) * 1000 audio = "ov_en_int8_ZH.wav" result = f"MeloTTS 文字轉語音共花費: {dur_time:.2f} ms" return result, audio def load_example(): video = "data_video_sun_5s.mp4" audio = "ov_en_int8_ZH.wav" return video, audio # 設定客製化 Gradio 人機介面 with gr.Blocks() as demo: with gr.Row(): with gr.Column(): # MeloTTS 相關介面 txb_content = gr.Textbox(label="文字", value = "請輸入文字內容") ckb_use_ov = gr.Checkbox(value=True, label="Use_OpenCV") sld_speed = gr.Slider(50, 200, value=100, label="語速(%)") txb_cvt_time = gr.Textbox(label="轉換時間") file_audio = gr.Audio(label="輸出結果", type="filepath") # 設定「生成語音」鍵對應動作 btn_tts = gr.Button("生成語音") btn_tts.click(tts, inputs=[txb_content, ckb_use_ov, sld_speed], outputs=[txb_cvt_time, file_audio]) with gr.Column(): # Wav2Lip 相關介面 face_video = gr.Video(label="人臉影片") text_audio = gr.Audio(label="聲音檔案", type="filepath") # 設定「載入樣本」鍵對應動作 btn_tts = gr.Button("載入樣本") btn_tts.click(load_example, outputs=[face_video, text_audio]) with gr.Column(): output_video = gr.Video(label="結果影片") # 設定「生成影片」鍵對應動作 btn_wav2lip = gr.Button("生成影片") btn_wav2lip.click(ov_inference, inputs=[face_video, text_audio], outputs=output_video) demo.launch()

20241212_Digital_Human_Fig04
Fig. 4 執行 digital_human.ipynb 完整虛擬主播結果。(OmniXRI整理製作, 2024/12/12)

小結

目前測試結果, MeloTTS 語音生成部份中文只有女聲,還略帶大陸口音,未來可搭配進階訓練個人語音功能,來讓發音更接近所需年齡、性別、語調等。 Wav2Lip 自動生成對嘴的影片效果略遜於官方公布的影片品質,包括影像清晰度、嘴形位置及形狀精度,其主要原因是要加快生成速度,相關參數未加調整造成。經此範例程式實驗後,已得到初步「虛擬主播」的效果,未來再加上語音轉文字(STT)及大語言模型(LLM)來生成自然對話,相信很快就能創作出屬於個人的虛擬助理了。

參考文獻

[1] 華碩(ASUS), NUC 14 Pro
https://www.asus.com/displays-desktops/nucs/nuc-mini-pcs/asus-nuc-14-pro/

[2] Intel, 如何安裝或更新 Intel NPU 驅動程式
https://www.intel.com.tw/content/www/tw/zh/support/articles/000099083/processors/intel-core-ultra-processors.html

[3] Intel, Github OpenVINO Notebooks Windows Installtion Guide
https://github.com/openvinotoolkit/openvino_notebooks/wiki/Windows

[4] 許哲豪,【vMaker Edge AI專欄 #16】AIPC開箱實測 ─ Yolov8斜物件偵測
https://omnixri.blogspot.com/2024/04/vmaker-edge-ai-16aipc-yolov8.html

[5] Intel, Github OpenVINO Notebooks - wav2lip
https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/wav2lip

[6] Zhaohb, Github - MeloTTS-OV (speech-enhancement-and-npu)
https://github.com/zhaohb/MeloTTS-OV/tree/speech-enhancement-and-npu

延伸閱讀

[A] Tong Qiu, Optimizing MeloTTS for AIPC Deployment with OpenVINO: A Lightweight Text-to-Speech Solution
https://blog.openvino.ai/blog-posts/optimizing-melotts-for-aipc-deployment-with-openvino-a-lightweight-tts-solution

[B] Xiake Sun, Enable 2D Lip Sync Wav2Lip Pipeline with OpenVINO Runtime
https://blog.openvino.ai/blog-posts/enable-2d-lip-sync-wav2lip-pipeline-with-openvino-runtime

[C] MakerPRO, Digital Human如何走入你我的數位世界?
https://makerpro.cc/2024/11/how-can-digital-humans-enter-our-digital-lives/

[D] 陳紀翰, 【開箱評測】探索未來:結合迷你PC與生成式AI的個人多媒體助理
https://makerpro.cc/2024/09/test-for-mini-pc-nuc-box-155h

[E] 林士允(Felix Lin), 【開箱實測】OpenVINO榨出單板極限,實作離線LLM AI助理!
https://makerpro.cc/2024/07/unboxing-openvino-llm-ai/

[F] 許哲豪,【AI_Column】影像式AI虛擬助理真的要來了嗎?
https://omnixri.blogspot.com/2018/09/aicolumnai.html

[G] 許哲豪,AI智能虛擬助理介紹Gatebox/HoloBox/MxR Tube
https://omnixri.blogspot.com/2018/03/aigateboxholoboxmxr-tube.html

[H] 許哲豪,虛擬助理再進化真人尺寸虛擬警衛大變身
https://omnixri.blogspot.com/2019/05/blog-post.html

沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...