2025-8-19
有关于ts的一些知识,我完全小白,完全不了解555.
回调函数是什么?
回调函数是一种特殊的函数,它被作为参数传递给另一个函数,然后在该函数内部特定时机被调用。回调函数常用于处理异步操作(如网络请求、文件读写、定时器等),使代码能够在异步操作完成后得到通知并执行相应逻辑。
回调函数的主要特点:
- 作为参数传递给其他函数
- 在特定事件或条件满足时被调用
- 常用于处理异步操作的结果
- 可以访问调用它的函数作用域中的变量
为什么要使用回调函数?
- 处理异步操作 :当你需要执行一个需要时间的操作(如网络请求、文件读写、定时任务),不能让程序一直等待,这时候可以用回调函数在操作完成后通知你。
- 事件处理 :当用户点击按钮、输入文本等事件发生时,系统会调用你提供的回调函数。
- 代码复用 :将变化的部分作为回调函数,固定的逻辑放在主函数中。
回调函数的常见形式:
- 普通函数形式
- 匿名函数形式
- 箭头函数形式(最常见,如代码中的 (err, response, metadata) => {…} )
回调函数的基本格式
1 | // 定义一个接受回调函数的函数 |
Promise 是什么?为什么要使用它? Promise 的概念
Promise 是 JavaScript/TypeScript 中处理 异步操作 的一种机制。它代表一个异步操作的 最终完成(或失败) 及其 结果值 。
Promise 有三种状态:
- pending : 进行中(初始状态)
- fulfilled : 操作成功完成
- rejected : 操作失败
为什么要使用 Promise?
- 解决回调地狱 :传统回调式异步代码容易嵌套过深(回调地狱),Promise 用链式调用让代码更清晰
- 统一错误处理 :可以用 catch 统一处理异步操作中的错误
- 支持 async/await :Promise 是 async/await 语法的基础,让异步代码更像同步代码
- 更好的代码组织 :分离异步操作的成功和失败处理逻辑
为什么要”转换成 Promise”?
代码中的 notifier.notify 是一个基于回调的异步函数。通过将其包装在 Promise 中,我们可以:
- 使用 await 语法调用这个函数(因为 askPermission 是 async 函数)
- 避免回调嵌套,让代码更易读
- 统一错误处理方式
代码参考
1 | return new Promise((resolve) => { // (resolve) => {...} :一个箭头函数,作为Promise的参数,resolve :是Promise提供的一个函数,用于将Promise标记为"成功"并返回结果 |
My server
功能概述
已完成一个功能完整的视频处理服务,能够实现以下功能:
- 上传视频文件或解析视频URL
- 使用ffmpeg从视频中提取音频
- 将音频发送到OpenAI Whisper API进行转录,获取带时间戳的文本
- 对转录文本进行分段摘要生成
- 返回JSON格式结果,包含原始转录和摘要的时间范围信息
实现思路与技术选择
1. 整体架构
- 使用
FastMCP
创建MCP服务器,提供RPC接口 - 采用异步编程模型(
async/await
)提高并发处理能力 - 模块化设计,将功能拆分为独立函数
- 使用Pydantic模型确保数据格式一致性
2. 核心模块实现
视频处理模块
1 | async def extract_audio(video_path: str) -> str: |
- 使用
asyncio.create_subprocess_exec
异步调用ffmpeg - 配置音频参数为16kHz采样率、单声道,适合ASR处理
- 错误处理确保稳定性
音频转录模块
1 | async def transcribe_audio_with_timestamps(audio_path: str, language: str = "zh") -> List[TranscriptionSegment]: |
- 使用
response_format="verbose_json"
获取详细时间戳信息 - 封装为
TranscriptionSegment
模型,包含开始时间、结束时间和文本
摘要生成模块
1 | async def generate_summary_with_timestamps(segments: List[TranscriptionSegment], max_length: int = 150, min_length: int = 50) -> List[SummarySegment]: |
- 使用GPT模型对转录文本进行摘要生成
- 精心设计提示词,要求模型返回JSON格式并保留时间戳信息
- 解析模型输出并转换为
SummarySegment
模型
MCP工具接口
process_video_with_timestamps
: 处理本地视频文件process_video_url_with_timestamps
: 处理视频URL(使用yt-dlp下载)
3. 数据模型设计
1 | class TranscriptionSegment(BaseModel): |
- 使用Pydantic模型确保数据结构一致性
- 提供清晰的类型注解
- 方便序列化和反序列化JSON
使用方法
1. 环境变量配置
OPENAI_API_KEY
: 必需,OpenAI API密钥OPENAI_BASE_URL
: 可选,API基础URLOPENAI_MODEL
: 可选,转录模型(默认whisper-1)SUMMARY_MODEL
: 可选,摘要模型(默认gpt-3.5-turbo-1106)FFMPEG_PATH
: 可选,ffmpeg路径(默认ffmpeg)
2. 启动服务
1 | python video_transcription_with_timestamps.py |
3. 调用服务
- 处理本地视频: 调用
process_video_with_timestamps
工具,传入video_path
参数 - 处理视频URL: 调用
process_video_url_with_timestamps
工具,传入video_url
参数
4. 返回结果示例
1 | { |
技术特点
- 异步处理: 充分利用Python异步特性,提高并发处理能力
- 类型安全: 使用Pydantic和类型注解确保类型安全
- 错误处理: 完善的异常捕获和错误信息返回
- 资源管理: 自动清理临时文件,避免资源泄露
- 模块化设计: 功能分离,便于维护和扩展
- 标准化响应: 统一的响应格式,便于客户端处理