ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PaddleSpeech 视频自动字幕生成实战:基于 ASR 与标点恢复的完整流程

PaddleSpeech 视频自动字幕生成实战:基于 ASR 与标点恢复的完整流程 人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载导读视频字幕自动生成是语音识别ASR在实际场景中最直接的应用之一给定一段带语音的视频无需人工转写即可自动得到带标点的字幕文本。本文将基于 PaddleSpeech 仓库中的 automatic_video_subtitiles demo完整讲解从视频下载、音频抽取、语音识别到标点恢复的端到端流程并深入源码剖析ASRExecutor与TextExecutor的底层调用链帮助读者掌握用单条命令或几行 Python 代码为任意视频生成字幕的完整方案。一、Demo 整体流程与原理视频字幕生成的核心思路是先把视频中的语音轨道转成标准音频再用 ASR 模型把语音转成无标点文本最后通过标点恢复模型为文本添加标点得到可直接用于字幕渲染的文本。整个流程在 run.sh 中体现得十分清晰包含四个关键环节下载视频通过wget获取包含目标语言语音的视频文件抽取音频用ffmpeg将视频中的音轨提取为单声道1 channel、16kHz 采样率的.wav文件语音识别ASR调用ASRExecutor将wav转为文本标点恢复Punctuation Restoration调用TextExecutor为识别文本补全标点。其中步骤 3、4 分别对应 PaddleSpeech 的asr与text两个任务两者通过paddlespeech.cli下定义的执行器Executor封装用户既可以在 Python 中直接调用也可以通过命令行使用还可以借助仓库自带的脚本一键完成。二、环境准备与安装在使用 demo 前需要先安装 PaddleSpeech 及其依赖。官方提供了三档安装方式easy / medium / hard详见仓库中的 英文安装文档 与 中文安装文档easy通过pip install paddlespeech安装发布包适合只想快速体验的开发者medium在安装发布包基础上额外安装kaldi等可选依赖覆盖更多功能hard从源码编译安装适合需要定制或参与开发的场景。此外由于 demo 需要处理视频文件还需要确保环境中已安装ffmpeg用于音视频抽取和wget用于下载示例视频。若希望启用 GPU 推理还需要安装匹配版本的 PaddlePaddle GPU 版本并在调用时通过device参数指定。三、准备输入从视频到标准 WAVPaddleSpeech 的 ASR 模型对输入音频有明确要求16kHz、16bit、单声道 WAV。因此第一步是获取视频第二步是用 ffmpeg 完成音频抽取与重采样。3.1 下载示例视频demo 提供了一个可直接下载的中文示例视频wget -c https://paddlespeech.cdn.bcebos.com/demos/asr_demos/subtitle_demo1.mp4实际使用中可将该命令替换为任何包含目标语言语音的视频文件。3.2 抽取单声道 16kHz 音频ffmpeg -i subtitle_demo1.mp4 -ac 1 -ar 16000 -vn input.wav各参数含义如下参数含义-i subtitle_demo1.mp4指定输入视频文件-ac 1强制输出为单声道1 channel-ar 16000强制输出采样率为 16000 Hz-vn丢弃视频流只保留音频input.wav输出的 WAV 文件这一步之所以至关重要是因为 ASR 前端特征Fbank直接依赖采样率。虽然ASRExecutor内部具备自动重采样能力见第五节源码分析但预先输出符合模型要求的 WAV 能避免额外转换带来的精度损耗。四、三种使用方式demo 提供了 Python API、一键脚本和命令行三种使用路径覆盖从入门到集成的全部需求。4.1 方式一Python APIREADME 原始用法这是 README 中给出的核心用法全部代码仅需几行import paddle from paddlespeech.cli.asr import ASRExecutor from paddlespeech.cli.text import TextExecutor asr_executor ASRExecutor() text_executor TextExecutor() text asr_executor( audio_fileinput.wav, devicepaddle.get_device()) result text_executor( texttext, taskpunc, modelernie_linear_p3_wudao, devicepaddle.get_device()) print(Text Result: \n{}.format(result))执行后输出示例来自 READMEText Result: 当我说我可以把三十年的经验变成一个准确的算法他们说不可能。当我说我们十个人就能实现对十九个城市变电站七乘二十四小时的实时监管他们说不可能。可以看到第一段调用完成了语音到文字的识别第二段调用为无标点文本补全了逗号、句号两者组合即得到可直接使用的字幕文本。paddle.get_device()会自动返回当前可用的设备如cpu或gpu:0。4.2 方式二一键脚本run.sh recognize.py仓库在 run.sh 中把下载、抽取、识别封装成了一键脚本#!/bin/bash video_urlhttps://paddlespeech.cdn.bcebos.com/demos/asr_demos/subtitle_demo1.mp4 video_file$(basename ${video_url}) audio_file$(echo ${video_file} | awk -F. {print $1}).wav num_channels1 sr16000 # Download video if [ ! -f ${video_file} ]; then wget -c ${video_url} fi # Extract audio from video if [ ! -f ${audio_file} ]; then ffmpeg -i ${video_file} -ac ${num_channels} -ar ${sr} -vn ${audio_file} fi python -u recognize.py --input ${audio_file} exit 0脚本通过if [ ! -f ... ]判断实现断点续传与幂等性视频和音频已存在时跳过下载与抽取直接进入识别。其对应的 recognize.py 则对 README 中的 Python 代码做了命令行参数化增强import argparse import os import paddle from paddlespeech.cli.asr import ASRExecutor from paddlespeech.cli.text import TextExecutor parser argparse.ArgumentParser(__doc__) parser.add_argument(--input, typestr, requiredTrue) parser.add_argument(--device, typestr, defaultpaddle.get_device()) args parser.parse_args() if __name__ __main__: asr_executor ASRExecutor() text_executor TextExecutor() text asr_executor( audio_fileos.path.abspath(os.path.expanduser(args.input)), deviceargs.device) result text_executor( texttext, taskpunc, modelernie_linear_p3_wudao, deviceargs.device) print(ASR Result: \n{}.format(text)) print(Text Result: \n{}.format(result))与 README 中直接传入相对路径不同这里通过os.path.abspath(os.path.expanduser(args.input))将输入路径规范化为绝对路径支持~/xxx.wav这类带波浪号的路径。运行方式bash run.sh # 或手动指定音频 python recognize.py --input input.wav --device cpu4.3 方式三纯命令行PaddleSpeech 为每个任务都注册了 CLI 入口命令分发逻辑见 entry.py。根据 CLI 使用文档上述流程可完全用命令行完成无需编写 Python# 第一步语音识别 paddlespeech asr --lang zh --input input_16k.wav # 第二步标点恢复 paddlespeech text --task punc --input 今天的天气真不错啊你下午有空吗我想约你一起去吃饭其中paddlespeech text默认使用ernie_linear_p7_wudao模型也可通过--model切换为与 demo 一致的ernie_linear_p3_wudao或追求更快的ernie_linear_p3_wudao_fast。这种方式适合在 shell 脚本或 CI 流水线中直接集成。五、源码剖析ASRExecutor 的识别流水线demo 之所以能「几行代码跑通」依赖于 paddlespeech/cli/asr/infer.py 中ASRExecutor对「资源加载 → 校验 → 预处理 → 推理 → 后处理」五个阶段的封装。其继承自 executor.py 中的BaseExecutor抽象基类。5.1 默认参数与可选参数ASRExecutor在__init__中通过argparse定义了完整参数集其中默认值直接决定了 demo 的行为参数默认值说明--modelconformer_u2pp_online_wenetspeech默认使用基于 WenetSpeech 训练的 U2 Conformer 流式/离线两用模型--langzh语言可选zh、en、zh_en--codeswitchFalse是否启用中英文混语 code-switch--sample_rate16000采样率可选8000、16000--decode_methodattention_rescoring解码方式可选ctc_greedy_search、ctc_prefix_beam_search、attention、attention_rescoring--devicepaddle.get_device()推理设备值得注意的是 demo 的 Python 调用只传了audio_file和device其余全部走默认值这正体现了 Executor 设计上的「开箱即用」特性。5.2 资源自动下载与模型加载_init_from_path当未显式传入cfg_path/ckpt_path时_init_from_path会根据model_type-lang-sample_rate的组合如conformer_u2pp_online_wenetspeech-zh-16k自动从CommonTaskResource中查找并下载预训练模型、配置与权重然后用CfgNode.merge_from_file读取模型 YAML 配置通过TextFeaturizer构建词表/SPM 前端依据模型类型deepspeech2/conformer/transformer从配置反序列化模型结构并加载.pdparams权重对 transformer 类模型计算最大可处理时长self.max_len由 subsample 率、帧移与位置编码最大长度共同决定。5.3 音频校验与自动重采样_check_check方法对输入音频做了三道把关这部分对 demo 实践非常关键时长限制从源码可见self.max_len 50秒为默认上限超过 50 秒的音频会被拒绝并提示Please input audio file less then 50 seconds。对于长视频需要先做分段处理如按句切分或按固定时长切窗这也是「自动字幕」落地时最常见的工程点格式校验soundfile.read无法打开的文件会提示使用sox转换格式例如sox input.xx --rate 16k --bits 16 --channels 1 output.wav重采样确认当输入采样率与--sample_rate不一致时程序会交互式询问Input(Y/N)是否自动重采样若在 CLI 中附加--yes参数则可跳过询问直接转换。从preprocess的实现可以看到重采样的具体路径soundfile.read以 int16 读入 → 多声道取均值 →_pcm16to32转浮点 →librosa.resample重采样 →_pcm32to16还原 int16 → 再经Transformation提取 Fbank 特征并封装为paddle.Tensor。5.4 解码与输出infer / postprocessinfer在paddle.no_grad()下执行模型前向对 transformer 类模型调用model.decode并传入decoding_method、beam_size、ctc_weight、decoding_chunk_size等解码参数均来自模型配置中的decode段最终postprocess返回首个识别结果字符串。此外ASRExecutor还内置了--rtf选项用于统计实时率Real-time Factor帮助评估推理速度支持.txt/.scp/.job批量输入文件每行id path格式便于对整批视频/音频批量生成字幕。六、源码剖析TextExecutor 的标点恢复ASR 直接输出的文本通常没有标点直接渲染字幕会严重影响可读性因此 demo 的第二段调用至关重要。其实现位于 paddlespeech/cli/text/infer.py。6.1 参数与模型选择result text_executor( texttext, taskpunc, modelernie_linear_p3_wudao, devicepaddle.get_device())task目前仅支持punc标点恢复modelernie_linear_p3_wudao指定基于 ERNIE 的线性标点模型demo 所用该 Executor 的默认模型是ernie_linear_p7_wudao在__call__中ernie_linear_p7_wudao与ernie_linear_p3_wudao走旧版初始化路径其余模型走_init_from_path_new新路径——两者在 tokenizer 选择ernie-1.0或快速版ernie-3.0-mini-zh上存在差异。6.2 标点预测的调用链从源码可以看到完整处理链_init_from_path从资源目录加载配置、权重和标点词表vocab_file每行一个标点符号实例化ErnieLinear模型与 ERNIE tokenizer_clean_text将文本小写化并过滤非字母数字/中文字符同时剔除已有标点preprocess用 tokenizer 将文本切分为 token 序列得到input_ids、seg_ids、seq_leninferpaddle.argmax(logits, axis-1)为每个 token 预测一个标点类别postprocess将预测类别映射回标点词表在非零类别对应的 token 后插入标点l ! 0表示该位置需要插入标点最终拼出带标点的完整文本。6.3 标点词表从_punc_list的加载逻辑跳过首行、索引 0 为无标点可以推断标点词表通常包含。等常用中文标点。demo 输出中的「」「。」正是由该模型在识别文本的合适位置插入的。七、进阶实践建议7.1 长视频处理由于ASRExecutor默认限制单段音频不超过 50 秒处理完整视频字幕时需要先按静音或固定时长将长音频切分为短段逐段识别后再按时间轴合并成字幕文件如 SRT 格式。PaddleSpeech 仓库中的 streaming_asr_server demo 与 speech_recognition demo 提供了长音频/流式场景的更多参考实现。7.2 模型与语言扩展识别英文视频时可在 ASR 调用中指定langen对应transformer_librispeech-en-16k模型或使用langzh_en配合codeswitchTrue处理中英混语标点恢复可切换ernie_linear_p3_wudao_fast以获得更快的推理速度有自定义模型时可通过config与ckpt_path显式传入配置文件与权重路径跳过自动下载。7.3 批量处理与速度评估在 CLI 中ASR 支持传入.txt/.scp批量清单文件配合--rtf参数可以统计批处理的平均实时率-d参数可将结果落盘保存便于后续生成字幕文件。八、总结视频自动字幕生成是 ASR 技术落地最直观的场景之一。通过本文可以确认PaddleSpeech 将「语音识别ASRExecutor」与「标点恢复TextExecutor」封装为统一执行器配合 ffmpeg 的音频抽取即可用一条命令或几行 Python完成从视频到带标点字幕文本的全流程同时recognize.py 与 run.sh 展示了参数化与自动化封装的工程实践源码中关于采样率校验、50 秒时长限制、批量输入等细节则为长视频字幕落地提供了明确的技术边界与扩展方向。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 视频自动字幕生成实战从视频语音识别到标点恢复的完整流程PaddleSpeech 视频自动字幕生成实战从视频语音识别到标点恢复的完整流程 导读 视频字幕生成Automatic Video Subtitles是指人工智能语音音频PaddleSpeech 流式语音识别服务实战基于 WebSocket 的流式 ASR、标点预测与 SRT 字幕生成完整指南PaddleSpeech 流式语音识别服务实战基于 WebSocket 的流式 ASR、标点预测与 SRT 字幕生成完整指南 本指南围绕 PaddleSpee人工智能语音音频NLP媒体生成FlatBuffers TypeScript 使用指南从 Schema 生成、缓冲区读写到 Object Based API 实战FlatBuffers TypeScript 使用指南从 Schema 生成、缓冲区读写到 Object Based API 实战 本文以 FlatBuffe人工智能语音音频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表