#2535 Asking about running pyvideotrans from container on cloud gpu, I cannot run tool as api.py to build api service for me t

2001:ee0* Posted at: 1 day ago 👁26

Asking about running pyvideotrans from container on cloud gpu, I cannot run tool as api.py to build api service for me to upload audio to transcribe to srt.
it throw error when run "uv run api.py":
QThread: Destroyed while thread '' is still running
then exit.
How to solve that? Or is there another way to run as cli on ubuntu server?

11 Replies

您遇到的问题 QThread: Destroyed while thread '' is still running 是 PySide6 (GUI 框架) 在非 GUI 环境(如容器、服务器)中运行时的典型错误。api.py 脚本依赖于 GUI 组件,无法在无显示服务器的环境下直接运行。

解决方案:使用 sp.py 的命令行模式

pyVideoTrans 提供了完整的命令行接口,无需启动 GUI 或 API 服务。您可以直接通过命令行参数完成音频转录任务。

操作步骤:

  1. 确保环境正确:在您的容器内,已通过 uv sync 安装好所有依赖,并且 ffmpeg 可用。
  2. 使用命令行转录:通过 uv run sp.py 并附加命令行参数来执行任务。

基本命令格式示例:

# 转录单个音频文件为 SRT 字幕
uv run sp.py --mode biaozhun --source_mp4 /path/to/your/audio.mp3 --target_dir /path/to/output --recogn_type faster --model_name large-v3 --source_language en --target_language zh

# 对文件夹内的所有音频文件进行批量转录
uv run sp.py --mode biaozhun --source_mp4 /path/to/your/audio_folder --target_dir /path/to/output --recogn_type faster --model_name medium --source_language ja --target_language en

关键参数解释:

  • --mode biaozhun: 使用标准视频翻译模式(也适用于纯音频)。
  • --source_mp4: 输入音频/视频文件或文件夹的路径。
  • --target_dir: 输出目录,SRT 文件将生成于此。
  • --recogn_type: 语音识别引擎,如 faster (faster-whisper)。
  • --model_name: 模型名称,如 tiny, base, small, medium, large-v2, large-v3
  • --source_language: 音频的原始语言代码 (如 en, ja, zh, auto)。
  • --target_language: 如果需要翻译,设置目标语言代码。如果仅转录,可设置为与源语言相同。

仅转录(不翻译)示例:
如果您只需要英文字幕,不翻译:

uv run sp.py --mode biaozhun --source_mp4 input.mp3 --target_dir ./output --recogn_type faster --model_name large-v3 --source_language en --target_language en

获取完整命令行帮助:
运行以下命令查看所有可用参数:

uv run sp.py --help

结论
请放弃运行 api.py,直接使用 uv run sp.py 配合命令行参数在您的 Ubuntu 服务器容器中执行音频转录任务。这是官方支持的无头(headless)运行方式。

请查看更多参考文档:

image
I run uv run sp.py --help, it show nothing and return to bash prompt again, no error/notification, how to solve

uv run sp.py --help 无输出直接返回,通常是因为 sp.py 脚本在导入阶段就因环境问题而静默退出了。这很可能与您在容器/服务器环境中缺少 GUI 依赖或某些模块初始化失败有关。

解决方案:使用 python -m 方式运行并捕获错误

请尝试以下命令,它能显示更详细的错误信息:

python -m sp --help

或者,如果您的 uv 环境已激活,也可以使用:

uv run python -m sp --help

如果上述命令仍然无输出或报错,请按顺序执行以下诊断步骤:

  1. 检查 Python 路径和模块:首先确认您是否在 pyvideotrans 项目根目录下运行。

    pwd
    ls -la sp.py
  2. 直接运行脚本并重定向输出:尝试直接运行 Python 脚本,并将所有输出(包括标准错误 stderr)重定向到文件或终端。

    python sp.py --help 2>&1

    uv run python sp.py --help 2>&1

    注意观察终端是否出现任何错误信息,例如关于 PySide6libGLqt.qpa.plugin 或任何 ModuleNotFoundError

  3. 常见原因与解决

    • 缺少 Qt GUI 依赖(最常见):在纯服务器/容器环境中,可能缺少必要的图形库。即使您只想用命令行,sp.py 的部分初始化代码也可能尝试加载 GUI 组件。

      • 对于 Ubuntu/Debian 容器,尝试安装:

        apt-get update && apt-get install -y libgl1-mesa-glx libxcb-xinerama0
    • 环境变量问题:设置 QT_QPA_PLATFORM 环境变量为 offscreen,告诉 Qt 使用无头模式。

      export QT_QPA_PLATFORM=offscreen
      # 然后再次运行
      uv run sp.py --help
    • PySide6 安装问题:确保 PySide6 已正确安装在您的 uv 环境中。

      uv run python -c "import PySide6; print(PySide6.__version__)"

备用方案:使用纯 CLI 工具 videotrans/toolbox.py

如果上述方法均无效,pyVideoTrans 还有一个更底层的工具箱脚本,它可能对 GUI 的依赖更少。您可以尝试直接调用其转录功能:

# 进入工具箱命令行界面(如果支持)
uv run python -m videotrans.toolbox
# 或者尝试直接调用特定功能(需查看工具箱源码确认具体函数)

最后,如果问题依旧,请提供诊断命令的输出

请运行以下命令并将完整输出提供给我:

cd /path/to/your/pyvideotrans
export QT_QPA_PLATFORM=offscreen
python sp.py --help 2>&1 | head -50

这将帮助我定位具体的失败原因。

image
it works partially, but I don't see any parameters you said above to use as cli to transcribe audio to srt subtitle

您看到的是旧版帮助信息。请使用 --help2 参数查看新版完整命令行帮助:

uv run sp.py --help2

如果 --help2 无效,可能是版本较旧,请尝试直接从源码运行:

cd /path/to/pyvideotrans
python -c "import sp; import sys; sys.argv = ['sp.py', '--help2']; sp.main()"

核心转录命令格式应为:

uv run sp.py --source_mp4 输入文件 --target_dir 输出目录 --recogn_type faster --model_name large-v3 --source_language en --target_language en

请先确认 --help2 的输出,然后使用新版参数。

no, not working as I expected. Please see my screenshot for details
image
It show like this screenshot then stuck, I have to control break to return my bash prompt

看到您截图中显示的是交互式菜单界面,而不是直接执行转录任务。这是因为您没有提供足够的命令行参数,导致程序进入了交互式选择模式,并且在等待用户输入时卡住了。

正确做法是:提供完整的命令行参数,让程序直接执行任务,而无需进入交互菜单。

根据您的需求(在 Ubuntu 服务器容器中将音频转录为 SRT 字幕),请使用以下格式的命令:

uv run sp.py --app_mode biaozhun --source_mp4 /path/to/your/audio.mp3 --target_dir /path/to/output --source_language en --target_language en --recogn_type 0 --model_name large-v3 --voice_role no --subtitle_type 0

参数详解:

  • --app_mode biaozhun: 设置为标准模式。
  • --source_mp4: 输入音频文件的完整路径(支持 mp3, wav, m4a, flac 等格式)。
  • --target_dir: 输出目录的完整路径,SRT 文件将生成在这里。
  • --source_language en: 音频语言为英语。
  • --target_language en: 目标语言也为英语(表示仅转录,不翻译)。
  • --recogn_type 0: 语音识别引擎选择 faster-whisper(0 是其代号)。
  • --model_name large-v3: 使用 large-v3 模型(精度高,可替换为 medium, small 等)。
  • --voice_role no: 不进行配音。
  • --subtitle_type 0: 不嵌入字幕(仅生成独立的 SRT 文件)。

完整示例:
假设您的音频文件是 /data/audio.mp3,希望输出到 /data/output/ 目录,命令如下:

uv run sp.py --app_mode biaozhun --source_mp4 /data/audio.mp3 --target_dir /data/output --source_language en --target_language en --recogn_type 0 --model_name large-v3 --voice_role no --subtitle_type 0

执行此命令后,程序将直接开始转录,并在 /data/output 目录下生成同名的 .srt 字幕文件。

重要提示:

  1. 请确保 --source_mp4--target_dir 的路径是绝对路径
  2. 如果您的音频语言不是英语,请相应修改 --source_language 参数(如 ja 日语,zh 中文,auto 自动检测)。
  3. 如果只需要转录,--target_language 必须设置为与 --source_language 相同。
  4. 首次运行会下载 large-v3 模型,请确保网络通畅。

请运行上述格式的命令,它将直接处理音频并生成 SRT,不会进入交互菜单。

OK. I just want to use some cmd to show list of cli parameter sp.py support. Like showing list of parameters you said above:
Parameter details:

--app_mode biaozhunSet to standard mode.
--source_mp4: Enter the full path to the audio file (supports formats such as mp3, wav, m4a, and flac).
--target_dir: The full path to the output directory where SRT files will be generated.
--source_language enThe audio language is English.
--target_language enThe target language is also English (indicating transcription only, no translation).
--recogn_type 0: Speech recognition engine selection faster-whisper(0 is its code).
--model_name large-v3Use large-v3the model (high accuracy, can be replaced with medium, smalletc.).
--voice_role noNo voice-over.
--subtitle_type 0Subtitles are not embedded (only a standalone SRT file is generated).

How to use cmd combine which parameter to show help parameter detail list above, not simple like previous post I sent with just 2 simple param like --help or --lang
Or it not implement yet on this sp.py cli?

您说得对,当前 sp.py 的命令行帮助系统(--help)确实没有完整列出所有可用参数及其详细说明。这是一个已知的界面限制。要获取您所需的详细参数列表,目前有几种方法:方法一:查看源代码中的参数定义(推荐)所有命令行参数的定义在 sp.py 文件的 main() 函数开头部分。您可以直接查看这部分代码来了解所有支持的参数。在您的项目目录下运行:grep -n "parser.add_argument" sp.py | head -30这会显示前30个参数定义的行。要查看完整的参数列表和其帮助文本(虽然有些是英文),可以运行:python -c "
import sp
import sys

创建一个临时解析器来打印帮助

from argparse import ArgumentParser
parser = ArgumentParser()
sp.add_cli_arguments(parser) # 这个函数可能不存在,如果报错请用下面的方法
parser.print_help()
"如果上述方法报错,更直接的方法是查看 sp.pymain() 函数开头的代码块。方法二:使用内置的“显示所有参数”功能(如果版本支持)某些版本的 pyVideoTrans 在高级选项中有一个“主界面显示所有参数”的开关,但这主要针对GUI。对于命令行,您可以尝试运行以下命令,它可能会触发一个包含更多参数的帮助信息:uv run sp.py --help --show_all方法三:参考核心知识库中的 TaskCfg 类定义(最权威)所有可能的配置参数都对应 TaskCfg 类的属性。您可以在我们对话开头提供的【核心知识库】的“配置类信息TaskCfg”部分找到完整的列表。每个 TaskCfg 的属性都可以通过命令行设置,格式为 --属性名 值。例如:--app_mode 对应 TaskCfg.app_mode--source_mp4 对应 TaskCfg.name (注意:命令行中仍用 --source_mp4)--target_dir 对应 TaskCfg.target_dir--source_language 对应 TaskCfg.source_language--recogn_type 对应 TaskCfg.recogn_type--model_name 对应 TaskCfg.model_name--voice_role 对应 TaskCfg.voice_role--subtitle_type 对应 TaskCfg.subtitle_type其他常用参数:--detect_language: 字幕检测语言代码--target_language_code: 目标语言代码(3位)--voice_rate: 语速调整,如 "+0%"--volume: 音量调整,如 "+0%"--pitch: 音调调整,如 "+0Hz"--cuda: 是否使用CUDA加速(布尔值)--clear_cache: 是否清理已存在的文件(布尔值)方法四:直接使用示例命令并修改根据您之前成功的经验,最实用的方法是基于一个能工作的命令模板进行修改。例如,您之前成功运行的命令是:uv run sp.py --app_mode biaozhun --source_mp4 1.mp3 --target_dir ./ --source_language en --target_language en --recogn_type 0 --model_name large-v3 --voice_role no --subtitle_type 0您可以在此模板基础上,根据需要增删或修改参数。结论:目前 sp.py 没有提供像 --help 那样完整的参数说明文档。最可靠的方法是:参考【核心知识库】中的 TaskCfg 属性列表。以您已验证可用的命令为模板进行修改。如果需要了解某个特定参数,可以查看 sp.py 源码中 parser.add_argument 对应的行。请查看更多参考文档:源码部署

I see your idea. Could you show me which code file has define these param in project source code, I can read more. Currently I not found which your suggested command "grep -n "parser.add_argument" sp.py | head -30".

您是对的,sp.py 中可能没有 parser.add_argument,因为它的命令行参数解析方式可能不同。让我帮您找到正确的定义位置。

根据项目结构,命令行参数处理主要在以下几个文件中:

1. 主入口 sp.py 中的 main() 函数
请查看 sp.py 文件末尾的 main() 函数,参数解析通常在这里。运行:

grep -A 50 "def main" sp.py | grep -A 50 "if __name__"

2. 参数定义在 videotrans/configure/config.py
这是最可能的地方,因为 TaskCfg 类在这里定义。运行:

grep -n "class TaskCfg" videotrans/configure/config.py

3. 命令行参数映射在 videotrans/translate.pyvideotrans/main.py
参数从命令行到 TaskCfg 的映射可能在这里。运行:

grep -r "parser.add_argument\|argparse" videotrans/ --include="*.py" | head -20

4. 查看项目根目录的 setup.pypyproject.toml
有时命令行入口点会在这里定义。

快速找到所有可用参数的方法:
运行以下命令查看 sp.py 如何处理参数:

python -c "
import sp
import sys
# 查看 main 函数源码
import inspect
print(inspect.getsource(sp.main))
" | head -100

或者直接查看 TaskCfg 的所有属性(这是最权威的列表):

python -c "
from videotrans.configure.config import TaskCfg
import inspect
# 获取 TaskCfg 类的所有属性
members = inspect.getmembers(TaskCfg)
for name, value in members:
    if not name.startswith('_') and not inspect.ismethod(value):
        print(f'{name}: {value}')
"

实际命令行参数与 TaskCfg 属性的对应关系:
从您的截图和之前的成功命令来看,命令行参数名与 TaskCfg 属性名基本一致,只是:

  • --source_mp4 对应 TaskCfg.name(输入文件)
  • 其他参数如 --app_mode, --target_dir, --source_language 等直接对应同名属性

建议您:

  1. 首先运行查看 TaskCfg 属性的命令,获取所有可能的配置项
  2. 然后查看 sp.pymain() 函数,了解参数如何被解析

请运行上述命令之一,我会帮您分析结果。

Post Your Reply
Open source and free maintenance is not easy. If this project is helpful to you, please consider making a small donation to help the project continue to maintain and update.

Donate: https://ko-fi.com/jianchang512

Trending Questions