[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f2o7qrxkwplkp0":3,"footer-friend-links":27,"$f3e7406d1hxkjw":34,"$fy1fwyfy8b7yn":281,"$f2hv98ynzniw4o":286,"$fmiql68sw5v3q":289,"$fppagrig4sxxc":291,"$f35ta9ydanykb5":293},{"code":4,"data":5,"meta":10},200,{"themePreset":6,"themePrimaryColor":7,"themeAccentColor":7,"themeSurfaceColor":7,"themeTextColor":7,"themeDarkPrimaryColor":7,"themeDarkAccentColor":7,"themeDarkSurfaceColor":7,"themeDarkTextColor":7,"themeBorderRadius":7,"themeLogoUrl":8,"themeFaviconUrl":9,"themeMourningMode":7,"themeBackgroundType":7,"themeBackgroundValue":7},"amber","","https:\u002F\u002Fai-blog.cn-nb1.rains3.com\u002Fimage\u002F20260722145356240-h4vgh5k.jpg","https:\u002F\u002Fai-blog.cn-nb1.rains3.com\u002Fimage\u002Flogo%20%281%29.svg",{"theme_preset":11,"theme_primary_color":13,"theme_accent_color":14,"theme_surface_color":15,"theme_text_color":16,"theme_dark_primary_color":17,"theme_dark_accent_color":18,"theme_dark_surface_color":19,"theme_dark_text_color":20,"theme_border_radius":21,"site_logo":22,"site_favicon":23,"theme_mourning_mode":24,"theme_background_type":25,"theme_background_value":26},{"isLocked":12},false,{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"isLocked":12},{"meta":28,"items":32,"groups":33},{"enabled":29,"applicationEnabled":29,"applicationGuidelines":7,"footerEnabled":29,"footerLimit":30,"checkIntervalMinutes":31},true,6,1440,[],[],{"code":4,"data":35,"locale":43},{"id":36,"createdAt":37,"updatedAt":38,"title":39,"slug":40,"content":41,"summary":7,"coverImage":42,"language":43,"translationId":44,"authorId":45,"categoryId":46,"status":47,"visibility":48,"views":49,"isPinned":12,"copyright":44,"metaVersion":50,"metadata":51,"publishedAt":265,"author":266,"category":269,"tags":272,"audioUrl":44,"audioDuration":44,"audioSize":44,"audioMimeType":44,"publishIntent":273,"memosId":44,"translations":274,"previousPost":275,"nextPost":44,"relatedPosts":280,"locked":12},"67e3675feb5fab1b","2026-07-23T06:15:37.147Z","2026-08-21T13:44:12.000Z","用 StreamCap 和本地 Whisper 总结财经直播：从自动录音到观点报告","用-stream-cap-和本地-whisper-总结财经直播：从自动录音到观点报告","**起因**：最近科技跌的厉害，所以我又重新开始看起了财经直播，准备寻找一个入场的机会，但是财经主播讲的大部分是废话，可能偶尔一两句话是重点，而且一下要看一个小时，于是乎就产生了让 ai 帮我总结的方法。\n## 整体流程\n\n```text\n主播开播\n  ↓\nStreamCap 自动监听并分段录音\n  ↓\n本地 Whisper 转成带时间戳的文字稿\n  ↓\nGPT 区分观点、论据、预测和事实\n  ↓\n生成 Markdown 复盘报告\n```\n![Snipaste_20260723_141953.png](https:\u002F\u002Fai-blog.cn-nb1.rains3.com\u002Fposts\u002F67e3675feb5fab1b\u002Fimage\u002F20260723142025574-h5mqzwh.png)\n\n\n## 第一步：用 StreamCap 监听并录音\n![Snipaste_20260723_141921.png](https:\u002F\u002Fai-blog.cn-nb1.rains3.com\u002Fposts\u002F67e3675feb5fab1b\u002Fimage\u002F20260723142047284-0o0v36m.png)\n\nStreamCap 是一个基于 FFmpeg 的开源直播录制工具，支持 Windows、macOS 和 Web 方式运行，也支持抖音等多个直播平台。\n\n- 项目主页：\u003Chttps:\u002F\u002Fgithub.com\u002Fihmily\u002FStreamCap>\n- 下载页面：\u003Chttps:\u002F\u002Fgithub.com\u002Fihmily\u002FStreamCap\u002Freleases>\n\n从 Release 页面下载与系统对应的版本。Windows 解压后运行，macOS 下载 DMG 后安装即可。只从项目官方页面下载，不使用来历不明的打包版本。\n\n打开 StreamCap 后，添加主播的公开主页地址或直播间地址，然后设置：\n\n| 设置 | 建议值 | 说明 |\n| --- | --- | --- |\n| 监控状态 | 开启 | 定时检查主播是否开播，开播后自动录制 |\n| 录制格式 | `M4A` 或 `WAV` | M4A 更省空间；WAV 更通用，但文件很大 |\n| 分段录制 | 开启 | 长直播损坏时不会丢失整场内容 |\n| 分段时长 | 600 秒 | 每 10 分钟一个文件，便于转写和重试 |\n| 画质 | 任意 | 只录音时，最终文件不保存画面 |\n| 自动转 MP4 | 关闭 | 音频总结不需要视频转码 |\n| 录制目录 | 自定义目录 | 建议按平台和主播分别保存 |\n\n这次实测使用的是 `WAV`：40 分钟约占 404 MB。它没有经过有损压缩，适合排查识别问题，但长期使用没有必要。日常监听更适合 `M4A`；如果已经录成 WAV，也不需要重新录制，Whisper 可以直接读取。\n\n建议把轮询间隔设得保守一些。频繁请求直播状态可能触发平台风控，项目本身也可能因为抖音接口调整而需要升级。\n\n## 第二步：安装本地 Whisper\n\n下面使用开源的 OpenAI Whisper。它支持中文，并能在 Apple Silicon、NVIDIA GPU 或 CPU 上运行。\n\n先安装 FFmpeg。macOS 可以使用 Homebrew：\n\n```bash\nbrew install ffmpeg\n```\n\n然后使用 `uv` 创建独立环境：\n\n```bash\nuv venv\nsource .venv\u002Fbin\u002Factivate\nuv pip install openai-whisper\n```\n\nWindows 激活环境时使用：\n\n```powershell\n.venv\\Scripts\\activate\n```\n\n首次运行会下载模型。中文财经直播建议从 `small` 开始：它比 `base`、`tiny` 更能识别板块名和财经术语，速度又明显快于 `large`。遇到大量公司名、方言或多人连麦时，再考虑更大的模型。\n\n## 第三步：批量转写分段音频\n\n把下面脚本保存为 `transcribe_live.py`。它会读取一个目录中的常见音频格式，按文件名排序，输出带全局时间戳的 Markdown 文字稿。\n\n```python\nimport argparse\nimport json\nimport subprocess\nfrom pathlib import Path\n\nimport torch\nimport whisper\n\n\ndef media_duration(path: Path) -> float:\n    result = subprocess.run(\n        [\n            \"ffprobe\",\n            \"-v\",\n            \"error\",\n            \"-show_entries\",\n            \"format=duration\",\n            \"-of\",\n            \"json\",\n            str(path),\n        ],\n        check=True,\n        capture_output=True,\n        text=True,\n    )\n    return float(json.loads(result.stdout)[\"format\"][\"duration\"])\n\n\ndef timestamp(seconds: float) -> str:\n    total = round(seconds)\n    hours, remainder = divmod(total, 3600)\n    minutes, seconds = divmod(remainder, 60)\n    return f\"{hours:02d}:{minutes:02d}:{seconds:02d}\"\n\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"audio_dir\", type=Path)\nparser.add_argument(\"--model\", default=\"small\")\nparser.add_argument(\"--output\", type=Path, default=Path(\"transcript.md\"))\nargs = parser.parse_args()\n\nif torch.cuda.is_available():\n    device = \"cuda\"\nelif torch.backends.mps.is_available():\n    device = \"mps\"\nelse:\n    device = \"cpu\"\n\nmodel = whisper.load_model(args.model, device=device)\nextensions = {\".wav\", \".mp3\", \".m4a\", \".aac\", \".flac\"}\naudio_files = sorted(\n    path for path in args.audio_dir.iterdir() if path.suffix.lower() in extensions\n)\nif not audio_files:\n    parser.error(\"录音目录中没有找到支持的音频文件\")\n\noffset = 0.0\nlines = [\"# 直播文字稿\", \"\"]\n\nfor audio_path in audio_files:\n    result = model.transcribe(\n        str(audio_path),\n        language=\"zh\",\n        fp16=device != \"cpu\",\n        condition_on_previous_text=True,\n        initial_prompt=(\n            \"这是一场中文财经直播，请准确识别股票、指数、板块、基金、\"\n            \"公司名称、价格、涨跌幅和投资术语。\"\n        ),\n    )\n\n    for segment in result[\"segments\"]:\n        text = segment[\"text\"].strip()\n        if text:\n            lines.append(f\"[{timestamp(offset + segment['start'])}] {text}\")\n\n    offset += media_duration(audio_path)\n\nargs.output.write_text(\"\\n\".join(lines) + \"\\n\", encoding=\"utf-8\")\nprint(f\"已输出：{args.output}\")\n```\n\n运行方式：\n\n```bash\npython transcribe_live.py \"\u002F你的\u002F主播录音目录\" \\\n  --model small \\\n  --output \"2026-07-22-直播文字稿.md\"\n```\n\n分段文件必须能按名称正确排序。StreamCap 默认文件名包含时间和分段序号，一般可以直接使用。如果文件名是手工修改过的，先确认排序结果与直播顺序一致。\n\n## 第四步：让 GPT 提炼观点\n\n不要只让 GPT “总结一下”。财经内容需要明确区分主播的立场、观察到的数据和未经验证的推测。可以使用下面的提示词：\n\n```text\n你是一名严谨的财经内容分析助手。请分析下面的直播文字稿。\n\n要求：\n1. 不要把主播观点写成客观事实。\n2. 提取核心观点，并为每条观点保留对应时间戳。\n3. 分别列出主播给出的论据、预测、操作倾向和风险提示。\n4. 标出缺少证据的因果推断、市场传闻和可能的前后矛盾。\n5. 股票、指数、公司名或数字如果疑似转写错误，请标记“待核对”，不要自行补造。\n6. 最后整理出未来可以验证的三到五条预测。\n7. 不提供个性化投资建议。\n\n输出结构：\n- 一句话结论\n- 核心观点\n- 操作与仓位倾向\n- 缺少证据或需要核查的内容\n- 后续验证清单\n\n直播文字稿：\n{在这里粘贴带时间戳的文字稿}\n```\n\n如果文字稿太长，可以每 10 至 20 分钟总结一次，最后再把各段摘要交给 GPT 做全场归并。第二轮提示中应要求模型合并重复观点、保留变化过程，并指出主播前后是否改变立场。\n","https:\u002F\u002Fai-blog.cn-nb1.rains3.com\u002Fposts\u002F67e3675feb5fab1b\u002Fimage\u002Fai\u002F20260723142536327-irgxood.png","zh-CN",null,"67e220d88539f703","67e29819308c9899","published","public",7,1,{"audio":52,"audit":53,"cover":81,"publish":84,"integration":87,"visualAssets":263},{},{"tier":54,"score":55,"version":56,"cachedAt":57,"readability":58,"metaCompleteness":66},"good",71,2,"2026-07-23T08:17:54.495Z",{"score":59,"suggestions":60},82,[61,62,63,64,65],"补完整体流程的收尾部分。文章在“第四步：让 GPT 提炼观点”处停止，建议补充提示词示例、报告模板、输出效果和注意事项，让读者能完成从录音到复盘报告的闭环。","开头段落建议拆成两到三句，并减少口语化表达，例如“于是乎”“废话”等可以改为更中性的表述，使文章更专业，也更符合技术教程语气。","建议在每一步开头增加一句目的说明，例如说明这一步解决什么问题、产出什么文件，帮助读者快速理解流程中的输入和输出。","代码段之后可以补充依赖条件和常见报错处理，例如 FFmpeg 未安装、MPS 不兼容、显存不足、文件排序错误等，提高教程的可操作性。","图片建议增加简短说明文字，说明截图展示的是哪个配置界面或运行结果，避免读者只看到图片但不知道应关注哪些设置。",{"score":67,"details":68},60,{"tags":69,"title":72,"summary":75,"category":77,"coverImage":79},{"key":70,"score":71},"pages.admin.posts.audit.msg.tags_missing",0,{"key":73,"score":74},"pages.admin.posts.audit.msg.title_ideal",20,{"key":76,"score":71},"pages.admin.posts.audit.msg.summary_missing",{"key":78,"score":74},"pages.admin.posts.audit.msg.category_assigned",{"key":80,"score":74},"pages.admin.posts.audit.msg.cover_image_set",{"url":42,"postId":36,"prompt":44,"source":82,"language":43,"applyMode":44,"assetUsage":83,"generatedAt":44,"promptModel":44,"translationId":44},"manual","post-cover",{"intent":85},{"pushOption":86},"none",{"distribution":88},{"channels":89,"timeline":100},{"memos":90,"wechatsync":92},{"status":91,"lastMode":44,"remoteId":44,"remoteUrl":44,"lastAction":44,"retryCount":71,"activeSince":44,"lastMessage":44,"lastAttemptAt":44,"lastAttemptId":44,"lastFailureAt":44,"lastSuccessAt":44,"lastFinishedAt":44,"lastOperatorId":44,"activeAttemptId":44,"lastFailureReason":44},"idle",{"status":93,"lastMode":44,"remoteId":44,"remoteUrl":44,"lastAction":94,"retryCount":71,"activeSince":44,"lastMessage":95,"lastAttemptAt":96,"lastAttemptId":97,"lastFailureAt":98,"lastSuccessAt":44,"lastFinishedAt":98,"lastOperatorId":45,"activeAttemptId":44,"lastFailureReason":99},"failed","create","WechatSync failed on 1 account(s)","2026-07-23T08:31:42.618Z","E7q5RgvrMHoT5wEGxh","2026-07-23T08:31:44.602Z","auth_failed",[101,172],{"id":97,"mode":44,"action":94,"status":93,"channel":102,"details":103,"message":95,"remoteId":44,"remoteUrl":44,"startedAt":96,"finishedAt":98,"operatorId":45,"triggeredBy":82,"failureReason":99},"wechatsync",{"accounts":104,"observation":109,"failureCount":50,"successCount":71},[105],{"id":106,"error":107,"title":108,"status":93},"weixin","登录态超时，请重新登录","微信公众号",{"events":110,"payload":164,"strategy":170,"resolution":171,"readyEventCount":71,"statusEventCount":49},[111,117,126,132,138,144,150,155,160],{"at":112,"phase":113,"accounts":114,"accountCount":50},"2026-07-23T08:31:42.811Z","dispatch_started",[115],{"id":106,"title":108,"status":116},"pending",{"at":118,"phase":119,"syncId":44,"accounts":120,"accountCount":50,"rawStatusKeys":124},"2026-07-23T08:31:42.818Z","status_received",[121],{"id":106,"msg":122,"title":108,"status":123},"准备同步...","uploading",[125],"accounts",{"at":127,"phase":119,"syncId":44,"accounts":128,"accountCount":50,"rawStatusKeys":131},"2026-07-23T08:31:42.834Z",[129],{"id":106,"msg":130,"title":108,"status":123},"starting",[125],{"at":133,"phase":119,"syncId":44,"accounts":134,"accountCount":50,"rawStatusKeys":137},"2026-07-23T08:31:42.928Z",[135],{"id":106,"msg":136,"title":108,"status":123},"上传图片 1\u002F2",[125],{"at":139,"phase":119,"syncId":44,"accounts":140,"accountCount":50,"rawStatusKeys":143},"2026-07-23T08:31:43.348Z",[141],{"id":106,"msg":142,"title":108,"status":123},"上传图片 2\u002F2",[125],{"at":145,"phase":119,"syncId":44,"accounts":146,"accountCount":50,"rawStatusKeys":149},"2026-07-23T08:31:43.351Z",[147],{"id":106,"msg":148,"title":108,"status":123},"保存中...",[125],{"at":151,"phase":119,"syncId":44,"accounts":152,"accountCount":50,"rawStatusKeys":154},"2026-07-23T08:31:44.286Z",[153],{"id":106,"msg":93,"title":108,"status":123},[125],{"at":156,"phase":119,"syncId":44,"accounts":157,"accountCount":50,"rawStatusKeys":159},"2026-07-23T08:31:44.291Z",[158],{"id":106,"error":107,"title":108,"status":93},[125],{"at":156,"phase":161,"syncId":44,"accounts":162,"accountCount":50},"resolved",[163],{"id":106,"error":107,"title":108,"status":93},{"descLength":165,"renderMode":86,"accountKeys":166,"usesRawPost":29,"contentLength":167,"contentProfile":168,"markdownLength":169},1274,[106],10828,"default",4987,"single_add_task_default_raw","terminal_status",{"id":173,"mode":44,"action":94,"status":93,"channel":102,"details":174,"message":95,"remoteId":44,"remoteUrl":184,"startedAt":261,"finishedAt":262,"operatorId":45,"triggeredBy":82,"failureReason":99},"YCsf6o4YVrXm0D3nSM",{"accounts":175,"observation":185,"failureCount":50,"successCount":50},[176,180],{"id":177,"error":178,"title":179,"status":93},"x","Authorization: Twitter Blue claim is not enabled for article","afflatus404",{"id":181,"title":182,"status":183,"draftLink":184},"xiaohongshu","sora2底价","done","https:\u002F\u002Fcreator.xiaohongshu.com\u002Fpublish\u002Fpublish?from=menu&target=article",{"events":186,"payload":258,"strategy":170,"resolution":171,"readyEventCount":71,"statusEventCount":260},[187,192,198,204,210,216,222,228,234,240,247,253],{"at":188,"phase":113,"accounts":189,"accountCount":56},"2026-07-23T08:15:59.686Z",[190,191],{"id":177,"title":179,"status":116},{"id":181,"title":182,"status":116},{"at":193,"phase":119,"syncId":44,"accounts":194,"accountCount":56,"rawStatusKeys":197},"2026-07-23T08:15:59.694Z",[195,196],{"id":177,"msg":122,"title":179,"status":123},{"id":181,"msg":122,"title":182,"status":123},[125],{"at":199,"phase":119,"syncId":44,"accounts":200,"accountCount":56,"rawStatusKeys":203},"2026-07-23T08:15:59.712Z",[201,202],{"id":177,"msg":130,"title":179,"status":123},{"id":181,"msg":122,"title":182,"status":123},[125],{"at":205,"phase":119,"syncId":44,"accounts":206,"accountCount":56,"rawStatusKeys":209},"2026-07-23T08:15:59.717Z",[207,208],{"id":177,"msg":130,"title":179,"status":123},{"id":181,"msg":130,"title":182,"status":123},[125],{"at":211,"phase":119,"syncId":44,"accounts":212,"accountCount":56,"rawStatusKeys":215},"2026-07-23T08:15:59.743Z",[213,214],{"id":177,"msg":130,"title":179,"status":123},{"id":181,"msg":136,"title":182,"status":123},[125],{"at":217,"phase":119,"syncId":44,"accounts":218,"accountCount":56,"rawStatusKeys":221},"2026-07-23T08:16:02.421Z",[219,220],{"id":177,"msg":93,"title":179,"status":123},{"id":181,"msg":136,"title":182,"status":123},[125],{"at":223,"phase":119,"syncId":44,"accounts":224,"accountCount":56,"rawStatusKeys":227},"2026-07-23T08:16:02.426Z",[225,226],{"id":177,"error":178,"title":179,"status":93},{"id":181,"msg":136,"title":182,"status":123},[125],{"at":229,"phase":119,"syncId":44,"accounts":230,"accountCount":56,"rawStatusKeys":233},"2026-07-23T08:16:04.128Z",[231,232],{"id":177,"error":178,"title":179,"status":93},{"id":181,"msg":142,"title":182,"status":123},[125],{"at":235,"phase":119,"syncId":44,"accounts":236,"accountCount":56,"rawStatusKeys":239},"2026-07-23T08:16:04.131Z",[237,238],{"id":177,"error":178,"title":179,"status":93},{"id":181,"msg":148,"title":182,"status":123},[125],{"at":241,"phase":119,"syncId":44,"accounts":242,"accountCount":56,"rawStatusKeys":246},"2026-07-23T08:16:06.460Z",[243,244],{"id":177,"error":178,"title":179,"status":93},{"id":181,"msg":245,"title":182,"status":123},"completed",[125],{"at":248,"phase":119,"syncId":44,"accounts":249,"accountCount":56,"rawStatusKeys":252},"2026-07-23T08:16:06.462Z",[250,251],{"id":177,"error":178,"title":179,"status":93},{"id":181,"title":182,"status":183,"draftLink":184},[125],{"at":254,"phase":161,"syncId":44,"accounts":255,"accountCount":56},"2026-07-23T08:16:06.463Z",[256,257],{"id":177,"error":178,"title":179,"status":93},{"id":181,"title":182,"status":183,"draftLink":184},{"descLength":165,"renderMode":86,"accountKeys":259,"usesRawPost":29,"contentLength":167,"contentProfile":168,"markdownLength":169},[177,181],10,"2026-07-23T08:15:59.364Z","2026-07-23T08:16:07.033Z",[264],{"url":42,"usage":83,"postId":36,"prompt":44,"source":82,"language":43,"applyMode":44,"generatedAt":44,"promptModel":44,"translationId":44},"2026-07-23T06:26:59.444Z",{"id":45,"name":267,"image":7,"emailHash":268},"lsp","fd39266337fc1497e8b8b24b9211f8ec866c6f13cbe85fae97bb8c7decf66abd",{"id":46,"createdAt":270,"updatedAt":270,"name":271,"slug":271,"description":7,"parentId":44,"language":43,"translationId":271},"2026-07-22T15:10:00.914Z","AI应用",[],{"pushOption":86},[],{"id":276,"slug":277,"title":278,"summary":7,"coverImage":7,"publishedAt":279,"language":43},"67e3ae41a5413856","人性的确认","人性的缺点","2026-07-23T11:25:15.913Z",[],{"code":4,"data":282,"meta":285},{"donationLinks":283,"socialLinks":284,"enabled":29},[],[],{"isLocked":12},{"code":4,"data":287,"message":288},[],"Success",{"code":4,"data":290,"message":288},[],{"code":4,"data":292,"message":288},[],{"code":4,"data":294,"message":288},[]]