当前位置: 首页 > article >正文

【AI 项目 Python 】文档与日志规范:从代码注释到生产追踪的工程实践

文章目录AI 项目 Python 文档与日志规范从代码注释到生产追踪的工程实践一、引言二、Docstring 规范代码即文档2.1 三种主流风格对比2.2 Google Style 完整示例2.3 类型注解规范三、项目级文档体系3.1 AI 项目推荐目录结构3.2 README 最小必要元素模型性能截至 2026-04-27依赖4.4 AI 项目关键日志点4.5 Loguru快速原型首选五、AI 专项追踪实验与模型版本管理5.1 实验配置版本化YAML5.2 模型元数据记录六、日志分级使用规范七、总结AI 项目 Python 文档与日志规范从代码注释到生产追踪的工程实践一、引言亲爱的朋友们创作不容易若对您有帮助的话请点赞收藏加关注哦您的关注是我持续创作的动力谢谢大家有问题请私信或联系邮箱jasonai.fngmail.comAI 项目有一个独特的工程难题模型是黑箱过程是随机的复现是奢侈品。一个没有完善文档和日志的 AI 项目往往在三个月后连作者自己都看不懂——某次训练为什么用了这组超参数线上推理的某个异常到底发生在预处理还是模型内部数据集版本和模型版本是否对齐这些问题的答案不在模型权重里在文档和日志里。本文从Python Docstring 规范、项目级文档体系、结构化日志、AI 专项追踪四个维度结合真实代码示例给出一套可直接落地的 AI 项目文档与日志工程规范。二、Docstring 规范代码即文档2.1 三种主流风格对比Python 社区存在三种 Docstring 格式AI 项目各有侧重风格代表工具特点推荐场景Google StyleSphinx Napoleon可读性最强结构清晰应用层代码、Agent、PipelineNumPy StyleSphinx Napoleon参数描述详尽适合多参数模型层、数学计算函数reStructuredTextSphinx 原生历史最悠久IDE 支持广老项目维护推荐选择Google StyleAI 项目中函数参数通常含类型注解Google Style 与 PEP 484 类型提示配合最自然。2.2 Google Style 完整示例fromtypingimportOptionalimportnumpyasnpdefpreprocess_text(text:str,max_length:int512,truncation:boolTrue,lowercase:boolFalse,)-dict[str,list[int]]:对原始文本进行分词预处理返回模型输入格式。 对输入文本执行清洗、截断和编码输出符合 Transformer 输入规范的 token_ids 和 attention_mask。截断策略为从右侧截断保留前缀语义。 Args: text: 待处理的原始文本字符串不应为空。 max_length: token 序列最大长度超出部分将被截断。默认 512。 truncation: 是否启用截断。设为 False 时 max_length 不生效。 lowercase: 是否将文本转为小写后再编码。对大小写敏感任务应设为 False。 Returns: 包含以下键的字典 - token_ids: token ID 列表长度 max_length。 - attention_mask: 与 token_ids 等长的掩码列表1 表示有效 token。 Raises: ValueError: text 为空字符串时抛出。 RuntimeError: 底层分词器未初始化时抛出。 Example: result preprocess_text(Hello World, max_length8) result[token_ids] [101, 7592, 2088, 102] ifnottext:raiseValueError(text 不能为空字符串)# 实现略...classEmbeddingModel:基于 Transformer 的文本嵌入模型封装。 封装预训练 Transformer 模型提供批量文本嵌入计算能力。 支持 GPU 加速内部使用均值池化策略生成句子级向量。 Attributes: model_name: 当前加载的预训练模型名称。 device: 模型运行设备cpu 或 cuda。 embedding_dim: 输出嵌入向量维度。 Example: model EmbeddingModel(sentence-transformers/all-MiniLM-L6-v2) vecs model.encode([Hello, World]) vecs.shape (2, 384) def__init__(self,model_name:str,device:strauto)-None:初始化嵌入模型。 Args: model_name: Hugging Face Hub 上的模型标识符或本地路径。 device: 运行设备。auto 时自动选择 GPU若可用。 ...defencode(self,texts:list[str],batch_size:int32,normalize:boolTrue,)-np.ndarray:批量计算文本嵌入向量。 Args: texts: 待编码的文本列表不应包含空字符串。 batch_size: 单批处理文本数量影响显存占用。 normalize: 是否对输出向量进行 L2 归一化。 Returns: 形状为 (len(texts), embedding_dim) 的 float32 数组。 ...2.3 类型注解规范fromtypingimportAnyfromcollections.abcimportIterator,Callable# 推荐Python 3.10 原生语法defload_dataset(path:str,split:strtrain)-list[dict[str,Any]]:...# 可选参数defget_model(name:str,revision:str|NoneNone)-BaseModel:...# 回调函数类型deftrain(on_epoch_end:Callable[[int,float],None]|NoneNone)-None:...# 生成器defstream_tokens(text:str)-Iterator[str]:...三、项目级文档体系3.1 AI 项目推荐目录结构my-ai-project/ ├── README.md # 项目概览、快速启动 ├── docs/ │ ├── architecture.md # 系统架构与数据流 │ ├── data.md # 数据集版本、字段说明、处理流程 │ ├── models.md # 模型版本、超参数记录、基准对比 │ ├── api.md # 对外接口文档若有 │ └── runbook.md # 生产运维手册部署、回滚、告警响应 ├── configs/ │ └── train_v2.yaml # 实验配置版本化管理 ├── src/ │ └── ... └── CHANGELOG.md # 版本变更记录3.2 README 最小必要元素# 项目名称 一句话描述这个项目解决什么问题对谁有用。 ## 快速启动 bash pip install -r requirements.txt python train.py --config configs/train_v2.yaml模型性能截至 2026-04-27数据集AccuracyF1模型版本Test-A92.3%91.8v2.1依赖Python 3.12PyTorch 2.3CUDA 12.1可选CPU 模式可用--- ## 四、结构化日志规范 ### 4.1 为什么 AI 项目需要结构化日志 普通文本日志在单机调试够用但在以下场景会失效 - 分布式训练多进程/多节点日志混杂 - 生产推理需要按 request_id 追踪一次推理的完整链路 - 异常分析需要从海量日志中过滤特定模型版本的错误 **结构化日志**JSON 格式让日志变成可查询的数据每条记录都是包含固定字段的字典可直接接入 ELK、Loki、CloudWatch 等日志系统。 ### 4.2 三种工具对比 | 工具 | 特点 | 推荐场景 | |------|------|---------| | **标准库 logging** | 零依赖配置灵活生态完整 | 通用项目、库代码 | | **Loguru** | 极简 API自动轮转彩色输出 | 脚本、小型服务、快速原型 | | **structlog** | 原生结构化与 logging 兼容处理器链可定制 | 生产微服务、需要 JSON 输出 | ### 4.3 标准库 logging生产级配置 python import logging import logging.config import json from datetime import datetime, timezone class JSONFormatter(logging.Formatter): 将日志记录序列化为 JSON 行格式便于日志系统采集。 def format(self, record: logging.LogRecord) - str: log_obj { timestamp: datetime.now(timezone.utc).isoformat(), level: record.levelname, logger: record.name, message: record.getMessage(), module: record.module, line: record.lineno, } # 透传额外的上下文字段如 request_id、model_version for key, value in record.__dict__.items(): if key not in logging.LogRecord.__dict__ and not key.startswith(_): log_obj[key] value if record.exc_info: log_obj[exception] self.formatException(record.exc_info) return json.dumps(log_obj, ensure_asciiFalse) def setup_logging(level: str INFO, json_output: bool True) - None: 初始化项目日志配置应在程序入口处调用一次。 formatter JSONFormatter() if json_output else logging.Formatter( %(asctime)s [%(levelname)s] %(name)s: %(message)s ) handler logging.StreamHandler() handler.setFormatter(formatter) root logging.getLogger() root.setLevel(level) root.addHandler(handler) # 在模块中获取 logger推荐用 __name__保留调用链信息 logger logging.getLogger(__name__)4.4 AI 项目关键日志点importloggingimporttimefromcontextlibimportcontextmanager loggerlogging.getLogger(__name__)# ① 训练循环日志deftrain_epoch(model,dataloader,optimizer,epoch:int)-dict:logger.info(训练 epoch 开始,extra{epoch:epoch,num_batches:len(dataloader)},)total_loss0.0forstep,batchinenumerate(dataloader):lossmodel.training_step(batch)optimizer.step()total_lossloss.item()ifstep%1000:logger.info(训练步骤,extra{epoch:epoch,step:step,loss:round(loss.item(),4),lr:optimizer.param_groups[0][lr],},)metrics{epoch:epoch,avg_loss:total_loss/len(dataloader)}logger.info(训练 epoch 完成,extrametrics)returnmetrics# ② 推理请求日志生产关键路径contextmanagerdefinference_context(request_id:str,model_version:str):为单次推理请求注入追踪上下文。starttime.perf_counter()logger.info(推理请求开始,extra{request_id:request_id,model_version:model_version},)try:yieldelapsed(time.perf_counter()-start)*1000logger.info(推理请求完成,extra{request_id:request_id,model_version:model_version,latency_ms:round(elapsed,2),},)exceptExceptionase:elapsed(time.perf_counter()-start)*1000logger.error(推理请求失败,exc_infoTrue,extra{request_id:request_id,model_version:model_version,latency_ms:round(elapsed,2),error_type:type(e).__name__,},)raise# ③ 数据处理日志defload_dataset(path:str,version:str)-list:logger.info(加载数据集,extra{path:path,version:version},)try:data_load(path)logger.info(数据集加载完成,extra{version:version,num_samples:len(data)},)returndataexceptFileNotFoundError:logger.error(数据集文件不存在,extra{path:path,version:version},)raise4.5 Loguru快速原型首选fromloguruimportloggerimportsys# 配置控制台彩色输出 文件自动轮转logger.remove()# 移除默认 handlerlogger.add(sys.stdout,formatgreen{time:YYYY-MM-DD HH:mm:ss}/green | level{level}/level | {message},levelINFO,)logger.add(logs/app_{time:YYYY-MM-DD}.log,rotation100 MB,# 超过 100MB 自动轮转retention30 days,# 保留 30 天compressiongz,# 压缩归档levelDEBUG,serializeTrue,# JSON 格式输出到文件)# 使用与标准 logging 接口一致logger.info(模型加载完成,modelgpt-4o-mini,devicecuda:0)logger.bind(request_idabc123).info(推理开始)# 自动捕获异常上下文logger.catchdefrisky_inference(input_text:str)-str:# 任何未捕获异常都会被 loguru 记录完整堆栈后重新抛出...五、AI 专项追踪实验与模型版本管理5.1 实验配置版本化YAML# configs/train_v2.1.yaml# 每次实验修改配置文件并提交 git保证可复现experiment:name:sentiment-v2.1description:增加数据增强调整 dropoutauthor:jasondate:2026-04-27model:backbone:bert-base-chinesenum_labels:3dropout:0.15# v2.0 为 0.1本次调整data:train_path:data/train_v3.jsonlval_path:data/val_v3.jsonldataset_version:v3.0max_length:256training:epochs:10batch_size:32learning_rate:2.0e-5warmup_ratio:0.1seed:42importyamlimporthashlibimportjsondefload_config(path:str)-dict:withopen(path)asf:configyaml.safe_load(f)# 计算配置哈希写入日志便于溯源config_hashhashlib.md5(json.dumps(config,sort_keysTrue).encode()).hexdigest()[:8]logger.info(实验配置加载,extra{config_path:path,config_hash:config_hash})returnconfig5.2 模型元数据记录importjsonfrompathlibimportPathfromdatetimeimportdatetime,timezonedefsave_model_metadata(save_dir:str,config:dict,metrics:dict,dataset_version:str,)-None:在模型保存目录写入可追溯的元数据文件。metadata{saved_at:datetime.now(timezone.utc).isoformat(),config:config,metrics:metrics,dataset_version:dataset_version,}meta_pathPath(save_dir)/model_metadata.jsonwithopen(meta_path,w)asf:json.dump(metadata,f,ensure_asciiFalse,indent2)logger.info(模型元数据已保存,extra{path:str(meta_path)})六、日志分级使用规范级别使用场景AI 项目典型示例DEBUG开发期细节生产不输出每个 batch 的 token 数、注意力权重形状INFO正常流程节点epoch 开始/结束、模型加载完成、推理请求完成WARNING异常但可继续输入超过 max_length 被截断、GPU 显存接近上限ERROR需要干预的失败推理抛出异常、数据文件读取失败CRITICAL服务不可用模型权重文件损坏、OOM 导致进程退出# 规范示例logger.debug(batch token 统计,extra{min:12,max:498,mean:213.4})logger.info(模型推理完成,extra{request_id:rid,latency_ms:87.3})logger.warning(输入文本超长已截断,extra{original_len:1024,max_length:512})logger.error(推理失败,exc_infoTrue,extra{request_id:rid,input_hash:h})logger.critical(模型权重加载失败服务不可用,extra{model_path:path})七、总结维度核心规范DocstringGoogle Style PEP 484 类型注解函数/类/模块三级覆盖项目文档README 数据文档 模型版本记录 运维手册与代码同仓库管理日志格式生产环境 JSON 结构化输出字段统一包含 timestamp、level、module、上下文 ID日志分级INFO 记录流程节点WARNING 记录可恢复异常ERROR 记录需干预失败AI 专项实验配置 YAML 版本化 配置哈希 模型元数据文件保证实验可复现工具选型库代码用logging快速原型用Loguru生产微服务用structlogAI 项目的文档和日志不是有空再写的后置工作而是可复现性和可观测性的基础设施。一个三个月后仍能被自己和团队看懂、排查和复现的 AI 项目才是真正生产级的项目。参考资料Google Python Style Guide — DocstringsPython logging HOWTO — Python DocsLoguru Documentationstructlog DocumentationPEP 484 – Type Hints

相关文章:

【AI 项目 Python 】文档与日志规范:从代码注释到生产追踪的工程实践

文章目录AI 项目 Python 文档与日志规范:从代码注释到生产追踪的工程实践一、引言二、Docstring 规范:代码即文档2.1 三种主流风格对比2.2 Google Style 完整示例2.3 类型注解规范三、项目级文档体系3.1 AI 项目推荐目录结构3.2 README 最小必要元素模型…...

物业师傅的实战笔记:一次搞定IC卡梯控延期,从读卡器选型到数据修改全流程避坑

物业工程师的IC卡梯控延期实战手册:从设备选型到数据修改全流程解析 刚接手小区物业维修工作时,最让我头疼的就是IC卡梯控系统。业主卡片一过期,电话就接个不停,而不同品牌的电梯控制器数据格式千差万别。经过三年实操&#xff0c…...

2048游戏AI助手:三步掌握数字合并的终极策略

2048游戏AI助手:三步掌握数字合并的终极策略 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 你是否曾在2048游戏中屡屡失败,眼看就要合成大数字却功亏一篑?现在,一款…...

如何通过3步迁移完成R语言空间数据处理技术栈的终极升级

如何通过3步迁移完成R语言空间数据处理技术栈的终极升级 【免费下载链接】sf Simple Features for R 项目地址: https://gitcode.com/gh_mirrors/sf/sf 在R语言空间数据分析领域,从传统sp包迁移到现代sf包已成为技术演进的必然选择。sf包作为Simple Features…...

C++27范围库四大革命性扩展曝光:filter_view增强、zip_transform_v3、lazy_split_by、borrowed_range优化——你漏掉的性能跃迁机会在哪?

更多请点击: https://intelliparadigm.com 第一章:C27范围库扩展全景概览 C27 将对 头文件进行实质性增强,聚焦于提升范围组合的表达力、执行效率与编译期可推导性。标准委员会已正式采纳多项提案(P2954R0、P2976R1、P3026R0&am…...

终极指南:Reveal.js HTML演示框架从入门到精通

终极指南:Reveal.js HTML演示框架从入门到精通 【免费下载链接】reveal.js The HTML Presentation Framework 项目地址: https://gitcode.com/gh_mirrors/re/reveal.js Reveal.js是一款功能强大的HTML演示框架,让你轻松创建专业级演示文稿。无论你…...

零代码打造AI健身私教:MediaPipe创业项目落地终极指南

零代码打造AI健身私教:MediaPipe创业项目落地终极指南 【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe MediaPipe是一款跨平台、可定制…...

Wan2.1-umt5技术解析:深入理解其卷积神经网络优化策略

Wan2.1-umt5技术解析:深入理解其卷积神经网络优化策略 最近在社区里看到不少关于Wan2.1-umt5模型的讨论,大家普遍觉得它在处理文本和跨模态任务时,速度和效果都挺不错。作为一个长期关注模型底层优化的工程师,我很好奇它到底做了…...

终极指南:Immutable.js文档站的Next.js静态生成架构解析

终极指南:Immutable.js文档站的Next.js静态生成架构解析 【免费下载链接】immutable-js Immutable persistent data collections for Javascript which increase efficiency and simplicity. 项目地址: https://gitcode.com/gh_mirrors/im/immutable-js Immu…...

告别代码格式之争:Google代码规范与自动重构工具终极实战指南

告别代码格式之争:Google代码规范与自动重构工具终极实战指南 【免费下载链接】styleguide Style guides for Google-originated open-source projects 项目地址: https://gitcode.com/gh_mirrors/styleguide4/styleguide 在软件开发过程中,代码格…...

ZXing扫码应用冷启动终极优化指南:3个实战技巧提速60%

ZXing扫码应用冷启动终极优化指南:3个实战技巧提速60% 【免费下载链接】zxing ZXing ("Zebra Crossing") barcode scanning library for Java, Android 项目地址: https://gitcode.com/gh_mirrors/zx/zxing ZXing("Zebra Crossing…...

用PyQt给RK3588 OCR项目做个GUI:从命令行到可视化应用的升级之路

从命令行到可视化:用PyQt为RK3588 OCR项目打造专业级GUI 在嵌入式AI领域,RK3588凭借其强大的NPU算力已成为边缘计算的热门选择。当我们成功部署了基于DBNetCRNN的OCR模型后,如何让这项技术真正"活起来",成为非技术用户也…...

顺序表 -->增、删、查、改等详细操作

个人主页:流年如梦 专栏:《C语言》 《数据结构》 文章目录一.线性表二.顺序表2.1概念与结构2.2静态顺序表2.3动态顺序表2.3.1动态顺序表结构体2.3.2头文件声明 --> SeqList.h2.3.3源文件实现 --> SeqList.c2.3.3.1初始化2.3.3.2销毁2.3.3.3打印2.3…...

如何快速使用163MusicLyrics:音乐歌词获取与处理的完整指南

如何快速使用163MusicLyrics:音乐歌词获取与处理的完整指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在当今数字音乐时代,歌词同步显示已成…...

LinkSwift网盘直链下载神器:告别限速困扰的终极解决方案

LinkSwift网盘直链下载神器:告别限速困扰的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南

VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major vers…...

Voxtral-4B-TTS-2603语音合成教程:casual_male/neutral_female等音色效果对比实测

Voxtral-4B-TTS-2603语音合成教程:casual_male/neutral_female等音色效果对比实测 1. 引言:认识Voxtral语音合成模型 Voxtral-4B-TTS-2603是Mistral团队推出的开源语音合成模型,专门为语音助手、客服系统等实际应用场景设计。这个模型最大的…...

终极指南:如何在Blender中无缝导入Rhino 3D文件

终极指南:如何在Blender中无缝导入Rhino 3D文件 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经在Rhino中创建了精美的3D模型,却无法直接在Bl…...

告别表单布局混乱:5个react-bootstrap网格与堆叠混合设计终极指南

告别表单布局混乱:5个react-bootstrap网格与堆叠混合设计终极指南 【免费下载链接】react-bootstrap Bootstrap components built with React 项目地址: https://gitcode.com/gh_mirrors/re/react-bootstrap react-bootstrap是基于React构建的Bootstrap组件库…...

注塑件变形怎么调优?全尺寸3D检测如何助力精密注塑“减废增效”

汽车灯具全尺寸 3D 测量技术报告 / 3D Metrology for Automotive Lighting[!TIP] 请选择阅读语言 / Please select your language:🇨🇳 点击展开:中文版 (Click to Expand: Chinese Version) 技术报告:基于拍照式蓝光三维扫描的汽…...

AI写专著全流程解析:AI工具如何助力20万字专著快速完成?

学术专著需要严谨的态度,背后则是大量资料和数据的支持。收集这些资料和整合数据往往是写作过程中最繁琐且耗时的部分。研究人员必须广泛地寻找国内外最新的文献,这不光要确保资料的权威性和相关性,还要追溯到原始出处,避免引用错…...

终极Node.js Word文档解析指南:告别Office依赖的纯JavaScript解决方案

终极Node.js Word文档解析指南:告别Office依赖的纯JavaScript解决方案 【免费下载链接】node-word-extractor Read data from a Word document using node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-word-extractor 还在为Node.js项目中处理Word…...

ot.js:终极实时协作编辑解决方案,彻底改变多人编程体验

ot.js:终极实时协作编辑解决方案,彻底改变多人编程体验 【免费下载链接】ot.js 项目地址: https://gitcode.com/gh_mirrors/ot/ot.js ot.js 是一款基于 Operational Transformation(OT)算法的实时协作编辑引擎&#xff0c…...

终极Windows 10瘦身指南:16个核心功能让系统重获新生

终极Windows 10瘦身指南:16个核心功能让系统重获新生 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on the W10 d…...

React Native Draggable FlatList性能优化:10个实用技巧提升应用流畅度

React Native Draggable FlatList性能优化:10个实用技巧提升应用流畅度 【免费下载链接】react-native-draggable-flatlist A drag-and-drop-enabled FlatList for React Native 项目地址: https://gitcode.com/gh_mirrors/re/react-native-draggable-flatlist …...

ViGEmBus虚拟手柄驱动:让所有手柄都能玩Windows游戏的终极解决方案

ViGEmBus虚拟手柄驱动:让所有手柄都能玩Windows游戏的终极解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经因为手中的游戏手柄…...

为什么92%的车载以太网项目DoIP协议栈延期交付?C++底层设计缺陷深度复盘(含可运行参考实现)

更多请点击: https://intelliparadigm.com 第一章:DoIP协议栈延期交付的行业现状与根本归因 行业交付延迟的普遍性表现 当前,超过68%的汽车电子供应商在DoIP(Diagnostics over Internet Protocol)协议栈项目中遭遇交…...

LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践

LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践 1. 模型介绍与适用场景 1.1 模型基本信息 LFM2.5-1.2B-Instruct是一个1.2B参数量的轻量级指令微调大语言模型,由Liquid AI基于Unsloth训练框架开发。这个模型专为边缘设备和低资…...

Java多租户数据泄露事故频发?3个被90%团队忽略的隔离漏洞,今天必须修复

更多请点击: https://intelliparadigm.com 第一章:Java多租户数据泄露事故的严峻现实 近年来,Java生态中基于Spring Boot构建的SaaS平台频发跨租户数据泄露事件——根本原因并非加密缺失,而是租户隔离逻辑在数据访问层被意外绕过…...

3分钟掌握:如何用AI将B站视频秒变可编辑文字稿

3分钟掌握:如何用AI将B站视频秒变可编辑文字稿 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理视频内容而烦恼吗?无论是学习…...