使用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编码,避免部分字幕字符出现乱码
使用方法
- 将
folder_path替换为你的音频文件夹实际路径 - 把
API_KEY替换成你的OpenAI API密钥(推荐通过环境变量OPENAI_API_KEY读取,更安全) - 运行脚本后,每个MP3文件对应的SRT和VTT字幕文件会自动生成在同一文件夹下
内容的提问来源于stack exchange,提问作者waghler
相关产品推荐
相关产品推荐

