PHP无法直接实现语音识别与翻译,必须调用外部工具(如whisper.cpp或openai-whisper)和云API(如DeepL),其角色仅为任务调度与胶水层。

PHP 本身不能直接生成视频字幕或执行语音识别/翻译模型——它没有内置的 ASR(自动语音识别)或 NMT(神经机器翻译)能力,也不适合做音视频编解码处理。所有“PHP 自动生成字幕并翻译”的方案,本质都是调用外部服务或命令行工具,PHP 充当调度和胶水层。
为什么不能纯 PHP 做语音转文字(ASR)
ASR 需要加载大型深度学习模型(如 Whisper、Wav2Vec)、处理原始音频特征(MFCC、log-mel spectrogram)、GPU 加速推理——PHP 没有原生张量计算支持,无法加载 PyTorch/TensorFlow 模型,也没有可靠的实时音频流处理扩展。
-
file_get_contents("audio.mp3")只能读二进制,无法提取语音帧 - PHP 的
ffmpeg扩展(如ffmpeg-php)早已废弃,现代 PHP 无维护的音视频处理库 - 试图用
exec("python whisper.py audio.mp3")调用 Python 是可行路径,但必须确保环境、依赖、权限全部就位
用 PHP 调用 Whisper CLI 生成 SRT 字幕
最现实的做法是:PHP 负责切分任务(上传、转码、调用、合并),核心 ASR 交给 whisper.cpp(C++ 快速版)或官方 openai-whisper(Python)。需提前在服务器部署好 CLI 工具。
- 先用
ffmpeg提取音频:exec("ffmpeg -i video.mp4 -vn -acodec libmp3lame -y audio.mp3") - 再调用 whisper:
exec("whisper audio.mp3 --model base --language zh --output_format srt 2>&1", $output, $returnCode) - 检查
$returnCode !== 0时,$output里通常含错误,比如"No module named 'torch'表示 Python 环境缺失依赖 - 输出的
audio.srt文件需用file_get_contents()读取并返回给前端
PHP 调用翻译 API 补全多语言字幕
Whisper 输出的是源语言字幕(如中文),翻译需另走一步。不建议本地跑 LLM(资源消耗大),优先选云 API:
立即学习“PHP免费学习笔记(深入)”;
- DeepL API 最适合字幕场景:
https://api-free.deepl.com/v2/translate,支持source_lang=ZH、target_lang=EN,且保留时间轴结构 - 调用前必须用
file_get_contents("audio.srt")解析原始 SRT,按段落拆分(正则匹配/^\d+\n\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}\n(.+?)\n\n/m) - 每次请求最多传 5000 字符,长字幕需分批;DeepL 对换行符敏感,发送前用
str_replace("\n", " ", $text)更稳妥 - 别硬编码 API key——存进
$_ENV['DEEPL_KEY']或配置文件,避免泄露
常见失败点与绕过方式
实际部署时,80% 的问题不出在代码逻辑,而出在环境链路上:
-
exec()被禁用?检查disable_functions是否含exec,shell_exec,passthru—— 若受限,改用 Supervisor 管理后台任务队列(如 Laravel Horizon 或纯 Redis + worker) - Whisper 报
"CUDA out of memory"?加参数--device cpu强制 CPU 推理(速度慢但稳定) - SRT 时间轴错乱?确保 ffmpeg 提取音频时没重采样失真:
-ar 16000 -ac 1(Whisper 默认输入采样率) - 翻译后字幕不同步?不要逐句翻译再拼时间轴——应保持原始
index和timecode不变,只替换中间文本行
真正卡住人的,从来不是 PHP 写几行 file_put_contents,而是 Whisper 模型下载路径权限不对、DeePL 返回 456 错误码(配额超限)、或者 ffmpeg 版本太老不支持 aac_at 编码——这些都得一条条 echo 出来查。



















