Schwertlilien
As a recoder: notes and ideas.

2025-8-19

有关于ts的一些知识,我完全小白,完全不了解555.

回调函数是什么?

回调函数是一种特殊的函数,它被作为参数传递给另一个函数,然后在该函数内部特定时机被调用。回调函数常用于处理异步操作(如网络请求、文件读写、定时器等),使代码能够在异步操作完成后得到通知并执行相应逻辑。

回调函数的主要特点:

  1. 作为参数传递给其他函数
  2. 在特定事件或条件满足时被调用
  3. 常用于处理异步操作的结果
  4. 可以访问调用它的函数作用域中的变量

为什么要使用回调函数?

  1. 处理异步操作 :当你需要执行一个需要时间的操作(如网络请求、文件读写、定时任务),不能让程序一直等待,这时候可以用回调函数在操作完成后通知你。
  2. 事件处理 :当用户点击按钮、输入文本等事件发生时,系统会调用你提供的回调函数。
  3. 代码复用 :将变化的部分作为回调函数,固定的逻辑放在主函数中。

回调函数的常见形式

  1. 普通函数形式
  2. 匿名函数形式
  3. 箭头函数形式(最常见,如代码中的 (err, response, metadata) => {…} )

回调函数的基本格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义一个接受回调函数的函数
function doSomething(callback: () => void) {
// 做一些事情
console.log("准备调用回调函数");
// 调用回调函数
callback();
}

// 定义回调函数
function myCallback() {
console.log("回调函数被调用了");
}

// 使用
doSomething(myCallback);

Promise 是什么?为什么要使用它? Promise 的概念

Promise 是 JavaScript/TypeScript 中处理 异步操作 的一种机制。它代表一个异步操作的 最终完成(或失败) 及其 结果值 。

Promise 有三种状态:

  1. pending : 进行中(初始状态)
  2. fulfilled : 操作成功完成
  3. rejected : 操作失败

为什么要使用 Promise?

  1. 解决回调地狱 :传统回调式异步代码容易嵌套过深(回调地狱),Promise 用链式调用让代码更清晰
  2. 统一错误处理 :可以用 catch 统一处理异步操作中的错误
  3. 支持 async/await :Promise 是 async/await 语法的基础,让异步代码更像同步代码
  4. 更好的代码组织 :分离异步操作的成功和失败处理逻辑

为什么要”转换成 Promise”?
代码中的 notifier.notify 是一个基于回调的异步函数。通过将其包装在 Promise 中,我们可以:

  • 使用 await 语法调用这个函数(因为 askPermission 是 async 函数)
  • 避免回调嵌套,让代码更易读
  • 统一错误处理方式

代码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
return new Promise((resolve) => { // (resolve) => {...} :一个箭头函数,作为Promise的参数,resolve :是Promise提供的一个函数,用于将Promise标记为"成功"并返回结果
notifier.notify({
title: 'FFmpeg Processor Permission Request', // 通知标题
message: `${action}`, // 通知消息,使用模板字符串插入变量
wait: true, // 等待用户响应
timeout: 60, // 超时时间60秒
actions: 'Allow', // 允许按钮文本
closeLabel: 'Deny' // 拒绝按钮文本
}, (err, response, metadata) => {
if (err) {
console.error('Error showing notification:', err); // 打印错误
resolve(false); // 将Promise结果设为false
return; // 退出回调函数
}

const buttonPressed = metadata?.activationValue || response; // 获取用户点击的按钮
resolve(buttonPressed !== 'Deny'); // 如果不是拒绝,返回true
});
});

My server

image-20250819164031548

功能概述

已完成一个功能完整的视频处理服务,能够实现以下功能:

  1. 上传视频文件或解析视频URL
  2. 使用ffmpeg从视频中提取音频
  3. 将音频发送到OpenAI Whisper API进行转录,获取带时间戳的文本
  4. 对转录文本进行分段摘要生成
  5. 返回JSON格式结果,包含原始转录和摘要的时间范围信息

实现思路与技术选择

1. 整体架构

  • 使用FastMCP创建MCP服务器,提供RPC接口
  • 采用异步编程模型(async/await)提高并发处理能力
  • 模块化设计,将功能拆分为独立函数
  • 使用Pydantic模型确保数据格式一致性

2. 核心模块实现

视频处理模块

1
2
3
async def extract_audio(video_path: str) -> str:
# 使用ffmpeg从视频中提取音频
# 返回音频文件路径
  • 使用asyncio.create_subprocess_exec异步调用ffmpeg
  • 配置音频参数为16kHz采样率、单声道,适合ASR处理
  • 错误处理确保稳定性

音频转录模块

1
2
3
async def transcribe_audio_with_timestamps(audio_path: str, language: str = "zh") -> List[TranscriptionSegment]:
# 调用OpenAI Whisper API进行转录
# 返回带时间戳的转录片段列表
  • 使用response_format="verbose_json"获取详细时间戳信息
  • 封装为TranscriptionSegment模型,包含开始时间、结束时间和文本

摘要生成模块

1
2
3
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TranscriptionSegment(BaseModel):
start_time: float # 开始时间(秒)
end_time: float # 结束时间(秒)
text: str # 转录文本

class SummarySegment(BaseModel):
start_time: float # 对应视频开始时间(秒)
end_time: float # 对应视频结束时间(秒)
summary: str # 摘要文本

class ProcessVideoResponse(BaseModel):
transcription_segments: List[TranscriptionSegment]
summary_segments: List[SummarySegment]
full_transcription: str
full_summary: str
  • 使用Pydantic模型确保数据结构一致性
  • 提供清晰的类型注解
  • 方便序列化和反序列化JSON

使用方法

1. 环境变量配置

  • OPENAI_API_KEY: 必需,OpenAI API密钥
  • OPENAI_BASE_URL: 可选,API基础URL
  • OPENAI_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"code": 200,
"msg": "成功",
"data": {
"transcription_segments": [
{
"start_time": 0.0,
"end_time": 5.2,
"text": "这是第一段视频的转录文本"
},
...
],
"summary_segments": [
{
"start_time": 0.0,
"end_time": 10.5,
"summary": "这段视频介绍了..."
},
...
],
"full_transcription": "[0.00s-5.20s] 这是第一段视频的转录文本\n...",
"full_summary": "[0.00s-10.50s] 这段视频介绍了...\n..."
}
}

技术特点

  1. 异步处理: 充分利用Python异步特性,提高并发处理能力
  2. 类型安全: 使用Pydantic和类型注解确保类型安全
  3. 错误处理: 完善的异常捕获和错误信息返回
  4. 资源管理: 自动清理临时文件,避免资源泄露
  5. 模块化设计: 功能分离,便于维护和扩展
  6. 标准化响应: 统一的响应格式,便于客户端处理
搜索
匹配结果数:
未搜索到匹配的文章。