基于Whisper与ChatGPT API构建YouTube视频智能摘要工具链
1. 项目概述与核心价值最近在折腾一个挺有意思的项目起因是我发现很多朋友包括我自己在观看一些外语技术视频或者长教程时总希望能快速获取视频的核心内容而不是花上几十分钟甚至几个小时去完整观看。手动记笔记效率太低而市面上的一些工具要么收费昂贵要么功能单一。于是我就琢磨着能不能自己动手搭建一个能将YouTube视频内容自动转录并利用大语言模型比如ChatGPT的API进行智能总结的工具链。这个想法最终落地成了一个我称之为“YouTube视频智能摘要器”的项目。简单来说这个项目的核心价值在于自动化地为你提取YouTube视频的“干货”。你只需要提供一个视频链接系统就会自动完成下载音频、语音转文字、调用AI API进行内容提炼和总结这一系列操作最终生成一份结构清晰、重点突出的文本摘要。这对于学习者、内容创作者、市场研究人员或者任何需要快速消化视频信息的人来说都是一个效率神器。它特别适合那些需要追踪多个信息源、进行竞品分析或者单纯想高效学习新知识的朋友。整个项目的构建并不复杂但涉及了几个关键环节的串联YouTube内容获取、音频处理、语音识别ASR和自然语言处理NLP。下面我就来详细拆解一下我的实现思路、具体操作步骤以及在这个过程中踩过的坑和积累的经验。2. 技术栈选型与设计思路在动手之前明确技术选型是至关重要的一步。我的核心目标是稳定、高效、可扩展并且尽量控制成本。2.1 核心组件拆解整个流程可以分解为四个主要模块视频源获取模块负责从YouTube下载指定视频的音频流。音频处理模块对下载的音频进行预处理如格式转换、降噪可选、切割针对超长视频以适配语音识别接口。语音转文本模块ASR将音频文件转换为准确的文字稿。文本总结模块NLP调用大语言模型API对长篇文字稿进行总结、提炼要点、生成大纲等。2.2 具体技术方案选型与理由对于模块一视频源获取我选择了yt-dlp。它是youtube-dl的一个活跃分支更新更及时对YouTube的反爬机制应对更好支持格式也更全面。相比一些封装好的库yt-dlp命令行工具足够强大和灵活可以通过Python的subprocess模块轻松调用。注意使用任何工具下载视频内容时务必遵守YouTube的服务条款以及相关版权法律法规。本项目仅讨论技术实现用于个人学习与研究目的请勿用于批量下载、盗版传播等侵权用途。对于模块二音频处理FFmpeg是不二之选。这个开源音视频处理神器几乎能完成所有格式转换、提取、切割等操作。我们将使用它来从yt-dlp下载的容器中提取纯净的音频并转换为语音识别服务支持的格式如WAV、FLAC。对于模块三语音转文本这里有多个选择各有利弊开源本地方案如WhisperOpenAI。优点是免费、可离线、隐私性好。缺点是对硬件尤其是GPU有一定要求长音频转录速度可能较慢且准确率尤其是对于专业术语或口音可能略逊于顶级商业API。商业API方案如Google Cloud Speech-to-Text, Azure Speech Services, 阿里云、腾讯云等提供的ASR服务。优点是准确率高、速度快、有完善的SDK。缺点是会产生费用且需要处理网络请求。考虑到项目的易用性和“开箱即用”的特性我最终选择了OpenAI的Whisper API。原因如下1) 它基于强大的Whisper模型准确率有保障2) 按使用量计费对于个人偶尔使用的场景成本极低转录1小时音频约0.006美元3) API调用简单无需管理本地模型和计算资源。当然如果你非常注重隐私或希望零成本使用开源的whisper库本地运行是完全可行的替代方案。对于模块四文本总结自然选择了OpenAI的ChatGPT API如gpt-3.5-turbo或gpt-4。它的对话能力和文本理解/生成能力是目前完成摘要任务最合适的工具。我们可以通过设计特定的“系统提示词”System Prompt来引导AI按照我们想要的格式和深度进行总结。粘合剂整个流程使用Python编写脚本进行串联。Python在数据处理、API调用和自动化脚本方面生态完善是完成此类任务的最佳语言。3. 环境准备与核心依赖安装工欲善其事必先利其器。首先我们需要搭建好开发环境。3.1 基础工具安装安装FFmpegmacOS使用Homebrew最为方便。打开终端执行brew install ffmpeg。Ubuntu/Debiansudo apt update sudo apt install ffmpeg。Windows可以从 FFmpeg官网 下载编译好的可执行文件解压后将bin目录添加到系统的环境变量PATH中。或者在安装Chocolatey后使用choco install ffmpeg安装。安装完成后在终端输入ffmpeg -version能显示版本信息即表示成功。安装yt-dlp 这是一个Python包我们可以用pip安装。建议使用虚拟环境。pip install yt-dlp验证安装yt-dlp --version。3.2 Python环境与依赖库创建一个新的项目目录并初始化一个Python虚拟环境推荐mkdir youtube-summarizer cd youtube-summarizer python -m venv venv # 创建虚拟环境 # 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: venv\Scripts\activate安装必要的Python库pip install openai # 用于调用Whisper API和ChatGPT API pip install python-dotenv # 用于管理API密钥等环境变量 # yt-dlp 之前已经安装过了如果不在虚拟环境需要在这里再安装一次pip install yt-dlp3.3 获取并配置API密钥本项目需要OpenAI的API密钥。前往 OpenAI平台 登录后创建API Key。在项目根目录下创建一个名为.env的文件用于安全地存储密钥OPENAI_API_KEY你的实际API密钥重要安全提醒务必在.gitignore文件中加入.env切勿将包含真实密钥的.env文件提交到Git等版本控制系统。然后创建一个config.py文件来读取配置import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY) # 可以在这里定义其他配置如模型选择、输出目录等 OUTPUT_DIR ./outputs os.makedirs(OUTPUT_DIR, exist_okTrue) # 确保输出目录存在4. 核心功能模块实现详解接下来我们分步实现每个核心模块。我会提供完整的代码片段并解释关键点。4.1 模块实现下载YouTube音频我们创建一个download_audio.py文件。这里的关键是使用yt-dlp来获取最佳质量的纯音频流并用FFmpeg将其转换为适合ASR的格式。import yt_dlp import os from config import OUTPUT_DIR def download_youtube_audio(video_url: str, output_path: str OUTPUT_DIR) - str: 下载YouTube视频的音频并保存为MP3格式。 参数: video_url: YouTube视频的完整URL。 output_path: 音频文件保存目录。 返回: 下载的音频文件路径。 # 配置 yt-dlp 选项 ydl_opts { format: bestaudio/best, # 选择最佳音质 outtmpl: os.path.join(output_path, %(title)s.%(ext)s), # 输出模板使用视频标题作为文件名 postprocessors: [{ key: FFmpegExtractAudio, # 使用FFmpeg提取音频 preferredcodec: mp3, # 转换为MP3格式 preferredquality: 192, # 设置音频质量192kbps是个不错的平衡点 }], quiet: True, # 减少命令行输出 no_warnings: True, } try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: # 提取视频信息用于获取最终文件名 info_dict ydl.extract_info(video_url, downloadFalse) video_title info_dict.get(title, audio) # 执行下载 ydl.download([video_url]) # 构建预期的文件路径yt-dlp会根据outtmpl和postprocessor重命名文件 expected_filename f{video_title}.mp3 expected_path os.path.join(output_path, expected_filename) # 处理文件名中的非法字符Windows下尤其重要 safe_filename .join(c for c in expected_filename if c.isalnum() or c in ( , -, _)).rstrip() safe_path os.path.join(output_path, safe_filename) if os.path.exists(expected_path) and expected_path ! safe_path: os.rename(expected_path, safe_path) return safe_path elif os.path.exists(safe_path): return safe_path else: # 如果以上都不行尝试在目录中查找最新的mp3文件 mp3_files [f for f in os.listdir(output_path) if f.endswith(.mp3)] if mp3_files: latest_file max(mp3_files, keylambda f: os.path.getctime(os.path.join(output_path, f))) return os.path.join(output_path, latest_file) else: raise FileNotFoundError(音频文件下载后未找到。) except Exception as e: print(f下载音频时出错: {e}) raise if __name__ __main__: # 测试代码 test_url https://www.youtube.com/watch?vdQw4w9WgXcQ # 请替换为真实URL try: audio_path download_youtube_audio(test_url) print(f音频已下载至: {audio_path}) except Exception as e: print(f测试失败: {e})关键点解析postprocessors: 这是核心配置告诉yt-dlp在下载后调用FFmpeg进行转码。我们选择mp3格式是因为它通用且被大多数ASR服务支持。文件名处理YouTube视频标题可能包含/、:等操作系统路径非法字符必须进行清理否则保存文件会失败。上述代码提供了一个简单的清理方法。错误处理网络波动、视频不可用、格式不支持等情况都可能发生使用try-except进行包裹是必要的。4.2 模块实现调用Whisper API进行转录创建transcribe_audio.py文件。我们将使用OpenAI的Whisper API。需要注意的是Whisper API有文件大小限制25MB对于超长音频需要先进行切割。from openai import OpenAI import os from config import OPENAI_API_KEY, OUTPUT_DIR client OpenAI(api_keyOPENAI_API_KEY) def transcribe_audio(audio_file_path: str) - str: 使用OpenAI Whisper API将音频文件转录为文本。 参数: audio_file_path: 本地音频文件的路径。 返回: 转录得到的完整文本。 file_size os.path.getsize(audio_file_path) file_size_mb file_size / (1024 * 1024) if file_size_mb 25: print(f警告音频文件大小为 {file_size_mb:.2f} MB超过Whisper API 25MB限制。需要先进行切割。) # 此处应调用音频切割函数本例暂不展开后续会补充 # 简单策略可以用FFmpeg按固定时长如10分钟切割然后分批转录 return _transcribe_large_audio(audio_file_path) try: with open(audio_file_path, rb) as audio_file: transcript client.audio.transcriptions.create( modelwhisper-1, # 目前Whisper API只有这一个模型 fileaudio_file, response_formattext, # 也可以选择json、srt、vtt等格式 # languagezh, # 可选指定音频语言以提高准确性。不指定则自动检测。 # prompt以下是关于机器学习会议的讨论 # 可选提供上下文提示词有助于专有名词识别 ) return transcript except Exception as e: print(f调用Whisper API转录时出错: {e}) raise def _transcribe_large_audio(audio_file_path: str): 处理大音频文件的转录简易版示例。 # 这是一个复杂的功能完整实现需要 # 1. 使用FFmpeg将音频切割成多个小于25MB的片段。 # 2. 循环调用 transcribe_audio 或直接API处理每个片段。 # 3. 将各片段的转录结果按时间顺序拼接。 # 由于篇幅这里只给出概念提示。 print(大文件处理功能需额外实现。) # 临时方案先尝试压缩音频比特率以减小文件大小 compressed_path audio_file_path.replace(.mp3, _compressed.mp3) # 使用FFmpeg命令压缩ffmpeg -i input.mp3 -b:a 64k output.mp3 (比特率越低文件越小但音质越差) # 如果压缩后仍大于25MB则必须切割。 return if __name__ __main__: # 假设已有下载好的音频文件 test_audio ./outputs/你的测试音频.mp3 if os.path.exists(test_audio): text transcribe_audio(test_audio) print(转录结果预览前500字符:) print(text[:500]) # 保存转录文本 transcript_path test_audio.replace(.mp3, _transcript.txt) with open(transcript_path, w, encodingutf-8) as f: f.write(text) print(f完整转录文本已保存至: {transcript_path}) else: print(f测试音频文件不存在: {test_audio})实操心得语言指定如果明确知道视频语言在API调用中加上languagezh中文或languageen英文等参数可以显著提高转录准确率尤其是对于专业术语。提示词Promptprompt参数非常有用。你可以提供一段视频开头可能出现的文本或者描述视频主题如“这是一个关于Python异步编程的教程”这能帮助模型更好地识别专有名词和特定语境下的词汇。大文件处理这是实际应用中的一个关键挑战。上述代码给出了提示。一个稳健的方案是先用FFmpeg按固定时长如600秒切割音频生成多个临时文件循环转录最后拼接文本。务必记得清理临时文件。4.3 模块实现调用ChatGPT API生成摘要这是项目的“大脑”。我们通过精心设计的提示词Prompt Engineering来引导GPT生成高质量的摘要。创建generate_summary.py。from openai import OpenAI import os from config import OPENAI_API_KEY client OpenAI(api_keyOPENAI_API_KEY) def summarize_text_with_gpt(transcript_text: str, model: str gpt-3.5-turbo) - str: 使用ChatGPT API对转录文本进行总结。 参数: transcript_text: 完整的转录文本。 model: 使用的OpenAI模型默认为 gpt-3.5-turbo对摘要任务性价比较高。 返回: 结构化摘要文本。 # 系统提示词 - 定义AI的角色和任务 system_prompt 你是一个专业的视频内容分析师。你的任务是根据提供的视频转录文本生成一份清晰、准确、结构化的摘要。 摘要必须包含以下部分 1. **核心主题**用一句话概括视频的核心内容。 2. **详细要点总结**分条列出视频中讨论的关键点、步骤或论点。尽量详细但不要直接复制原文要进行归纳提炼。 3. **关键结论或收获**总结视频最后得出的结论或者观众可以从中学到的最重要的东西。 4. **适用人群/场景**简要说明这个视频内容最适合哪类人群或在什么场景下最有参考价值。 请使用中文输出。确保摘要逻辑流畅重点突出便于快速阅读。 # 用户消息 - 提供具体的转录文本 # 注意如果文本过长需要截断。GPT模型有上下文长度限制例如gpt-3.5-turbo是16385个token。 max_tokens_for_input 12000 # 预留一些token给输出和系统提示 if len(transcript_text) max_tokens_for_input * 3.5: # 粗略估算1个token约等于3.5个英文字符或1.5个中文字符 print(f警告转录文本过长将进行截断。原长度: {len(transcript_text)} 字符) transcript_text transcript_text[:int(max_tokens_for_input * 3.5)] user_message f以下是一个视频的完整转录文本\n\n{transcript_text} try: response client.chat.completions.create( modelmodel, messages[ {role: system, content: system_prompt}, {role: user, content: user_message} ], temperature0.3, # 较低的温度使输出更确定、更聚焦适合总结性任务 max_tokens1500, # 控制摘要的长度 ) summary response.choices[0].message.content return summary.strip() except Exception as e: print(f调用ChatGPT API生成摘要时出错: {e}) raise def analyze_text_with_custom_prompt(transcript_text: str, custom_instruction: str) - str: 根据自定义指令分析文本。例如可以要求生成QA、提取行动项、翻译等。 参数: transcript_text: 转录文本。 custom_instruction: 给AI的自定义分析指令。 返回: 分析结果。 system_prompt f你是一个得力的分析助手。请严格按照用户的要求处理接下来的文本。用户的要求是{custom_instruction} max_tokens_for_input 12000 if len(transcript_text) max_tokens_for_input * 3.5: transcript_text transcript_text[:int(max_tokens_for_input * 3.5)] user_message f需要分析的文本内容如下\n\n{transcript_text} try: response client.chat.completions.create( modelgpt-3.5-turbo, messages[ {role: system, content: system_prompt}, {role: user, content: user_message} ], temperature0.5, max_tokens2000, ) analysis response.choices[0].message.content return analysis.strip() except Exception as e: print(f自定义分析时出错: {e}) raise if __name__ __main__: # 测试读取一个转录文件并生成摘要 transcript_file ./outputs/你的测试音频_transcript.txt if os.path.exists(transcript_file): with open(transcript_file, r, encodingutf-8) as f: transcript f.read() print(正在生成摘要...) summary summarize_text_with_gpt(transcript) print(\n 生成的摘要 \n) print(summary) # 保存摘要 summary_path transcript_file.replace(_transcript.txt, _summary.txt) with open(summary_path, w, encodingutf-8) as f: f.write(summary) print(f\n摘要已保存至: {summary_path}) # 示例自定义分析 - 生成5个可能的问答对 print(\n正在生成QA...) qa_prompt 请根据文本内容生成5个观众最可能提出的问题并给出准确的答案。 qa_result analyze_text_with_custom_prompt(transcript, qa_prompt) print(\n 生成的QA \n) print(qa_result) else: print(f转录文件不存在: {transcript_file})提示词设计心得系统提示词System Prompt是灵魂它定义了AI的“角色”和“任务框架”。上面的示例要求AI输出一个结构化的摘要包含四个部分。你可以根据需要调整比如要求用Markdown格式输出、包含时间戳、提炼出三个最重要的行动步骤等。控制长度与成本max_tokens参数控制AI回复的最大长度直接影响API调用成本和摘要的详细程度。temperature参数控制创造性总结任务建议设置在0.2-0.5之间让输出更稳定。处理长文本GPT模型有上下文窗口限制。如果转录文本非常长例如超过10000个token你需要进行截断。更高级的策略是使用“Map-Reduce”方法先将长文本分割成块让AI分别总结每个块Map然后再让AI对所有块的总结进行二次总结Reduce。这能处理更长的文档但API调用次数和成本会翻倍。5. 串联整合与自动化脚本现在我们把各个模块像拼积木一样组合起来创建一个主程序main.py实现从URL到摘要的一键操作。import argparse import os from download_audio import download_youtube_audio from transcribe_audio import transcribe_audio from generate_summary import summarize_text_with_gpt, analyze_text_with_custom_prompt from config import OUTPUT_DIR def main(): parser argparse.ArgumentParser(descriptionYouTube视频智能摘要生成器) parser.add_argument(url, typestr, helpYouTube视频的URL) parser.add_argument(--custom-task, typestr, defaultNone, help自定义分析任务例如“提取所有提到的工具名称”或“生成一份会议纪要”) parser.add_argument(--keep-audio, actionstore_true, help处理完成后保留音频文件) parser.add_argument(--keep-transcript, actionstore_true, help处理完成后保留转录文本文件) args parser.parse_args() video_url args.url print(f开始处理视频: {video_url}) # 步骤1下载音频 print(步骤1/3正在下载音频...) try: audio_path download_youtube_audio(video_url, OUTPUT_DIR) print(f 音频已保存: {os.path.basename(audio_path)}) except Exception as e: print(f 音频下载失败: {e}) return # 步骤2转录音频为文本 print(步骤2/3正在转录音频...) try: transcript_text transcribe_audio(audio_path) transcript_path audio_path.replace(.mp3, _transcript.txt) with open(transcript_path, w, encodingutf-8) as f: f.write(transcript_text) print(f 转录完成文本长度: {len(transcript_text)} 字符) print(f 转录文本已保存: {os.path.basename(transcript_path)}) except Exception as e: print(f 音频转录失败: {e}) # 即使转录失败也尝试清理音频文件如果不需要保留 if not args.keep_audio and os.path.exists(audio_path): os.remove(audio_path) return # 步骤3生成摘要或自定义分析 print(步骤3/3正在生成内容摘要...) try: if args.custom_task: print(f 执行自定义任务: {args.custom_task}) result analyze_text_with_custom_prompt(transcript_text, args.custom_task) result_path audio_path.replace(.mp3, f_custom_{hash(args.custom_task) % 10000:04d}.txt) else: result summarize_text_with_gpt(transcript_text) result_path audio_path.replace(.mp3, _summary.txt) with open(result_path, w, encodingutf-8) as f: f.write(result) print(f 处理完成) print(f 结果已保存: {os.path.basename(result_path)}) print(\n *50) print(result[:1000]) # 预览前1000个字符 print(*50) except Exception as e: print(f 文本分析失败: {e}) finally: # 清理中间文件根据参数决定 if not args.keep_audio and os.path.exists(audio_path): os.remove(audio_path) print(f 已清理音频文件: {os.path.basename(audio_path)}) if not args.keep_transcript and transcript_path in locals() and os.path.exists(transcript_path): os.remove(transcript_path) print(f 已清理转录文件: {os.path.basename(transcript_path)}) if __name__ __main__: main()现在你可以在命令行中运行这个工具了python main.py https://www.youtube.com/watch?v你的视频ID如果想保留中间文件以便调试python main.py 视频URL --keep-audio --keep-transcript如果想执行自定义任务比如提取提到的所有代码库python main.py 视频URL --custom-task 请列出文本中提到的所有软件库、框架或工具的名称并简要说明其用途。6. 常见问题、优化与扩展思路在实际搭建和使用过程中你肯定会遇到各种问题。下面是我总结的一些常见坑点和优化方向。6.1 常见问题与解决方案问题可能原因解决方案yt-dlp下载失败报错“Unable to download webpage”1. 网络连接问题。2. YouTube页面结构变化yt-dlp需要更新。3. 视频可能被区域限制或需要登录。1. 检查网络尝试使用代理需合规合法。2. 运行pip install -U yt-dlp更新到最新版。3. 尝试在ydl_opts中添加cookiefile: cookies.txt需导出浏览器cookies。Whisper API 返回错误 “File upload size limit exceeded”音频文件大于25MB。实现音频切割功能见4.2节提示或先使用FFmpeg压缩音频比特率ffmpeg -i input.mp3 -b:a 64k output.mp3。ChatGPT API 返回错误 “context length exceeded”转录文本太长超过了模型的上下文窗口。1.截断在调用API前简单截断文本会丢失尾部信息。2.Map-Reduce实现更复杂的“分割-总结-再总结”流程。3. 使用具有更长上下文窗口的模型如gpt-3.5-turbo-16k或gpt-4-32k成本更高。转录结果中专业术语错误多Whisper模型可能不熟悉特定领域的词汇。1. 在调用Whisper API时使用prompt参数提供一些相关术语或背景。2. 对于极度重要的项目可以考虑使用本地微调过的Whisper模型或者使用更专业的ASR服务如针对医疗、法律领域的。摘要内容空洞抓不住重点系统提示词Prompt设计得不够好。迭代优化你的Prompt。尝试1. 让AI扮演更具体的角色如“资深软件架构师”。2. 要求更具体的输出格式如“用Markdown表格列出五个核心要点”。3. 提供例子Few-shot Prompting。运行速度慢1. 下载和转录是主要耗时环节。2. 网络延迟。1. 对于超长视频切割后并行调用Whisper API可以加速转录注意API速率限制。2. 本地部署Whisper模型可以避免网络延迟但需要GPU资源。6.2 性能与成本优化缓存策略对于同一个视频URL可以将其MD5哈希值作为键将音频文件路径、转录文本、摘要结果缓存起来例如用SQLite数据库。下次请求时先检查缓存避免重复下载和调用API节省时间和费用。异步处理对于需要处理大量视频的场景可以将主脚本改造成异步或使用任务队列如Celery提高吞吐量。模型选择转录Whisper API目前只有一种模型性价比很高。如果成本敏感且对精度要求不高可以研究开源的faster-whisperCTranslate2实现速度更快。摘要gpt-3.5-turbo是性价比之王。如果摘要质量要求极高可以尝试gpt-4但成本是前者的15-30倍。对于简单的提取任务甚至可以用更便宜的gpt-3.5-turbo-instruct模型。Token精打细算在调用ChatGPT API前可以先用简单的规则如去除过多的空格、换行符或算法如用Tiktoken库精确计算预处理文本确保不超出限制避免浪费。6.3 功能扩展方向这个基础框架有很大的扩展潜力支持多平台修改download_audio模块使其支持B站、优酷等平台的视频音频提取需研究各平台协议注意合法性。图形化界面GUI使用PyQt、Tkinter或Streamlit快速构建一个桌面或Web界面让非技术用户也能方便使用。摘要类型多样化除了整体摘要可以预设多种分析模板如“生成思维导图大纲”、“提炼金句”、“提取待办事项”、“进行正反方观点总结”等供用户选择。输出格式丰富化不仅输出文本还可以让AI生成Markdown、HTML甚至调用文本转语音TTSAPI生成摘要的音频版本。集成与自动化将本工具集成到你的笔记软件如Obsidian、Notion或知识管理系统中实现“收藏视频 - 自动生成摘要并归档”的自动化流程。6.4 我踩过的一个大坑音频编码与API兼容性有一次我下载了一个视频yt-dlp默认将其音频转成了opus编码的ogg格式。虽然Whisper API官方支持多种格式但在实际调用时却一直报错。折腾了好久才发现某些编码参数的ogg文件兼容性有问题。解决方案在yt-dlp的postprocessors中明确指定转码为mp3或wav格式并指定一个通用的采样率和比特率。将之前的配置修改为更稳定的版本postprocessors: [{ key: FFmpegExtractAudio, preferredcodec: mp3, preferredquality: 192, # 添加以下参数确保兼容性 preferredopts: -ar 16000 -ac 1 # 重采样为16kHz单声道很多ASR服务推荐此格式 }],-ar 16000将采样率设为16kHz-ac 1设为单声道。这不仅能减少文件大小而且是一些语音识别引擎包括Whisper处理效果更好的格式。