feat: Add PDM support with auth & i18n enhancements (#627)

* feat: Add PDM support with auth & i18n enhancements

1. Added PDM project dependency management
   - Created pyproject.toml for dependency definitions
   - Added PDM lock file for reproducible builds
   - Created .pdm-python for virtual environment management

2. Enhanced authentication & configuration
   - Added user validation in base configuration
   - Implemented streamlit-authenticator for login functionality
   - Updated config.example.toml with user authentication fields

3. Improved internationalization (i18n)
   - Updated translation files for multiple languages (en, de, pt, vi, zh)
   - Enhanced i18n support in the web UI
   - Standardized translation structure across language files
This commit is contained in:
yyhhyyyyyy
2025-04-27 13:35:45 +08:00
committed by GitHub
parent 36dffe8de3
commit 47e4cff758
13 changed files with 2645 additions and 345 deletions

1
.pdm-python Normal file
View File

@@ -0,0 +1 @@
./MoneyPrinterTurbo/.venv/bin/python

View File

@@ -35,9 +35,18 @@ like to express our special thanks to
**RecCloud (AI-Powered Multimedia Service Platform)** for providing a free `AI Video Generator` service based on this **RecCloud (AI-Powered Multimedia Service Platform)** for providing a free `AI Video Generator` service based on this
project. It allows for online use without deployment, which is very convenient. project. It allows for online use without deployment, which is very convenient.
https://reccloud.com - Chinese version: https://reccloud.cn
- English version: https://reccloud.com
![](docs/reccloud.com.jpg) ![](docs/reccloud.cn.jpg)
## Thanks for Sponsorship 🙏
Thanks to Picwish https://picwish.cn for supporting and sponsoring this project, enabling continuous updates and maintenance.
Picwish focuses on the **image processing field**, providing a rich set of **image processing tools** that extremely simplify complex operations, truly making image processing easier.
![picwish.jpg](docs/picwish.jpg)
## Features 🎯 ## Features 🎯
@@ -51,28 +60,26 @@ https://reccloud.com
satisfactory one satisfactory one
- [x] Supports setting the **duration of video clips**, facilitating adjustments to material switching frequency - [x] Supports setting the **duration of video clips**, facilitating adjustments to material switching frequency
- [x] Supports video copy in both **Chinese** and **English** - [x] Supports video copy in both **Chinese** and **English**
- [x] Supports **multiple voice** synthesis - [x] Supports **multiple voice** synthesis, with **real-time preview** of effects
- [x] Supports **subtitle generation**, with adjustable `font`, `position`, `color`, `size`, and also - [x] Supports **subtitle generation**, with adjustable `font`, `position`, `color`, `size`, and also
supports `subtitle outlining` supports `subtitle outlining`
- [x] Supports **background music**, either random or specified music files, with adjustable `background music volume` - [x] Supports **background music**, either random or specified music files, with adjustable `background music volume`
- [x] Video material sources are **high-definition** and **royalty-free** - [x] Video material sources are **high-definition** and **royalty-free**, and you can also use your own **local materials**
- [x] Supports integration with various models such as **OpenAI**, **moonshot**, **Azure**, **gpt4free**, **one-api**, - [x] Supports integration with various models such as **OpenAI**, **Moonshot**, **Azure**, **gpt4free**, **one-api**,
**qianwen**, **Google Gemini**, **Ollama** and more **Qwen**, **Google Gemini**, **Ollama**, **DeepSeek**, **ERNIE** and more
- For users in China, it is recommended to use **DeepSeek** or **Moonshot** as the large model provider (directly accessible in China, no VPN needed. Free credits upon registration, generally sufficient for use)
❓[How to Use the Free OpenAI GPT-3.5 Model?](https://github.com/harry0703/MoneyPrinterTurbo/blob/main/README-en.md#common-questions-) ❓[How to Use the Free OpenAI GPT-3.5 Model?](https://github.com/harry0703/MoneyPrinterTurbo/blob/main/README-en.md#common-questions-)
### Future Plans 📅 ### Future Plans 📅
- [ ] Introduce support for GPT-SoVITS dubbing - [ ] GPT-SoVITS dubbing support
- [ ] Enhance voice synthesis with large models for a more natural and emotionally resonant voice output - [ ] Optimize voice synthesis using large models for more natural and emotionally rich voice output
- [ ] Incorporate video transition effects to ensure a smoother viewing experience - [ ] Add video transition effects for a smoother viewing experience
- [ ] Improve the relevance of video content - [ ] Add more video material sources, improve the matching between video materials and script
- [ ] Add options for video length: short, medium, long - [ ] Add video length options: short, medium, long
- [ ] Package the application into a one-click launch bundle for Windows and macOS for ease of use - [ ] Support more voice synthesis providers, such as OpenAI TTS
- [ ] Enable the use of custom materials - [ ] Automate upload to YouTube platform
- [ ] Offer voiceover and background music options with real-time preview
- [ ] Support a wider range of voice synthesis providers, such as OpenAI TTS, Azure TTS
- [ ] Automate the upload process to the YouTube platform
## Video Demos 📺 ## Video Demos 📺
@@ -115,10 +122,27 @@ https://reccloud.com
- Recommended minimum 4 CPU cores or more, 8G of memory or more, GPU is not required - Recommended minimum 4 CPU cores or more, 8G of memory or more, GPU is not required
- Windows 10 or MacOS 11.0, and their later versions - Windows 10 or MacOS 11.0, and their later versions
## Quick Start 🚀
Download the one-click startup package, extract and use directly (the path should not contain **Chinese characters**, **special characters**, or **spaces**)
### Windows
- Baidu Netdisk (1.2.1 latest version): https://pan.baidu.com/s/1pSNjxTYiVENulTLm6zieMQ?pwd=g36q Extraction code: g36q
After downloading, it is recommended to **double-click** `update.bat` first to update to the **latest code**, then double-click `start.bat` to launch
After launching, the browser will open automatically (if it opens blank, it is recommended to use **Chrome** or **Edge**)
### Other Systems
One-click startup packages have not been created yet. See the **Installation & Deployment** section below. It is recommended to use **docker** for deployment, which is more convenient.
## Installation & Deployment 📥 ## Installation & Deployment 📥
### Prerequisites
- Try to avoid using **Chinese paths** to prevent unpredictable issues - Try to avoid using **Chinese paths** to prevent unpredictable issues
- Ensure your **network** is stable, meaning you can access foreign websites normally - Ensure your **network** is stable, VPN needs to be in `global traffic` mode
#### ① Clone the Project #### ① Clone the Project
@@ -132,11 +156,6 @@ git clone https://github.com/harry0703/MoneyPrinterTurbo.git
- Follow the instructions in the `config.toml` file to configure `pexels_api_keys` and `llm_provider`, and according to - Follow the instructions in the `config.toml` file to configure `pexels_api_keys` and `llm_provider`, and according to
the llm_provider's service provider, set up the corresponding API Key the llm_provider's service provider, set up the corresponding API Key
#### ③ Configure Large Language Models (LLM)
- To use `GPT-4.0` or `GPT-3.5`, you need an `API Key` from `OpenAI`. If you don't have one, you can set `llm_provider`
to `g4f` (a free-to-use GPT library https://github.com/xtekky/gpt4free)
### Docker Deployment 🐳 ### Docker Deployment 🐳
#### ① Launch the Docker Container #### ① Launch the Docker Container
@@ -164,27 +183,28 @@ Open your browser and visit http://0.0.0.0:8080/docs Or http://0.0.0.0:8080/redo
### Manual Deployment 📦 ### Manual Deployment 📦
#### ① Create a Python Virtual Environment > Video tutorials
>
> - Complete usage demonstration: https://v.douyin.com/iFhnwsKY/
> - How to deploy on Windows: https://v.douyin.com/iFyjoW3M
It is recommended to create a Python virtual environment #### ① Install Dependencies
using [conda](https://conda.io/projects/conda/en/latest/user-guide/install/index.html)
It is recommended to use [pdm](https://pdm-project.org/en/latest/#installation)
```shell ```shell
git clone https://github.com/harry0703/MoneyPrinterTurbo.git git clone https://github.com/harry0703/MoneyPrinterTurbo.git
cd MoneyPrinterTurbo cd MoneyPrinterTurbo
conda create -n MoneyPrinterTurbo python=3.11 pdm sync
conda activate MoneyPrinterTurbo
pip install -r requirements.txt
``` ```
#### ② Install ImageMagick #### ② Install ImageMagick
###### Windows: ###### Windows:
- Download https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-29-Q16-x64-static.exe - Download https://imagemagick.org/script/download.php Choose the Windows version, make sure to select the **static library** version, such as ImageMagick-7.1.1-32-Q16-x64-**static**.exe
- Install the downloaded ImageMagick, **do not change the installation path** - Install the downloaded ImageMagick, **do not change the installation path**
- Modify the `config.toml` configuration file, set `imagemagick_path` to your actual installation path (if you didn't - Modify the `config.toml` configuration file, set `imagemagick_path` to your actual installation path
change the path during installation, just uncomment it)
###### MacOS: ###### MacOS:
@@ -211,14 +231,12 @@ Note that you need to execute the following commands in the `root directory` of
###### Windows ###### Windows
```bat ```bat
conda activate MoneyPrinterTurbo
webui.bat webui.bat
``` ```
###### MacOS or Linux ###### MacOS or Linux
```shell ```shell
conda activate MoneyPrinterTurbo
sh webui.sh sh webui.sh
``` ```
@@ -237,13 +255,15 @@ online for a quick experience.
A list of all supported voices can be viewed here: [Voice List](./docs/voice-list.txt) A list of all supported voices can be viewed here: [Voice List](./docs/voice-list.txt)
2024-04-16 v1.1.2 Added 9 new Azure voice synthesis voices that require API KEY configuration. These voices sound more realistic.
## Subtitle Generation 📜 ## Subtitle Generation 📜
Currently, there are 2 ways to generate subtitles: Currently, there are 2 ways to generate subtitles:
- edge: Faster generation speed, better performance, no specific requirements for computer configuration, but the - **edge**: Faster generation speed, better performance, no specific requirements for computer configuration, but the
quality may be unstable quality may be unstable
- whisper: Slower generation speed, poorer performance, specific requirements for computer configuration, but more - **whisper**: Slower generation speed, poorer performance, specific requirements for computer configuration, but more
reliable quality reliable quality
You can switch between them by modifying the `subtitle_provider` in the `config.toml` configuration file You can switch between them by modifying the `subtitle_provider` in the `config.toml` configuration file
@@ -252,15 +272,19 @@ It is recommended to use `edge` mode, and switch to `whisper` mode if the qualit
satisfactory. satisfactory.
> Note: > Note:
> If left blank, it means no subtitles will be generated. >
> 1. In whisper mode, you need to download a model file from HuggingFace, about 3GB in size, please ensure good internet connectivity
> 2. If left blank, it means no subtitles will be generated.
**Download whisper** > Since HuggingFace is not accessible in China, you can use the following methods to download the `whisper-large-v3` model file
- Please ensure a good internet connectivity
- `whisper` model can be downloaded from HuggingFace: https://huggingface.co/openai/whisper-large-v3/tree/main
After downloading the model to local machine, copy the whole folder and put it into the following path: `.\MoneyPrinterTurbo\models` Download links:
This is what the final path should look like: `.\MoneyPrinterTurbo\models\whisper-large-v3` - Baidu Netdisk: https://pan.baidu.com/s/11h3Q6tsDtjQKTjUu3sc5cA?pwd=xjs9
- Quark Netdisk: https://pan.quark.cn/s/3ee3d991d64b
After downloading the model, extract it and place the entire directory in `.\MoneyPrinterTurbo\models`,
The final file path should look like this: `.\MoneyPrinterTurbo\models\whisper-large-v3`
``` ```
MoneyPrinterTurbo MoneyPrinterTurbo
@@ -304,6 +328,16 @@ Once successfully started, modify the `config.toml` configuration as follows:
- Change `openai_base_url` to `http://localhost:3040/v1/` - Change `openai_base_url` to `http://localhost:3040/v1/`
- Set `openai_model_name` to `gpt-3.5-turbo` - Set `openai_model_name` to `gpt-3.5-turbo`
> Note: This method may be unstable
### ❓AttributeError: 'str' object has no attribute 'choices'
This issue is caused by the large language model not returning a correct response.
It's likely a network issue. Use a **VPN**, or set `openai_base_url` to your proxy, which should solve the problem.
At the same time, it is recommended to use **Moonshot** or **DeepSeek** as the large model provider, as these service providers have faster access and are more stable in China.
### ❓RuntimeError: No ffmpeg exe could be found ### ❓RuntimeError: No ffmpeg exe could be found
Normally, ffmpeg will be automatically downloaded and detected. Normally, ffmpeg will be automatically downloaded and detected.
@@ -355,6 +389,43 @@ For Linux systems, you can manually install it, refer to https://cn.linux-consol
Thanks to [@wangwenqiao666](https://github.com/wangwenqiao666) for their research and exploration Thanks to [@wangwenqiao666](https://github.com/wangwenqiao666) for their research and exploration
### ❓ImageMagick's security policy prevents operations related to temporary file @/tmp/tmpur5hyyto.txt
You can find these policies in ImageMagick's configuration file policy.xml.
This file is usually located in /etc/ImageMagick-`X`/ or a similar location in the ImageMagick installation directory.
Modify the entry containing `pattern="@"`, change `rights="none"` to `rights="read|write"` to allow read and write operations on files.
### ❓OSError: [Errno 24] Too many open files
This issue is caused by the system's limit on the number of open files. You can solve it by modifying the system's file open limit.
Check the current limit:
```shell
ulimit -n
```
If it's too low, you can increase it, for example:
```shell
ulimit -n 10240
```
### ❓Whisper model download failed, with the following error
LocalEntryNotfoundEror: Cannot find an appropriate cached snapshotfolderfor the specified revision on the local disk and
outgoing trafic has been disabled.
To enablerepo look-ups and downloads online, pass 'local files only=False' as input.
or
An error occured while synchronizing the model Systran/faster-whisper-large-v3 from the Hugging Face Hub:
An error happened while trying to locate the files on the Hub and we cannot find the appropriate snapshot folder for the
specified revision on the local disk. Please check your internet connection and try again.
Trying to load the model directly from the local cache, if it exists.
Solution: [Click to see how to manually download the model from netdisk](#subtitle-generation-)
## Feedback & Suggestions 📢 ## Feedback & Suggestions 📢
- You can submit an [issue](https://github.com/harry0703/MoneyPrinterTurbo/issues) or - You can submit an [issue](https://github.com/harry0703/MoneyPrinterTurbo/issues) or

View File

@@ -182,16 +182,14 @@ docker-compose up
- 完整的使用演示https://v.douyin.com/iFhnwsKY/ - 完整的使用演示https://v.douyin.com/iFhnwsKY/
- 如何在Windows上部署https://v.douyin.com/iFyjoW3M - 如何在Windows上部署https://v.douyin.com/iFyjoW3M
#### ① 创建虚拟环境 #### ① 依赖安装
建议使用 [conda](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) 创建 python 虚拟环境 建议使用 [pdm](https://pdm-project.org/en/latest/#installation)
```shell ```shell
git clone https://github.com/harry0703/MoneyPrinterTurbo.git git clone https://github.com/harry0703/MoneyPrinterTurbo.git
cd MoneyPrinterTurbo cd MoneyPrinterTurbo
conda create -n MoneyPrinterTurbo python=3.11 pdm sync
conda activate MoneyPrinterTurbo
pip install -r requirements.txt
``` ```
#### ② 安装好 ImageMagick #### ② 安装好 ImageMagick
@@ -222,14 +220,12 @@ pip install -r requirements.txt
###### Windows ###### Windows
```bat ```bat
conda activate MoneyPrinterTurbo
webui.bat webui.bat
``` ```
###### MacOS or Linux ###### MacOS or Linux
```shell ```shell
conda activate MoneyPrinterTurbo
sh webui.sh sh webui.sh
``` ```

View File

@@ -57,7 +57,7 @@ project_description = _cfg.get(
"project_description", "project_description",
"<a href='https://github.com/harry0703/MoneyPrinterTurbo'>https://github.com/harry0703/MoneyPrinterTurbo</a>", "<a href='https://github.com/harry0703/MoneyPrinterTurbo'>https://github.com/harry0703/MoneyPrinterTurbo</a>",
) )
project_version = _cfg.get("project_version", "1.2.2") project_version = _cfg.get("project_version", "1.2.3")
reload_debug = False reload_debug = False
imagemagick_path = app.get("imagemagick_path", "") imagemagick_path = app.get("imagemagick_path", "")

View File

@@ -1,6 +1,15 @@
[app] [app]
video_source = "pexels" # "pexels" or "pixabay" video_source = "pexels" # "pexels" or "pixabay"
# 是否隐藏配置面板
# hide_config = false
[user]
# 管理员用户名和密码,用于访问基础设置
username = "admin"
password = "admin"
email = "admin@example.com" # 添加email字段用于身份验证
# Pexels API Key # Pexels API Key
# Register at https://www.pexels.com/api/ to get your API key. # Register at https://www.pexels.com/api/ to get your API key.
# You can use multiple keys to avoid rate limits. # You can use multiple keys to avoid rate limits.

2008
pdm.lock generated Normal file

File diff suppressed because it is too large Load Diff

32
pyproject.toml Normal file
View File

@@ -0,0 +1,32 @@
[project]
name = "MoneyPrinterTurbo"
version = "1.2.3"
description = "Default template for PDM package"
authors = [
{name = "yyhhyyyyyy", email = "yyhhyyyyyy8@gmail.com"},
]
dependencies = [
"moviepy==2.1.1",
"streamlit==1.40.2",
"edge-tts==6.1.19",
"fastapi==0.115.6",
"uvicorn==0.32.1",
"openai==1.56.1",
"faster-whisper==1.1.0",
"loguru==0.7.2",
"google-generativeai==0.8.3",
"dashscope==1.20.14",
"g4f==0.3.8.1",
"azure-cognitiveservices-speech==1.41.1",
"redis==5.2.0",
"python-multipart==0.0.19",
"streamlit-authenticator==0.4.1",
"pyyaml",
]
requires-python = "==3.11.*"
readme = "README.md"
license = {text = "MIT"}
[tool.pdm]
distribution = false

View File

@@ -4,6 +4,7 @@ import sys
from uuid import uuid4 from uuid import uuid4
import streamlit as st import streamlit as st
import streamlit_authenticator as stauth
from loguru import logger from loguru import logger
# Add the root directory of the project to the system path to allow importing modules from the project # Add the root directory of the project to the system path to allow importing modules from the project
@@ -15,7 +16,6 @@ if root_dir not in sys.path:
print("") print("")
from app.config import config from app.config import config
from app.models.const import FILE_TYPE_IMAGES, FILE_TYPE_VIDEOS
from app.models.schema import ( from app.models.schema import (
MaterialInfo, MaterialInfo,
VideoAspect, VideoAspect,
@@ -46,7 +46,41 @@ hide_streamlit_style = """
<style>#root > div:nth-child(1) > div > div > div > div > section > div {padding-top: 0rem;}</style> <style>#root > div:nth-child(1) > div > div > div > div > section > div {padding-top: 0rem;}</style>
""" """
st.markdown(hide_streamlit_style, unsafe_allow_html=True) st.markdown(hide_streamlit_style, unsafe_allow_html=True)
st.title(f"MoneyPrinterTurbo v{config.project_version}") # 定义资源目录
font_dir = os.path.join(root_dir, "resource", "fonts")
song_dir = os.path.join(root_dir, "resource", "songs")
i18n_dir = os.path.join(root_dir, "webui", "i18n")
config_file = os.path.join(root_dir, "webui", ".streamlit", "webui.toml")
system_locale = utils.get_system_locale()
# 加载语言文件
locales = utils.load_locales(i18n_dir)
# 创建一个顶部栏,包含标题和语言选择
title_col, lang_col = st.columns([3, 1])
with title_col:
st.title(f"MoneyPrinterTurbo v{config.project_version}")
with lang_col:
display_languages = []
selected_index = 0
for i, code in enumerate(locales.keys()):
display_languages.append(f"{code} - {locales[code].get('Language')}")
if code == st.session_state.get("ui_language", ""):
selected_index = i
selected_language = st.selectbox(
"Language / 语言",
options=display_languages,
index=selected_index,
key="top_language_selector",
label_visibility="collapsed",
)
if selected_language:
code = selected_language.split(" - ")[0].strip()
st.session_state["ui_language"] = code
config.ui["language"] = code
support_locales = [ support_locales = [
"zh-CN", "zh-CN",
@@ -59,11 +93,6 @@ support_locales = [
"th-TH", "th-TH",
] ]
font_dir = os.path.join(root_dir, "resource", "fonts")
song_dir = os.path.join(root_dir, "resource", "songs")
i18n_dir = os.path.join(root_dir, "webui", "i18n")
config_file = os.path.join(root_dir, "webui", ".streamlit", "webui.toml")
system_locale = utils.get_system_locale()
# print(f"******** system locale: {system_locale} ********") # print(f"******** system locale: {system_locale} ********")
if "video_subject" not in st.session_state: if "video_subject" not in st.session_state:
@@ -167,269 +196,361 @@ def tr(key):
return loc.get("Translation", {}).get(key, key) return loc.get("Translation", {}).get(key, key)
# 加载用户认证配置
# 确保用户配置存在并包含所有必需的字段
if "user" not in config._cfg:
config._cfg["user"] = {
"username": "admin",
"password": "admin",
"email": "admin@example.com",
}
config.save_config()
elif "email" not in config._cfg["user"]:
# 如果用户配置存在但没有email字段添加默认email
config._cfg["user"]["email"] = f"{config._cfg['user']['username']}@example.com"
config.save_config()
# 创建认证对象
authenticator = None
auth_status = False
# 检查是否需要身份验证才能访问配置
if not config.app.get("hide_config", False):
# 创建认证配置
credentials = {
"usernames": {
config._cfg["user"]["username"]: {
"name": config._cfg["user"]["username"],
"password": config._cfg["user"]["password"],
"email": config._cfg["user"]["email"],
}
}
}
cookie_name = "mpt_auth_cookie"
cookie_key = "mpt_auth_key_123"
cookie_expiry_days = 30
authenticator = stauth.Authenticate(
credentials, cookie_name, cookie_key, cookie_expiry_days
)
# 从 session_state 获取认证状态
auth_status = st.session_state.get("authentication_status")
st.write(tr("Get Help")) st.write(tr("Get Help"))
llm_provider = config.app.get("llm_provider", "").lower() llm_provider = config.app.get("llm_provider", "").lower()
if not config.app.get("hide_config", False): if not config.app.get("hide_config", False):
# 创建基础设置折叠框
with st.expander(tr("Basic Settings"), expanded=False): with st.expander(tr("Basic Settings"), expanded=False):
config_panels = st.columns(3) # 检查用户是否已登录
left_config_panel = config_panels[0] if not auth_status:
middle_config_panel = config_panels[1] # 用户未登录,显示登录表单
right_config_panel = config_panels[2] st.warning(tr("Please login to access settings"))
with left_config_panel:
display_languages = []
selected_index = 0
for i, code in enumerate(locales.keys()):
display_languages.append(f"{code} - {locales[code].get('Language')}")
if code == st.session_state["ui_language"]:
selected_index = i
selected_language = st.selectbox( # 显示登录表单
tr("Language"), options=display_languages, index=selected_index try:
) # 自定义登录表单文本,使用我们的翻译系统
if selected_language: login_form_fields = {
code = selected_language.split(" - ")[0].strip() "Form name": tr("Login"),
st.session_state["ui_language"] = code "Username": tr("Username"),
config.ui["language"] = code "Password": tr("Password"),
"Login": tr("Login"),
}
# 是否禁用日志显示 authenticator.login(location="main", fields=login_form_fields)
hide_log = st.checkbox(
tr("Hide Log"), value=config.app.get("hide_log", False)
)
config.ui["hide_log"] = hide_log
with middle_config_panel: # 从 session_state 获取认证状态
# openai auth_status = st.session_state.get("authentication_status")
# moonshot (月之暗面)
# oneapi
# g4f
# azure
# qwen (通义千问)
# gemini
# ollama
llm_providers = [
"OpenAI",
"Moonshot",
"Azure",
"Qwen",
"DeepSeek",
"Gemini",
"Ollama",
"G4f",
"OneAPI",
"Cloudflare",
"ERNIE",
]
saved_llm_provider = config.app.get("llm_provider", "OpenAI").lower()
saved_llm_provider_index = 0
for i, provider in enumerate(llm_providers):
if provider.lower() == saved_llm_provider:
saved_llm_provider_index = i
break
llm_provider = st.selectbox( if auth_status is False:
tr("LLM Provider"), st.error(tr("Incorrect username or password"))
options=llm_providers, elif auth_status is None:
index=saved_llm_provider_index, st.info(tr("Please enter your username and password"))
)
llm_helper = st.container()
llm_provider = llm_provider.lower()
config.app["llm_provider"] = llm_provider
llm_api_key = config.app.get(f"{llm_provider}_api_key", "") # 如果用户登录成功,刷新页面以显示配置面板
llm_secret_key = config.app.get( if auth_status:
f"{llm_provider}_secret_key", "" st.rerun()
) # only for baidu ernie except Exception as e:
llm_base_url = config.app.get(f"{llm_provider}_base_url", "") st.error(f"{tr('Login Error')}: {e}")
llm_model_name = config.app.get(f"{llm_provider}_model_name", "")
llm_account_id = config.app.get(f"{llm_provider}_account_id", "")
tips = "" # 只有在用户已登录时才显示配置面板
if llm_provider == "ollama": if auth_status:
if not llm_model_name: config_panels = st.columns(3)
llm_model_name = "qwen:7b" left_config_panel = config_panels[0]
if not llm_base_url: middle_config_panel = config_panels[1]
llm_base_url = "http://localhost:11434/v1" right_config_panel = config_panels[2]
with llm_helper: # 左侧面板 - 日志设置
tips = """ with left_config_panel:
##### Ollama配置说明 # 是否禁用日志显示
- **API Key**: 随便填写,比如 123 hide_log = st.checkbox(
- **Base Url**: 一般为 http://localhost:11434/v1 tr("Hide Log"), value=config.app.get("hide_log", False)
- 如果 `MoneyPrinterTurbo` 和 `Ollama` **不在同一台机器上**,需要填写 `Ollama` 机器的IP地址 )
- 如果 `MoneyPrinterTurbo` 是 `Docker` 部署,建议填写 `http://host.docker.internal:11434/v1` config.ui["hide_log"] = hide_log
- **Model Name**: 使用 `ollama list` 查看,比如 `qwen:7b`
"""
if llm_provider == "openai": # 中间面板 - LLM 设置
if not llm_model_name: with middle_config_panel:
llm_model_name = "gpt-3.5-turbo" # openai
with llm_helper: # moonshot (月之暗面)
tips = """ # oneapi
##### OpenAI 配置说明 # g4f
> 需要VPN开启全局流量模式 # azure
- **API Key**: [点击到官网申请](https://platform.openai.com/api-keys) # qwen (通义千问)
- **Base Url**: 可以留空 # gemini
- **Model Name**: 填写**有权限**的模型,[点击查看模型列表](https://platform.openai.com/settings/organization/limits) # ollama
""" llm_providers = [
"OpenAI",
"Moonshot",
"Azure",
"Qwen",
"DeepSeek",
"Gemini",
"Ollama",
"G4f",
"OneAPI",
"Cloudflare",
"ERNIE",
]
saved_llm_provider = config.app.get("llm_provider", "OpenAI").lower()
saved_llm_provider_index = 0
for i, provider in enumerate(llm_providers):
if provider.lower() == saved_llm_provider:
saved_llm_provider_index = i
break
if llm_provider == "moonshot": llm_provider = st.selectbox(
if not llm_model_name: tr("LLM Provider"),
llm_model_name = "moonshot-v1-8k" options=llm_providers,
with llm_helper: index=saved_llm_provider_index,
tips = """ )
##### Moonshot 配置说明 llm_helper = st.container()
- **API Key**: [点击到官网申请](https://platform.moonshot.cn/console/api-keys) llm_provider = llm_provider.lower()
- **Base Url**: 固定为 https://api.moonshot.cn/v1 config.app["llm_provider"] = llm_provider
- **Model Name**: 比如 moonshot-v1-8k[点击查看模型列表](https://platform.moonshot.cn/docs/intro#%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8)
""" llm_api_key = config.app.get(f"{llm_provider}_api_key", "")
if llm_provider == "oneapi": llm_secret_key = config.app.get(
if not llm_model_name: f"{llm_provider}_secret_key", ""
llm_model_name = ( ) # only for baidu ernie
"claude-3-5-sonnet-20240620" # 默认模型,可以根据需要调整 llm_base_url = config.app.get(f"{llm_provider}_base_url", "")
llm_model_name = config.app.get(f"{llm_provider}_model_name", "")
llm_account_id = config.app.get(f"{llm_provider}_account_id", "")
tips = ""
if llm_provider == "ollama":
if not llm_model_name:
llm_model_name = "qwen:7b"
if not llm_base_url:
llm_base_url = "http://localhost:11434/v1"
with llm_helper:
tips = """
##### Ollama配置说明
- **API Key**: 随便填写,比如 123
- **Base Url**: 一般为 http://localhost:11434/v1
- 如果 `MoneyPrinterTurbo` 和 `Ollama` **不在同一台机器上**,需要填写 `Ollama` 机器的IP地址
- 如果 `MoneyPrinterTurbo` 是 `Docker` 部署,建议填写 `http://host.docker.internal:11434/v1`
- **Model Name**: 使用 `ollama list` 查看,比如 `qwen:7b`
"""
if llm_provider == "openai":
if not llm_model_name:
llm_model_name = "gpt-3.5-turbo"
with llm_helper:
tips = """
##### OpenAI 配置说明
> 需要VPN开启全局流量模式
- **API Key**: [点击到官网申请](https://platform.openai.com/api-keys)
- **Base Url**: 可以留空
- **Model Name**: 填写**有权限**的模型,[点击查看模型列表](https://platform.openai.com/settings/organization/limits)
"""
if llm_provider == "moonshot":
if not llm_model_name:
llm_model_name = "moonshot-v1-8k"
with llm_helper:
tips = """
##### Moonshot 配置说明
- **API Key**: [点击到官网申请](https://platform.moonshot.cn/console/api-keys)
- **Base Url**: 固定为 https://api.moonshot.cn/v1
- **Model Name**: 比如 moonshot-v1-8k[点击查看模型列表](https://platform.moonshot.cn/docs/intro#%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8)
"""
if llm_provider == "oneapi":
if not llm_model_name:
llm_model_name = (
"claude-3-5-sonnet-20240620" # 默认模型,可以根据需要调整
)
with llm_helper:
tips = """
##### OneAPI 配置说明
- **API Key**: 填写您的 OneAPI 密钥
- **Base Url**: 填写 OneAPI 的基础 URL
- **Model Name**: 填写您要使用的模型名称,例如 claude-3-5-sonnet-20240620
"""
if llm_provider == "qwen":
if not llm_model_name:
llm_model_name = "qwen-max"
with llm_helper:
tips = """
##### 通义千问Qwen 配置说明
- **API Key**: [点击到官网申请](https://dashscope.console.aliyun.com/apiKey)
- **Base Url**: 留空
- **Model Name**: 比如 qwen-max[点击查看模型列表](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction#3ef6d0bcf91wy)
"""
if llm_provider == "g4f":
if not llm_model_name:
llm_model_name = "gpt-3.5-turbo"
with llm_helper:
tips = """
##### gpt4free 配置说明
> [GitHub开源项目](https://github.com/xtekky/gpt4free)可以免费使用GPT模型但是**稳定性较差**
- **API Key**: 随便填写,比如 123
- **Base Url**: 留空
- **Model Name**: 比如 gpt-3.5-turbo[点击查看模型列表](https://github.com/xtekky/gpt4free/blob/main/g4f/models.py#L308)
"""
if llm_provider == "azure":
with llm_helper:
tips = """
##### Azure 配置说明
> [点击查看如何部署模型](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/how-to/create-resource)
- **API Key**: [点击到Azure后台创建](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI)
- **Base Url**: 留空
- **Model Name**: 填写你实际的部署名
"""
if llm_provider == "gemini":
if not llm_model_name:
llm_model_name = "gemini-1.0-pro"
with llm_helper:
tips = """
##### Gemini 配置说明
> 需要VPN开启全局流量模式
- **API Key**: [点击到官网申请](https://ai.google.dev/)
- **Base Url**: 留空
- **Model Name**: 比如 gemini-1.0-pro
"""
if llm_provider == "deepseek":
if not llm_model_name:
llm_model_name = "deepseek-chat"
if not llm_base_url:
llm_base_url = "https://api.deepseek.com"
with llm_helper:
tips = """
##### DeepSeek 配置说明
- **API Key**: [点击到官网申请](https://platform.deepseek.com/api_keys)
- **Base Url**: 固定为 https://api.deepseek.com
- **Model Name**: 固定为 deepseek-chat
"""
if llm_provider == "ernie":
with llm_helper:
tips = """
##### 百度文心一言 配置说明
- **API Key**: [点击到官网申请](https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application)
- **Secret Key**: [点击到官网申请](https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application)
- **Base Url**: 填写 **请求地址** [点击查看文档](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11#%E8%AF%B7%E6%B1%82%E8%AF%B4%E6%98%8E)
"""
if tips and config.ui["language"] == "zh":
st.warning(
"中国用户建议使用 **DeepSeek** 或 **Moonshot** 作为大模型提供商\n- 国内可直接访问不需要VPN \n- 注册就送额度,基本够用"
) )
with llm_helper: st.info(tips)
tips = """
##### OneAPI 配置说明
- **API Key**: 填写您的 OneAPI 密钥
- **Base Url**: 填写 OneAPI 的基础 URL
- **Model Name**: 填写您要使用的模型名称,例如 claude-3-5-sonnet-20240620
"""
if llm_provider == "qwen": st_llm_api_key = st.text_input(
if not llm_model_name: tr("API Key"), value=llm_api_key, type="password"
llm_model_name = "qwen-max"
with llm_helper:
tips = """
##### 通义千问Qwen 配置说明
- **API Key**: [点击到官网申请](https://dashscope.console.aliyun.com/apiKey)
- **Base Url**: 留空
- **Model Name**: 比如 qwen-max[点击查看模型列表](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction#3ef6d0bcf91wy)
"""
if llm_provider == "g4f":
if not llm_model_name:
llm_model_name = "gpt-3.5-turbo"
with llm_helper:
tips = """
##### gpt4free 配置说明
> [GitHub开源项目](https://github.com/xtekky/gpt4free)可以免费使用GPT模型但是**稳定性较差**
- **API Key**: 随便填写,比如 123
- **Base Url**: 留空
- **Model Name**: 比如 gpt-3.5-turbo[点击查看模型列表](https://github.com/xtekky/gpt4free/blob/main/g4f/models.py#L308)
"""
if llm_provider == "azure":
with llm_helper:
tips = """
##### Azure 配置说明
> [点击查看如何部署模型](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/how-to/create-resource)
- **API Key**: [点击到Azure后台创建](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI)
- **Base Url**: 留空
- **Model Name**: 填写你实际的部署名
"""
if llm_provider == "gemini":
if not llm_model_name:
llm_model_name = "gemini-1.0-pro"
with llm_helper:
tips = """
##### Gemini 配置说明
> 需要VPN开启全局流量模式
- **API Key**: [点击到官网申请](https://ai.google.dev/)
- **Base Url**: 留空
- **Model Name**: 比如 gemini-1.0-pro
"""
if llm_provider == "deepseek":
if not llm_model_name:
llm_model_name = "deepseek-chat"
if not llm_base_url:
llm_base_url = "https://api.deepseek.com"
with llm_helper:
tips = """
##### DeepSeek 配置说明
- **API Key**: [点击到官网申请](https://platform.deepseek.com/api_keys)
- **Base Url**: 固定为 https://api.deepseek.com
- **Model Name**: 固定为 deepseek-chat
"""
if llm_provider == "ernie":
with llm_helper:
tips = """
##### 百度文心一言 配置说明
- **API Key**: [点击到官网申请](https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application)
- **Secret Key**: [点击到官网申请](https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application)
- **Base Url**: 填写 **请求地址** [点击查看文档](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11#%E8%AF%B7%E6%B1%82%E8%AF%B4%E6%98%8E)
"""
if tips and config.ui["language"] == "zh":
st.warning(
"中国用户建议使用 **DeepSeek** 或 **Moonshot** 作为大模型提供商\n- 国内可直接访问不需要VPN \n- 注册就送额度,基本够用"
) )
st.info(tips) st_llm_base_url = st.text_input(tr("Base Url"), value=llm_base_url)
st_llm_model_name = ""
if llm_provider != "ernie":
st_llm_model_name = st.text_input(
tr("Model Name"),
value=llm_model_name,
key=f"{llm_provider}_model_name_input",
)
if st_llm_model_name:
config.app[f"{llm_provider}_model_name"] = st_llm_model_name
else:
st_llm_model_name = None
st_llm_api_key = st.text_input( if st_llm_api_key:
tr("API Key"), value=llm_api_key, type="password" config.app[f"{llm_provider}_api_key"] = st_llm_api_key
) if st_llm_base_url:
st_llm_base_url = st.text_input(tr("Base Url"), value=llm_base_url) config.app[f"{llm_provider}_base_url"] = st_llm_base_url
st_llm_model_name = ""
if llm_provider != "ernie":
st_llm_model_name = st.text_input(
tr("Model Name"),
value=llm_model_name,
key=f"{llm_provider}_model_name_input",
)
if st_llm_model_name: if st_llm_model_name:
config.app[f"{llm_provider}_model_name"] = st_llm_model_name config.app[f"{llm_provider}_model_name"] = st_llm_model_name
else: if llm_provider == "ernie":
st_llm_model_name = None st_llm_secret_key = st.text_input(
tr("Secret Key"), value=llm_secret_key, type="password"
)
config.app[f"{llm_provider}_secret_key"] = st_llm_secret_key
if st_llm_api_key: if llm_provider == "cloudflare":
config.app[f"{llm_provider}_api_key"] = st_llm_api_key st_llm_account_id = st.text_input(
if st_llm_base_url: tr("Account ID"), value=llm_account_id
config.app[f"{llm_provider}_base_url"] = st_llm_base_url )
if st_llm_model_name: if st_llm_account_id:
config.app[f"{llm_provider}_model_name"] = st_llm_model_name config.app[f"{llm_provider}_account_id"] = st_llm_account_id
if llm_provider == "ernie":
st_llm_secret_key = st.text_input( # 右侧面板 - API 密钥设置
tr("Secret Key"), value=llm_secret_key, type="password" with right_config_panel:
def get_keys_from_config(cfg_key):
api_keys = config.app.get(cfg_key, [])
if isinstance(api_keys, str):
api_keys = [api_keys]
api_key = ", ".join(api_keys)
return api_key
def save_keys_to_config(cfg_key, value):
value = value.replace(" ", "")
if value:
config.app[cfg_key] = value.split(",")
st.markdown("##### " + tr("Video API Keys"))
# Pexels API Key
pexels_api_key = get_keys_from_config("pexels_api_keys")
st.markdown(
f"**Pexels API Key** ([{tr('点击获取')}](https://www.pexels.com/api/documentation/))"
) )
config.app[f"{llm_provider}_secret_key"] = st_llm_secret_key st.markdown(
f"<span style='color:#FF4B4B'>{tr('推荐使用')}</span>",
if llm_provider == "cloudflare": unsafe_allow_html=True,
st_llm_account_id = st.text_input(
tr("Account ID"), value=llm_account_id
) )
if st_llm_account_id: pexels_api_key = st.text_input(
config.app[f"{llm_provider}_account_id"] = st_llm_account_id "Pexels API Key",
value=pexels_api_key,
type="password",
key="pexels_api_key_input",
label_visibility="collapsed",
)
save_keys_to_config("pexels_api_keys", pexels_api_key)
with right_config_panel: # Pixabay API Key
pixabay_api_key = get_keys_from_config("pixabay_api_keys")
st.markdown(
f"**Pixabay API Key** ([{tr('点击获取')}](https://pixabay.com/api/docs/))"
)
st.markdown(
f"<span style='color:#808080'>{tr('可以不用配置,如果 Pexels 无法使用再选择Pixabay')}</span>",
unsafe_allow_html=True,
)
pixabay_api_key = st.text_input(
"Pixabay API Key",
value=pixabay_api_key,
type="password",
key="pixabay_api_key_input",
label_visibility="collapsed",
)
save_keys_to_config("pixabay_api_keys", pixabay_api_key)
def get_keys_from_config(cfg_key):
api_keys = config.app.get(cfg_key, [])
if isinstance(api_keys, str):
api_keys = [api_keys]
api_key = ", ".join(api_keys)
return api_key
def save_keys_to_config(cfg_key, value):
value = value.replace(" ", "")
if value:
config.app[cfg_key] = value.split(",")
pexels_api_key = get_keys_from_config("pexels_api_keys")
pexels_api_key = st.text_input(
tr("Pexels API Key"), value=pexels_api_key, type="password"
)
save_keys_to_config("pexels_api_keys", pexels_api_key)
pixabay_api_key = get_keys_from_config("pixabay_api_keys")
pixabay_api_key = st.text_input(
tr("Pixabay API Key"), value=pixabay_api_key, type="password"
)
save_keys_to_config("pixabay_api_keys", pixabay_api_key)
panel = st.columns(3) panel = st.columns(3)
left_panel = panel[0] left_panel = panel[0]
@@ -443,7 +564,9 @@ with left_panel:
with st.container(border=True): with st.container(border=True):
st.write(tr("Video Script Settings")) st.write(tr("Video Script Settings"))
params.video_subject = st.text_input( params.video_subject = st.text_input(
tr("Video Subject"), value=st.session_state["video_subject"] tr("Video Subject"),
value=st.session_state["video_subject"],
key="video_subject_input",
).strip() ).strip()
video_languages = [ video_languages = [
@@ -529,7 +652,6 @@ with middle_panel:
config.app["video_source"] = params.video_source config.app["video_source"] = params.video_source
if params.video_source == "local": if params.video_source == "local":
_supported_types = FILE_TYPE_VIDEOS + FILE_TYPE_IMAGES
uploaded_files = st.file_uploader( uploaded_files = st.file_uploader(
"Upload Local Files", "Upload Local Files",
type=["mp4", "mov", "avi", "flv", "mkv", "jpg", "jpeg", "png"], type=["mp4", "mov", "avi", "flv", "mkv", "jpg", "jpeg", "png"],
@@ -664,10 +786,15 @@ with middle_panel:
saved_azure_speech_region = config.azure.get("speech_region", "") saved_azure_speech_region = config.azure.get("speech_region", "")
saved_azure_speech_key = config.azure.get("speech_key", "") saved_azure_speech_key = config.azure.get("speech_key", "")
azure_speech_region = st.text_input( azure_speech_region = st.text_input(
tr("Speech Region"), value=saved_azure_speech_region tr("Speech Region"),
value=saved_azure_speech_region,
key="azure_speech_region_input",
) )
azure_speech_key = st.text_input( azure_speech_key = st.text_input(
tr("Speech Key"), value=saved_azure_speech_key, type="password" tr("Speech Key"),
value=saved_azure_speech_key,
type="password",
key="azure_speech_key_input",
) )
config.azure["speech_region"] = azure_speech_region config.azure["speech_region"] = azure_speech_region
config.azure["speech_key"] = azure_speech_key config.azure["speech_key"] = azure_speech_key
@@ -704,7 +831,9 @@ with middle_panel:
# Show or hide components based on the selection # Show or hide components based on the selection
if params.bgm_type == "custom": if params.bgm_type == "custom":
custom_bgm_file = st.text_input(tr("Custom Background Music File")) custom_bgm_file = st.text_input(
tr("Custom Background Music File"), key="custom_bgm_file_input"
)
if custom_bgm_file and os.path.exists(custom_bgm_file): if custom_bgm_file and os.path.exists(custom_bgm_file):
params.bgm_file = custom_bgm_file params.bgm_file = custom_bgm_file
# st.write(f":red[已选择自定义背景音乐]**{custom_bgm_file}**") # st.write(f":red[已选择自定义背景音乐]**{custom_bgm_file}**")
@@ -744,7 +873,9 @@ with right_panel:
if params.subtitle_position == "custom": if params.subtitle_position == "custom":
custom_position = st.text_input( custom_position = st.text_input(
tr("Custom Position (% from top)"), value="70.0" tr("Custom Position (% from top)"),
value="70.0",
key="custom_position_input",
) )
try: try:
params.custom_position = float(custom_position) params.custom_position = float(custom_position)

View File

@@ -1,6 +1,14 @@
{ {
"Language": "German", "Language": "Deutsch",
"Translation": { "Translation": {
"Login Required": "Anmeldung erforderlich",
"Please login to access settings": "Bitte melden Sie sich an, um auf die Einstellungen zuzugreifen",
"Username": "Benutzername",
"Password": "Passwort",
"Login": "Anmelden",
"Login Error": "Anmeldefehler",
"Incorrect username or password": "Falscher Benutzername oder Passwort",
"Please enter your username and password": "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein",
"Video Script Settings": "**Drehbuch / Topic des Videos**", "Video Script Settings": "**Drehbuch / Topic des Videos**",
"Video Subject": "Worum soll es in dem Video gehen? (Geben Sie ein Keyword an, :red[Dank KI wird automatisch ein Drehbuch generieren])", "Video Subject": "Worum soll es in dem Video gehen? (Geben Sie ein Keyword an, :red[Dank KI wird automatisch ein Drehbuch generieren])",
"Script Language": "Welche Sprache soll zum Generieren von Drehbüchern verwendet werden? :red[KI generiert anhand dieses Begriffs das Drehbuch]", "Script Language": "Welche Sprache soll zum Generieren von Drehbüchern verwendet werden? :red[KI generiert anhand dieses Begriffs das Drehbuch]",
@@ -10,7 +18,7 @@
"Generate Video Keywords": "Klicken Sie, um KI zum Generieren zu verwenden [Video Keywords] basierend auf dem **Drehbuch**", "Generate Video Keywords": "Klicken Sie, um KI zum Generieren zu verwenden [Video Keywords] basierend auf dem **Drehbuch**",
"Please Enter the Video Subject": "Bitte geben Sie zuerst das Drehbuch an", "Please Enter the Video Subject": "Bitte geben Sie zuerst das Drehbuch an",
"Generating Video Script and Keywords": "KI generiert ein Drehbuch und Schlüsselwörter...", "Generating Video Script and Keywords": "KI generiert ein Drehbuch und Schlüsselwörter...",
"Generating Video Keywords": "AI is generating video keywords...", "Generating Video Keywords": "KI generiert Video-Schlüsselwörter...",
"Video Keywords": "Video Schlüsselwörter (:blue[① Optional, KI generiert ② Verwende **, (Kommas)** zur Trennung der Wörter, in englischer Sprache])", "Video Keywords": "Video Schlüsselwörter (:blue[① Optional, KI generiert ② Verwende **, (Kommas)** zur Trennung der Wörter, in englischer Sprache])",
"Video Settings": "**Video Einstellungen**", "Video Settings": "**Video Einstellungen**",
"Video Concat Mode": "Videoverkettungsmodus", "Video Concat Mode": "Videoverkettungsmodus",
@@ -30,8 +38,8 @@
"Number of Videos Generated Simultaneously": "Anzahl der parallel generierten Videos", "Number of Videos Generated Simultaneously": "Anzahl der parallel generierten Videos",
"Audio Settings": "**Audio Einstellungen**", "Audio Settings": "**Audio Einstellungen**",
"Speech Synthesis": "Sprachausgabe", "Speech Synthesis": "Sprachausgabe",
"Speech Region": "Region(:red[Required[Get Region](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/SpeechServices)])", "Speech Region": "Region(:red[Erforderlich[Region abrufen](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/SpeechServices)])",
"Speech Key": "API Key(:red[Required[Get API Key](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/SpeechServices)])", "Speech Key": "API-Schlüssel(:red[Erforderlich[API-Schlüssel abrufen](https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/SpeechServices)])",
"Speech Volume": "Lautstärke der Sprachausgabe", "Speech Volume": "Lautstärke der Sprachausgabe",
"Speech Rate": "Lesegeschwindigkeit (1,0 bedeutet 1x)", "Speech Rate": "Lesegeschwindigkeit (1,0 bedeutet 1x)",
"Male": "Männlich", "Male": "Männlich",
@@ -61,26 +69,31 @@
"Video Generation Completed": "Video erfolgreich generiert", "Video Generation Completed": "Video erfolgreich generiert",
"Video Generation Failed": "Video Generierung fehlgeschlagen", "Video Generation Failed": "Video Generierung fehlgeschlagen",
"You can download the generated video from the following links": "Sie können das generierte Video über die folgenden Links herunterladen", "You can download the generated video from the following links": "Sie können das generierte Video über die folgenden Links herunterladen",
"Basic Settings": "**Grunde Instellungen**", "Basic Settings": "**Grundeinstellungen** (:blue[Klicken zum Erweitern])",
"Pexels API Key": "Pexels API Key ([Get API Key](https://www.pexels.com/api/))", "Language": "Sprache",
"Pixabay API Key": "Pixabay API Key ([Get API Key](https://pixabay.com/api/docs/#api_search_videos))", "Pexels API Key": "Pexels API-Schlüssel ([API-Schlüssel abrufen](https://www.pexels.com/api/))",
"Language": "Language", "Pixabay API Key": "Pixabay API-Schlüssel ([API-Schlüssel abrufen](https://pixabay.com/api/docs/#api_search_videos))",
"LLM Provider": "LLM Provider", "LLM Provider": "KI-Modellanbieter",
"API Key": "API Key (:red[Required])", "API Key": "API-Schlüssel (:red[Erforderlich])",
"Base Url": "Base Url", "Base Url": "Basis-URL",
"Model Name": "Model Name", "Account ID": "Konto-ID (Aus dem Cloudflare-Dashboard)",
"Please Enter the LLM API Key": "Please Enter the **LLM API Key**", "Model Name": "Modellname",
"Please Enter the Pexels API Key": "Please Enter the **Pexels API Key**", "Please Enter the LLM API Key": "Bitte geben Sie den **KI-Modell API-Schlüssel** ein",
"Please Enter the Pixabay API Key": "Please Enter the **Pixabay API Key**", "Please Enter the Pexels API Key": "Bitte geben Sie den **Pexels API-Schlüssel** ein",
"Get Help": "If you need help, or have any questions, you can join discord for help: https://harryai.cc", "Please Enter the Pixabay API Key": "Bitte geben Sie den **Pixabay API-Schlüssel** ein",
"Video Source": "Video Source", "Get Help": "Wenn Sie Hilfe benötigen oder Fragen haben, können Sie dem Discord beitreten: https://harryai.cc",
"TikTok": "TikTok (TikTok support is coming soon)", "Video Source": "Videoquelle",
"Bilibili": "Bilibili (Bilibili support is coming soon)", "TikTok": "TikTok (TikTok-Unterstützung kommt bald)",
"Xiaohongshu": "Xiaohongshu (Xiaohongshu support is coming soon)", "Bilibili": "Bilibili (Bilibili-Unterstützung kommt bald)",
"Local file": "Local file", "Xiaohongshu": "Xiaohongshu (Xiaohongshu-Unterstützung kommt bald)",
"Play Voice": "Play Voice", "Local file": "Lokale Datei",
"Voice Example": "This is an example text for testing speech synthesis", "Play Voice": "Sprachausgabe abspielen",
"Synthesizing Voice": "Synthesizing voice, please wait...", "Voice Example": "Dies ist ein Beispieltext zum Testen der Sprachsynthese",
"TTS Provider": "Select the voice synthesis provider" "Synthesizing Voice": "Sprachsynthese läuft, bitte warten...",
"TTS Provider": "Sprachsynthese-Anbieter auswählen",
"Hide Log": "Protokoll ausblenden",
"点击获取": "Klicken zum Abrufen",
"推荐使用": "Empfohlen",
"可以不用配置,如果 Pexels 无法使用再选择Pixabay": "Kann uneingestellt bleiben. Wenn Pexels nicht funktioniert, wählen Sie Pixabay"
} }
} }

View File

@@ -1,6 +1,14 @@
{ {
"Language": "English", "Language": "English",
"Translation": { "Translation": {
"Login Required": "Login Required",
"Please login to access settings": "Please login to access settings",
"Username": "Username",
"Password": "Password",
"Login": "Login",
"Login Error": "Login Error",
"Incorrect username or password": "Incorrect username or password",
"Please enter your username and password": "Please enter your username and password",
"Video Script Settings": "**Video Script Settings**", "Video Script Settings": "**Video Script Settings**",
"Video Subject": "Video Subject (Provide a keyword, :red[AI will automatically generate] video script)", "Video Subject": "Video Subject (Provide a keyword, :red[AI will automatically generate] video script)",
"Script Language": "Language for Generating Video Script (AI will automatically output based on the language of your subject)", "Script Language": "Language for Generating Video Script (AI will automatically output based on the language of your subject)",

View File

@@ -1,12 +1,20 @@
{ {
"Language": "Português Brasileiro", "Language": "Português Brasileiro",
"Translation": { "Translation": {
"Login Required": "Login Necessário",
"Please login to access settings": "Por favor, faça login para acessar as configurações",
"Username": "Nome de usuário",
"Password": "Senha",
"Login": "Entrar",
"Login Error": "Erro de Login",
"Incorrect username or password": "Nome de usuário ou senha incorretos",
"Please enter your username and password": "Por favor, digite seu nome de usuário e senha",
"Video Script Settings": "**Configurações do Roteiro do Vídeo**", "Video Script Settings": "**Configurações do Roteiro do Vídeo**",
"Video Subject": "Tema do Vídeo (Forneça uma palavra-chave, :red[a IA irá gerar automaticamente] o roteiro do vídeo)", "Video Subject": "Tema do Vídeo (Forneça uma palavra-chave, :red[a IA irá gerar automaticamente] o roteiro do vídeo)",
"Script Language": "Idioma para Gerar o Roteiro do Vídeo (a IA irá gerar automaticamente com base no idioma do seu tema)", "Script Language": "Idioma para Gerar o Roteiro do Vídeo (a IA irá gerar automaticamente com base no idioma do seu tema)",
"Generate Video Script and Keywords": "Clique para usar a IA para gerar o [Roteiro do Vídeo] e as [Palavras-chave do Vídeo] com base no **tema**", "Generate Video Script and Keywords": "Clique para usar a IA para gerar o [Roteiro do Vídeo] e as [Palavras-chave do Vídeo] com base no **tema**",
"Auto Detect": "Detectar Automaticamente", "Auto Detect": "Detectar Automaticamente",
"Video Script": "Roteiro do Vídeo (:blue[① Opcional, gerado pela IA  ② Pontuação adequada ajuda na geração de legendas])", "Video Script": "Roteiro do Vídeo (:blue[① Opcional, gerado pela IA ② Pontuação adequada ajuda na geração de legendas])",
"Generate Video Keywords": "Clique para usar a IA para gerar [Palavras-chave do Vídeo] com base no **roteiro**", "Generate Video Keywords": "Clique para usar a IA para gerar [Palavras-chave do Vídeo] com base no **roteiro**",
"Please Enter the Video Subject": "Por favor, insira o Roteiro do Vídeo primeiro", "Please Enter the Video Subject": "Por favor, insira o Roteiro do Vídeo primeiro",
"Generating Video Script and Keywords": "A IA está gerando o roteiro do vídeo e as palavras-chave...", "Generating Video Script and Keywords": "A IA está gerando o roteiro do vídeo e as palavras-chave...",
@@ -61,10 +69,10 @@
"Video Generation Completed": "Geração do Vídeo Concluída", "Video Generation Completed": "Geração do Vídeo Concluída",
"Video Generation Failed": "Falha na Geração do Vídeo", "Video Generation Failed": "Falha na Geração do Vídeo",
"You can download the generated video from the following links": "Você pode baixar o vídeo gerado a partir dos seguintes links", "You can download the generated video from the following links": "Você pode baixar o vídeo gerado a partir dos seguintes links",
"Pexels API Key": "Chave da API do Pexels ([Obter Chave da API](https://www.pexels.com/api/))",
"Pixabay API Key": "Chave da API do Pixabay ([Obter Chave da API](https://pixabay.com/api/docs/#api_search_videos))",
"Basic Settings": "**Configurações Básicas** (:blue[Clique para expandir])", "Basic Settings": "**Configurações Básicas** (:blue[Clique para expandir])",
"Language": "Idioma", "Language": "Idioma",
"Pexels API Key": "Chave da API do Pexels ([Obter Chave da API](https://www.pexels.com/api/))",
"Pixabay API Key": "Chave da API do Pixabay ([Obter Chave da API](https://pixabay.com/api/docs/#api_search_videos))",
"LLM Provider": "Provedor LLM", "LLM Provider": "Provedor LLM",
"API Key": "Chave da API (:red[Obrigatório])", "API Key": "Chave da API (:red[Obrigatório])",
"Base Url": "URL Base", "Base Url": "URL Base",
@@ -83,6 +91,9 @@
"Voice Example": "Este é um exemplo de texto para testar a síntese de fala", "Voice Example": "Este é um exemplo de texto para testar a síntese de fala",
"Synthesizing Voice": "Sintetizando voz, por favor aguarde...", "Synthesizing Voice": "Sintetizando voz, por favor aguarde...",
"TTS Provider": "Selecione o provedor de síntese de voz", "TTS Provider": "Selecione o provedor de síntese de voz",
"Hide Log": "Ocultar Log" "Hide Log": "Ocultar Log",
"点击获取": "Clique para obter",
"推荐使用": "Recomendado",
"可以不用配置,如果 Pexels 无法使用再选择Pixabay": "Pode não ser configurado, se o Pexels não estiver disponível, escolha o Pixabay"
} }
} }

View File

@@ -1,6 +1,14 @@
{ {
"Language": "Tiếng Việt", "Language": "Tiếng Việt",
"Translation": { "Translation": {
"Login Required": "Yêu cầu đăng nhập",
"Please login to access settings": "Vui lòng đăng nhập để truy cập cài đặt",
"Username": "Tên đăng nhập",
"Password": "Mật khẩu",
"Login": "Đăng nhập",
"Login Error": "Lỗi đăng nhập",
"Incorrect username or password": "Tên đăng nhập hoặc mật khẩu không chính xác",
"Please enter your username and password": "Vui lòng nhập tên đăng nhập và mật khẩu của bạn",
"Video Script Settings": "**Cài Đặt Kịch Bản Video**", "Video Script Settings": "**Cài Đặt Kịch Bản Video**",
"Video Subject": "Chủ Đề Video (Cung cấp một từ khóa, :red[AI sẽ tự động tạo ra] kịch bản video)", "Video Subject": "Chủ Đề Video (Cung cấp một từ khóa, :red[AI sẽ tự động tạo ra] kịch bản video)",
"Script Language": "Ngôn Ngữ cho Việc Tạo Kịch Bản Video (AI sẽ tự động xuất ra dựa trên ngôn ngữ của chủ đề của bạn)", "Script Language": "Ngôn Ngữ cho Việc Tạo Kịch Bản Video (AI sẽ tự động xuất ra dựa trên ngôn ngữ của chủ đề của bạn)",
@@ -61,10 +69,10 @@
"Video Generation Completed": "Hoàn Tất Tạo Video", "Video Generation Completed": "Hoàn Tất Tạo Video",
"Video Generation Failed": "Tạo Video Thất Bại", "Video Generation Failed": "Tạo Video Thất Bại",
"You can download the generated video from the following links": "Bạn có thể tải video được tạo ra từ các liên kết sau", "You can download the generated video from the following links": "Bạn có thể tải video được tạo ra từ các liên kết sau",
"Pexels API Key": "Khóa API Pexels ([Lấy Khóa API](https://www.pexels.com/api/))",
"Pixabay API Key": "Pixabay API Key ([Get API Key](https://pixabay.com/api/docs/#api_search_videos))",
"Basic Settings": "**Cài Đặt Cơ Bản** (:blue[Nhấp để mở rộng])", "Basic Settings": "**Cài Đặt Cơ Bản** (:blue[Nhấp để mở rộng])",
"Language": "Ngôn Ngữ", "Language": "Ngôn Ngữ",
"Pexels API Key": "Khóa API Pexels ([Lấy Khóa API](https://www.pexels.com/api/))",
"Pixabay API Key": "Khóa API Pixabay ([Lấy Khóa API](https://pixabay.com/api/docs/#api_search_videos))",
"LLM Provider": "Nhà Cung Cấp LLM", "LLM Provider": "Nhà Cung Cấp LLM",
"API Key": "Khóa API (:red[Bắt Buộc])", "API Key": "Khóa API (:red[Bắt Buộc])",
"Base Url": "Url Cơ Bản", "Base Url": "Url Cơ Bản",
@@ -72,16 +80,20 @@
"Model Name": "Tên Mô Hình", "Model Name": "Tên Mô Hình",
"Please Enter the LLM API Key": "Vui lòng Nhập **Khóa API LLM**", "Please Enter the LLM API Key": "Vui lòng Nhập **Khóa API LLM**",
"Please Enter the Pexels API Key": "Vui lòng Nhập **Khóa API Pexels**", "Please Enter the Pexels API Key": "Vui lòng Nhập **Khóa API Pexels**",
"Please Enter the Pixabay API Key": "Vui lòng Nhập **Pixabay API Key**", "Please Enter the Pixabay API Key": "Vui lòng Nhập **Khóa API Pixabay**",
"Get Help": "Nếu bạn cần giúp đỡ hoặc có bất kỳ câu hỏi nào, bạn có thể tham gia discord để được giúp đỡ: https://harryai.cc", "Get Help": "Nếu bạn cần giúp đỡ hoặc có bất kỳ câu hỏi nào, bạn có thể tham gia discord để được giúp đỡ: https://harryai.cc",
"Video Source": "Video Source", "Video Source": "Nguồn Video",
"TikTok": "TikTok (TikTok support is coming soon)", "TikTok": "TikTok (Hỗ trợ TikTok sắp ra mắt)",
"Bilibili": "Bilibili (Bilibili support is coming soon)", "Bilibili": "Bilibili (Hỗ trợ Bilibili sắp ra mắt)",
"Xiaohongshu": "Xiaohongshu (Xiaohongshu support is coming soon)", "Xiaohongshu": "Xiaohongshu (Hỗ trợ Xiaohongshu sắp ra mắt)",
"Local file": "Local file", "Local file": "Tệp cục bộ",
"Play Voice": "Play Voice", "Play Voice": "Phát Giọng Nói",
"Voice Example": "This is an example text for testing speech synthesis", "Voice Example": "Đây là văn bản mẫu để kiểm tra tổng hợp giọng nói",
"Synthesizing Voice": "Synthesizing voice, please wait...", "Synthesizing Voice": "Đang tổng hợp giọng nói, vui lòng đợi...",
"TTS Provider": "Select the voice synthesis provider" "TTS Provider": "Chọn nhà cung cấp tổng hợp giọng nói",
"Hide Log": "Ẩn Nhật Ký",
"点击获取": "Nhấp để lấy",
"推荐使用": "Được khuyến nghị",
"可以不用配置,如果 Pexels 无法使用再选择Pixabay": "Có thể không cần cấu hình, nếu Pexels không khả dụng, hãy chọn Pixabay"
} }
} }

View File

@@ -1,6 +1,14 @@
{ {
"Language": "简体中文", "Language": "简体中文",
"Translation": { "Translation": {
"Login Required": "需要登录",
"Please login to access settings": "请登录后访问配置设置",
"Username": "用户名",
"Password": "密码",
"Login": "登录",
"Login Error": "登录错误",
"Incorrect username or password": "用户名或密码不正确",
"Please enter your username and password": "请输入用户名和密码",
"Video Script Settings": "**文案设置**", "Video Script Settings": "**文案设置**",
"Video Subject": "视频主题(给定一个关键词,:red[AI自动生成]视频文案)", "Video Subject": "视频主题(给定一个关键词,:red[AI自动生成]视频文案)",
"Script Language": "生成视频脚本的语言一般情况AI会自动根据你输入的主题语言输出", "Script Language": "生成视频脚本的语言一般情况AI会自动根据你输入的主题语言输出",