🎙️ 音视频处理 · 技能 #3

微博直播回放转逐字稿与分时段主题分析

定位

将微博网页版直播回放链接转换为:

  1. 文字逐字稿:带时间戳的完整文字记录
  2. 分时段主题与主要观点分析:按时段分段,每段包含主题、关键词、主要观点、内容摘要

适用于无法直接下载的微博直播回放页面(weibo.com/l/wblive/p/show/...)。

触发条件

当用户说出以下类似的话时调用:

输入规范

用户提供微博直播回放URL,格式如:

URL中的 1022:2321325337157509447744 是直播ID(live_id)。

输出规范

生成以下文件,保存到 /workspace/ 目录:

文件 说明
live_transcript.txt 带时间戳的逐字稿(格式:[HH:MM:SS] 文字内容)
live_transcript_plain.txt 纯文字逐字稿(无时间戳)
live_segments.json 分段数据(JSON格式,含时间戳和文字)
live_segments_analysis.html 分时段主题与观点分析(HTML,带侧边目录导航)
live_segments_analysis.md 分时段主题与观点分析(Markdown格式)

工作流程

第一步:提取视频URL

微博直播回放页面的视频通过API提供,需要从页面或API中提取m3u8视频流地址。

1a. 提取live_id

从URL中提取live_id:


https://weibo.com/l/wblive/p/show/1022:2321325337157509447744
→ live_id = 1022:2321325337157509447744

1b. 通过API获取视频URL

请求API获取 media_info:


GET https://wblive-out.api.weibo.com/2/wblive/room/play?id={live_id}
Referer: https://weibo.com/

返回JSON中包含:

1c. 回退方案:从页面源码提取

如果API不可用,直接访问直播回放页面,从HTML源码中搜索:

第二步:下载音频

使用 ffmpeg 从 m3u8 视频流中提取音频:


ffmpeg -y \
  -headers "Referer: https://weibo.com/\r\n" \
  -i "{m3u8_url}" \
  -vn \
  -acodec pcm_s16le \
  -ar 16000 \
  -ac 1 \
  /workspace/live_audio.wav

参数说明:

如果 ffmpeg 下载失败,可尝试 yt-dlp:


yt-dlp -x --audio-format wav --audio-quality 0 -o live_audio.%(ext)s "{url}"

第三步:语音转文字(ASR)

使用 faster-whisper(基于CTranslate2,比官方Whisper快2-5倍)进行中文语音识别。

3a. 安装依赖


pip install faster-whisper opencc-python-reimplemented --break-system-packages
apt-get install -y ffmpeg

网络环境配置:如果HuggingFace模型下载失败(SSL错误),使用镜像:


export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_DISABLE_XET=1
export HF_HUB_DOWNLOAD_TIMEOUT=120

3b. 长音频切分

如果音频超过25分钟,使用 ffmpeg 切分为多个片段(每段25分钟),分别转写后合并:

3c. 转写


from faster_whisper import WhisperModel

model = WhisperModel("large-v3-turbo", device="cpu", compute_type="int8")
segments, info = model.transcribe(
    "audio.wav",
    language="zh",
    beam_size=5,
    vad_filter=True,
    vad_parameters=dict(min_silence_duration_ms=500),
)

for seg in segments:
    print(f"[{seg.start:.1f}s -> {seg.end:.1f}s] {seg.text}")

模型选择建议:

模型 速度 中文准确度 内存
large-v3-turbo 快 高 ~2.5GB(INT8)
large-v3 中 最高 ~3GB(INT8)
medium 较快 中 ~1.5GB
small 最快 一般 ~500MB

推荐使用 large-v3-turbo + INT8量化,在CPU上可获得较好的速度/精度平衡。

第四步:生成分时段主题与主要观点分析

4a. 时段划分

将逐字稿按每10分钟左右一个时段进行划分(根据总时长自动调整,范围5-15分钟):

4b. 生成HTML分段分析页面

生成可视化的分段报告页面:

4c. 生成Markdown分段文档

同时生成Markdown格式文档,方便编辑和二次使用:

完整运行命令


cd /workspace && python3 weibo_live_transcript.py \
  "https://weibo.com/l/wblive/p/show/1022:2321325337157509447744"

可选参数:


python3 weibo_live_transcript.py "URL" \
  --cookie "微博Cookie" \
  --model large-v3-turbo \
  --language zh \
  --skip-download \    # 跳过下载(使用已有音频)
  --skip-transcribe   # 跳过转写(使用已有逐字稿)

重要约束

  1. Cookie:部分直播回放可能需要登录态。如果提取失败,提示用户提供Cookie。
  2. 音频长度:直播可能很长(1-3小时),转写需要较长时间(CPU上约为音频时长的2-4倍)。
  3. 内存:large-v3-turbo INT8模式需要约2.5GB内存;内存不足时降级为medium或small。
  4. 中文识别:Whisper对中文的识别准确率约为90-95%,专有名词可能不准确。Whisper默认输出繁体中文,脚本通过opencc自动转换为简体中文。
  5. 网络:m3u8下载需要稳定的网络连接;如果下载中断,重新运行即可。
  6. 合规:仅用于个人学习和研究,遵守微博服务条款。

错误处理

错误 原因 解决方案
无法提取live_id URL格式不匹配 提示用户提供完整URL
API返回非JSON Cookie过期或直播已删除 提示用户提供Cookie
ffmpeg下载失败 m3u8地址过期或网络问题 重新提取URL或使用代理
Whisper内存不足 模型太大 降级为small或medium模型
转写结果为空 音频无语音或格式错误 检查音频文件是否正确

文件依赖

技术来源