You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Whisper API批量转写音频时response_format参数报错求助

解决Whisper API批量生成SRT/VTT字幕的问题

问题场景

我用以下Python脚本调用Whisper API,批量将文件夹里的MP3文件转写成SRT和VTT格式:

import requests
import os
import openai

folder_path = "/content/audios/"
def transcribe_and_save(file_path, format):
    url = 'https://api.openai.com/v1/audio/transcriptions'
    headers = {'Authorization': 'Bearer MyToken'}
    files = {'file': open(file_path, 'rb'), 
            'model': (None, 'whisper-1'),
            'response_format': format}
    response = requests.post(url, headers=headers, files=files)
    output_path = os.path.join(folder_path, os.path.splitext(filename)[0] + '.' + format)
    with open(output_path, 'w') as f:
        f.write(response.content.decode('utf-8'))

for filename in os.listdir(folder_path):
    if filename.endswith('.mp3'):
        file_path = os.path.join(folder_path, filename)
        transcribe_and_save(file_path, 'srt')
        transcribe_and_save(file_path, 'vtt')
else:
    print('mp3s not found in folder')

运行脚本后收到如下错误:

"error": {
    "message": "1 validation error for Request\nbody -> response_format\n  value is not a valid enumeration member; permitted: 'json', 'text', 'vtt', 'srt', 'verbose_json' (type=type_error.enum; enum_values=[<ResponseFormat.JSON: 'json'>, <ResponseFormat.TEXT: 'text'>, <ResponseFormat.VTT: 'vtt'>, <ResponseFormat.SRT: 'srt'>, <ResponseFormat.VERBOSE_JSON: 'verbose_json'>])",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }

尝试调整参数后要么报错,要么只得到纯文本转录结果,无法生成目标SRT/VTT格式文件,需要解决这个问题,让脚本在音频所在文件夹生成对应的字幕文件。

修复方案

原脚本的核心问题是**response_format等非文件参数的传递方式错误**。发送multipart/form-data请求时,非文件类型参数必须放在data参数中,而不是嵌套在files字典里。另外还有变量引用错误的问题,以下是修复后的完整脚本:

import requests
import os

folder_path = "/content/audios/"
# 替换成你的OpenAI API密钥,或者用os.getenv("OPENAI_API_KEY")从环境变量读取
API_KEY = "你的OpenAI密钥"

def transcribe_and_save(file_path, target_format):
    url = 'https://api.openai.com/v1/audio/transcriptions'
    headers = {'Authorization': f'Bearer {API_KEY}'}
    
    # 非文件参数放到data里,文件放到files里
    data = {
        'model': 'whisper-1',
        'response_format': target_format
    }
    files = {'file': open(file_path, 'rb')}
    
    try:
        response = requests.post(url, headers=headers, data=data, files=files)
        response.raise_for_status()  # 捕获HTTP请求错误
        
        # 从文件路径提取文件名,避免变量未定义问题
        filename = os.path.basename(file_path)
        output_path = os.path.join(folder_path, os.path.splitext(filename)[0] + '.' + target_format)
        
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(response.text)
            
        print(f"已生成: {output_path}")
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")

# 遍历文件夹处理MP3文件
mp3_found = False
for filename in os.listdir(folder_path):
    if filename.endswith('.mp3'):
        mp3_found = True
        file_path = os.path.join(folder_path, filename)
        transcribe_and_save(file_path, 'srt')
        transcribe_and_save(file_path, 'vtt')

if not mp3_found:
    print('文件夹中未找到MP3文件')

关键修改说明

  • 参数传递修正:将model和response_format从files移到data字典,符合OpenAI API的请求格式规范
  • 变量引用修复:通过os.path.basename(file_path)从文件路径提取文件名,解决原脚本中filename未定义的问题
  • 错误处理增强:增加try-except块和response.raise_for_status(),能及时捕获并显示请求错误,便于排查问题
  • 编码优化:写入文件时指定utf-8编码,避免部分字幕字符出现乱码

使用方法

  1. 将folder_path替换为你的音频文件夹实际路径
  2. 把API_KEY替换成你的OpenAI API密钥(推荐通过环境变量OPENAI_API_KEY读取,更安全)
  3. 运行脚本后,每个MP3文件对应的SRT和VTT字幕文件会自动生成在同一文件夹下

内容的提问来源于stack exchange,提问作者waghler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:13:27