srt字幕需将whisper api返回的秒级浮点时间戳转换为hh:mm:ss,mmm格式,正确做法是先round($t*1000)取整毫秒,再拆解时分秒毫秒,避免用date()误当unix时间戳处理。

Whisper API 返回的 timestamped segments 怎么解析成 SRT 字幕格式
Whisper API(OpenAI 官方接口)返回的 segments 是带起止时间戳的数组,但时间单位是秒(浮点数),而 SRT 要求 HH:MM:SS,mmm 格式。直接四舍五入或 date() 会出错——因为 date('H:i:s', $seconds) 把秒数当 Unix 时间戳处理,导致乱码。
正确做法是手动拆解:用 floor($t) 得总秒数,再分别算时、分、秒、毫秒:
function secondsToSrtTime(float $t): string {
$totalMs = (int)round($t * 1000);
$hours = floor($totalMs / 3600000);
$minutes = floor(($totalMs % 3600000) / 60000);
$seconds = floor(($totalMs % 60000) / 1000);
$ms = $totalMs % 1000;
return sprintf('%02d:%02d:%02d,%03d', $hours, $minutes, $seconds, $ms);
}
- 必须用
round($t * 1000)再取整,避免浮点误差(如12.999变成12,998) - API 返回的
segments中start和end是 float,别直接传给date() - 如果后端用 PHP 8.1+,可用
str_pad()替代sprintf,但sprintf更稳
PHP cURL 调用 Whisper API 时怎么传音频文件且不超时
Whisper API 要求 multipart/form-data 提交 file(二进制音频)和 model(如 "whisper-1"),不能用 JSON body。常见错误是用 json_encode() 包裹文件内容,结果返回 400 Bad Request: Invalid file。
关键点:用 CURLFile(PHP 5.5+)构造上传体,禁用 @ 语法(已被弃用且在 PHP 8.0+ 报错):
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.openai.com/v1/audio/transcriptions',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => new CURLFile('/tmp/upload.wav', 'audio/wav', 'audio.wav'),
'model' => 'whisper-1',
'response_format' => 'verbose_json', // 必须设这个才能拿到 segments
'timestamp_granularities[]' => 'segment'
],
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $_ENV['OPENAI_API_KEY'],
'Content-Type: multipart/form-data'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 300 // Whisper 处理长音频可能超 60 秒,至少设 300
]);
-
response_format必须是"verbose_json",否则segments字段为空 -
timestamp_granularities[]是数组写法,cURL 会自动编码为多个同名字段;若用 Guzzle,需显式传数组 - 音频文件路径必须是服务器本地路径(
/tmp/xxx.wav),不能是 URL 或 base64 - 超时设太短(如 60 秒)会导致 30–60 秒音频直接失败,返回空响应或 cURL error 28
前端上传大音频文件时 PHP 报 upload_max_filesize 或 max_post_size 错误
用户上传 100MB 的 WAV 文件,PHP 默认限制通常只有 2MB,直接卡在 $_FILES 为空,error 是 1(UPLOAD_ERR_INI_SIZE)或 4(UPLOAD_ERR_NO_FILE)。
光改 php.ini 不够,Nginx/Apache 层也有拦截:
- PHP 层:调大
upload_max_filesize和post_max_size(后者需 ≥ 前者 + 表单开销),例如都设为200M - Nginx 层:加
client_max_body_size 200M;到server或location块,否则请求根本到不了 PHP - Apache 层:加
LimitRequestBody 209715200(单位字节)到.htaccess或虚拟主机配置 - 浏览器端建议加进度条和分片上传(如使用
webuploader或原生fetch+slice()),避免单次请求卡死
注意:memory_limit 也得同步调高(如 512M),否则 file_get_contents() 读大文件时直接崩溃。
生成的字幕时间轴错位、断句奇怪,怎么调 API 参数缓解
Whisper API 默认不做语言检测,也不强制标点,容易把 “hello world” 连成一句,或把中文长句切在动词后。这不是 PHP 问题,而是 API 调用参数没对齐实际需求。
关键可调参数(加在 CURLOPT_POSTFIELDS 里):
-
language:显式传"zh"或"en",比自动检测准;不传可能误判方言或混合语种 -
prompt:传引导文本提升断句质量,比如中文场景加"以下是普通话对话,每句话结束用句号。" -
temperature:设0.0强制确定性输出(默认是0.0,但显式写上更稳) - 避免用
response_format= "text"——它丢掉所有时间信息,无法生成字幕
真正的时间轴精度取决于音频质量:采样率低于 16kHz、有回声、背景音乐压过人声,API 就会硬凑时间点。这时 PHP 端做不了什么,得前端预处理(降噪、重采样)或换本地 Whisper.cpp。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











