From 02b751d10efa098a405e353cc5f8dc060bf7a161 Mon Sep 17 00:00:00 2001 From: ikaros <327209194@qq.com> Date: Wed, 6 Mar 2024 23:29:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E8=BA=AB=E4=BD=93=20=E6=95=B0=E5=AD=97=E4=BA=BA=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=92=AD=E6=94=BE=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- config.json | 6 +++++- config.json.bak | 6 +++++- utils/audio.py | 33 +++++++++++++++++++++++++++++++++ webui.py | 23 +++++++++++++++++++---- 5 files changed, 63 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index deccb36d..274157e3 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ `Luna AI` 是一款结合了最先进技术的虚拟AI主播。它的核心是一系列高效的人工智能模型,包括 `ChatterBot、GPT、Claude、langchain、chatglm、text-generation-webui、讯飞星火、智谱AI、谷歌Bard、文心一言、通义星尘、通义千问、千帆大模型、Gemini、Kimi Chat、QAnything、koboldcpp`。这些模型既可以在本地运行,也可以通过云端服务提供支持。 -`Luna AI` 的外观由 `Live2D、Vtube Studio、xuniren、UE5 结合 Audio2Face、EasyAIVtuber` 技术打造,为用户提供了一个生动、互动的虚拟形象。这使得 `Luna AI` 能够在各大直播平台,如 `Bilibili、抖音、快手、微信视频号、斗鱼、YouTube、Twitch 和 TikTok`,进行实时互动直播。当然,它也可以在本地环境中与您进行个性化对话。 +`Luna AI` 的外观由 `Live2D、Vtube Studio、xuniren、UE5 结合 Audio2Face、EasyAIVtuber、数字人视频播放器(Easy-Wav2Lip)` 技术打造,为用户提供了一个生动、互动的虚拟形象。这使得 `Luna AI` 能够在各大直播平台,如 `Bilibili、抖音、快手、微信视频号、斗鱼、YouTube、Twitch 和 TikTok`,进行实时互动直播。当然,它也可以在本地环境中与您进行个性化对话。 为了使交流更加自然,`Luna AI` 使用了先进的自然语言处理技术,结合文本转语音系统,如 `Edge-TTS、VITS-Fast、elevenlabs、bark-gui、VALL-E-X、睿声AI、genshinvoice.top、tts.ai-lab.top、OpenVoice、GPT_SoVITS、clone-voice、Azure TTS`。这不仅让它能够生成流畅的回答,还可以通过 `so-vits-svc 和 DDSP-SVC` 实现声音的变化,以适应不同的场景和角色。 diff --git a/config.json b/config.json index 2a0fd065..5c6aa6d3 100644 --- a/config.json +++ b/config.json @@ -28,6 +28,9 @@ "EasyAIVtuber": { "api_ip_port": "http://127.0.0.1:7888" }, + "digital_human_video_player": { + "api_ip_port": "http://127.0.0.1:8091" + }, "play_audio": { "enable": true, "text_split_enable": true, @@ -1331,7 +1334,8 @@ "live2d": true, "xuniren": true, "unity": true, - "EasyAIVtuber": true + "EasyAIVtuber": true, + "digital_human_video_player": true } } } diff --git a/config.json.bak b/config.json.bak index 2a0fd065..5c6aa6d3 100644 --- a/config.json.bak +++ b/config.json.bak @@ -28,6 +28,9 @@ "EasyAIVtuber": { "api_ip_port": "http://127.0.0.1:7888" }, + "digital_human_video_player": { + "api_ip_port": "http://127.0.0.1:8091" + }, "play_audio": { "enable": true, "text_split_enable": true, @@ -1331,7 +1334,8 @@ "live2d": true, "xuniren": true, "unity": true, - "EasyAIVtuber": true + "EasyAIVtuber": true, + "digital_human_video_player": true } } } diff --git a/utils/audio.py b/utils/audio.py index cf0c6308..5355220f 100644 --- a/utils/audio.py +++ b/utils/audio.py @@ -340,6 +340,37 @@ async def EasyAIVtuber_api(self, audio_path=""): return False + + # 调用digital_human_video_player的api + async def digital_human_video_player_api(self, audio_path=""): + try: + from urllib.parse import urljoin + + url = urljoin(self.config.get('digital_human_video_player', 'api_ip_port'), "/show") + + data = { + "audio_path": os.path.abspath(audio_path), + "insert_index": -1 + } + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=data) as response: + # 检查响应状态 + if response.status == 200: + # 使用await等待异步获取JSON响应 + json_response = await response.json() + logging.info(f"digital_human_video_player发送成功,返回:{json_response['message']}") + + return True + else: + logging.error(f"digital_human_video_player发送失败,状态码:{response.status}") + return False + + except Exception as e: + logging.error(traceback.format_exc()) + return False + + # 音频合成(edge-tts / vits_fast)并播放 def audio_synthesis(self, message): try: @@ -964,6 +995,8 @@ async def only_play_audio(self): await self.xuniren_api(voice_tmp_path) elif self.config.get("visual_body") == "EasyAIVtuber": await self.EasyAIVtuber_api(voice_tmp_path) + elif self.config.get("visual_body") == "digital_human_video_player": + await self.digital_human_video_player_api(voice_tmp_path) else: if self.config.get("play_audio", "player") in ["audio_player", "audio_player_v2"]: if "insert_index" in data_json: diff --git a/webui.py b/webui.py index ed8adb34..fc178100 100644 --- a/webui.py +++ b/webui.py @@ -1419,7 +1419,10 @@ def common_textarea_handle(content): if config.get("webui", "show_card", "visual_body", "EasyAIVtuber"): config_data["EasyAIVtuber"]["api_ip_port"] = input_EasyAIVtuber_api_ip_port.value - + + if config.get("webui", "show_card", "visual_body", "digital_human_video_player"): + config_data["digital_human_video_player"]["api_ip_port"] = input_digital_human_video_player_api_ip_port.value + """ 文案 """ @@ -1662,6 +1665,7 @@ def common_textarea_handle(content): config_data["webui"]["show_card"]["visual_body"]["xuniren"] = switch_webui_show_card_visual_body_xuniren.value config_data["webui"]["show_card"]["visual_body"]["unity"] = switch_webui_show_card_visual_body_unity.value config_data["webui"]["show_card"]["visual_body"]["EasyAIVtuber"] = switch_webui_show_card_visual_body_EasyAIVtuber.value + config_data["webui"]["show_card"]["visual_body"]["digital_human_video_player"] = switch_webui_show_card_visual_body_digital_human_video_player.value config_data["webui"]["theme"]["choose"] = select_webui_theme_choose.value @@ -1814,7 +1818,11 @@ def common_textarea_handle(content): value=config.get("chat_type") ).style("width:200px;") - select_visual_body = ui.select(label='虚拟身体', options={'xuniren': 'xuniren', 'unity': 'unity', 'EasyAIVtuber': 'EasyAIVtuber', '其他': '其他'}, value=config.get("visual_body")).style("width:200px;") + select_visual_body = ui.select( + label='虚拟身体', + options={'xuniren': 'xuniren', 'unity': 'unity', 'EasyAIVtuber': 'EasyAIVtuber', 'digital_human_video_player': '数字人视频播放器', '其他': '其他'}, + value=config.get("visual_body") + ).style("width:200px;") select_audio_synthesis_type = ui.select( label='语音合成', @@ -3258,7 +3266,13 @@ def clear_tts_common_audio_card(file_path): ui.label("EasyAIVtuber") with ui.row(): input_EasyAIVtuber_api_ip_port = ui.input(label='API地址', value=config.get("EasyAIVtuber", "api_ip_port"), placeholder='对接EasyAIVtuber应用监听的ip和端口') - + + if config.get("webui", "show_card", "visual_body", "digital_human_video_player"): + with ui.card().style(card_css): + ui.label("digital_human_video_player") + with ui.row(): + input_digital_human_video_player_api_ip_port = ui.input(label='API地址', value=config.get("digital_human_video_player", "api_ip_port"), placeholder='对接 数字人视频播放器 监听的ip和端口') + with ui.tab_panel(copywriting_page).style(tab_panel_css): with ui.row(): @@ -3787,7 +3801,8 @@ def update_echart_gift(): switch_webui_show_card_visual_body_xuniren = ui.switch('xuniren', value=config.get("webui", "show_card", "visual_body", "xuniren")).style(switch_internal_css) switch_webui_show_card_visual_body_unity = ui.switch('unity', value=config.get("webui", "show_card", "visual_body", "unity")).style(switch_internal_css) switch_webui_show_card_visual_body_EasyAIVtuber = ui.switch('EasyAIVtuber', value=config.get("webui", "show_card", "visual_body", "EasyAIVtuber")).style(switch_internal_css) - + switch_webui_show_card_visual_body_digital_human_video_player = ui.switch('digital_human_video_player', value=config.get("webui", "show_card", "visual_body", "digital_human_video_player")).style(switch_internal_css) + with ui.card().style(card_css):