构建 Dreim Paper:用于 Reddit 诗歌的 YouTube Shorts 流水线

发布: (2025年12月30日 GMT+8 05:35)
10 min read
原文: Dev.to

I’m happy to translate the article for you, but I’ll need the text of the article itself. Could you please paste the content you’d like translated (excluding any code blocks or URLs you want to keep unchanged)? Once I have the text, I’ll provide the Simplified Chinese translation while preserving the original formatting and markdown.

为什么会有它

我一直在做一个叫 Dreim Paper 的项目,它把 Reddit 上的 r/OCPoetry 社区的诗歌转化为 YouTube Shorts。

r/OCPoetry 是一个充满活力的社区,大家在这里分享原创作品并提供反馈。每月都有成千上万的诗歌被发布——有的经过打磨,有的尚显生涩,但都是真诚的。问题在于,这些帖子大多数在几小时后就会被埋没,可能只被十几个人看到,随后就消失在归档中。

我在 AWS 工作了多年,构建 AI 系统,期间目睹了自动化内容创作工具的爆炸式增长。我看到的大多数自动化都侧重于生成——使用 AI 来创作脚本、配音、视觉效果等。这样固然不错,但我觉得还有空间采用另一种方式:利用自动化 发现并放大已经存在的作品,这些作品是由真实的人创作的。

于是 Dreim Paper 就是这样做的。它是一个半自动化的流水线,处理发现、格式化、录制等繁琐环节,同时将人工策展和创意置于核心位置。

当前架构

1. 每周发现 (Lambda + SNS)

一个 Lambda 函数每周运行一次,抓取 r/OCPoetry 上的新帖子:

# Simplified example
def lambda_handler(event, context):
    poems = scrape_new_poems()

    sns_client.publish(
        TopicArn=SNS_TOPIC_ARN,
        Subject="Weekly Poetry Digest",
        Message=json.dumps(poems, indent=2)
    )

该函数向 SNS 主题发布消息,SNS 会把包含诗歌 ID、标题、作者和内容的 JSON 负载通过邮件发送给我。

2. 手动策展 (Web UI)

我将 JSON 粘贴到一个网页界面中,界面会一次显示一首诗,并带有手写动画效果:

// Core handwriting effect
const animatePoem = (element, text) => {
  element.style.animation = `handwriting ${duration}s steps(${text.length})`;
};

这个策展步骤是有意为之。并不是所有内容都适合该格式——有的诗太长,有的太抽象,有的根本没有共鸣。我并不是想构建一个内容的“消防栓”,而是想打造类似策展画廊的东西。

3. 录制与发布(目前为手动)

现在我会:

  • 录制屏幕,捕捉诗歌动画
  • 编辑剪辑
  • 上传至 YouTube 并注明出处
  • 在 Reddit 上联系作者获取许可

这样可以工作,但非常耗时。

为什么不选 n8n?

看起来 n8n 正在成为年轻人中的潮流。自行托管一个可视化工作流编辑器,将一系列步骤串联起来的想法听起来非常诱人。但我已经有一个 Lambda 函数用来从 Reddit 获取诗歌并写入 DynamoDB,所以只需添加几行用于 SNS 发布调用的代码,比起学习全新的生态系统要更合理。

说实话,对我来说最大的障碍之一就是账户设置和基础设施的开销。

如果有读者在类似的用例中使用了 n8n,我非常想了解这种方法的实际效果。这里面埋藏着一种松耦合‑紧耦合的设计模式——n8n 提供了灵活的组件替换,而 AWS 服务在你已经处于该生态系统时则提供了更紧密的集成。

下一步:Puppeteer + FFmpeg + YouTube API

自然的演进是自动化机械部分,同时保持判断的人工性。

自动录制

const puppeteer = require('puppeteer');
const ffmpeg = require('fluent-ffmpeg');

async function recordPoem(poemData) {
  const browser = await puppeteer.launch({
    headless: false,
    args: ['--window-size=1080,1920'] // Vertical format
  });

  const page = await browser.newPage();
  await page.goto(`https://dreimpaper.com/poem/${poemData.id}`);

  // Start recording with ffmpeg
  const videoPath = `./videos/${poemData.id}.mp4`;
  const ffmpegProcess = startRecording(videoPath);

  // Wait for animation
  await page.waitForTimeout(poemData.duration * 1000);

  ffmpegProcess.kill();
  await browser.close();

  return videoPath;
}

YouTube 上传

const { google } = require('googleapis');
const fs = require('fs');

async function uploadToYouTube(videoPath, poemData) {
  const youtube = google.youtube('v3');

  const response = await youtube.videos.insert({
    part: 'snippet,status',
    requestBody: {
      snippet: {
        title: `"${poemData.title}" by u/${poemData.author}`,
        description: `Original poem by u/${poemData.author} from r/OCPoetry\n\nRead more at: ${poemData.redditUrl}`,
        tags: ['poetry', 'original poetry', 'spoken word'],
      },
      status: { privacyStatus: 'public' }
    },
    media: { body: fs.createReadStream(videoPath) }
  });

  return response.data;
}

作者联络

我可以自动化 Reddit 私信,但那感觉不对。相反,我计划保持半手动,使用生成的草稿:

function generateOutreachMessage(author, poemTitle, videoUrl) {
  return `
Hi u/${author},

I came across your poem "${poemTitle}" on r/OCPoetry and found it really moving.

I run a project that shares poetry from the community. I recorded your poem and posted it here: ${videoUrl}

If you'd prefer I take it down, just let me know—no hard feelings. Otherwise, hope you enjoy seeing your work in this format!

Best,
Matt
`.trim();
}

创作者的关系很重要,所以我仍然会手动发送这些信息。

视觉挑战

目前网站极简——白色背景、黑色手写体文字,并伴有环境铅笔书写音效。我个人觉得观看时很有宣泄感,但它相当普通。

YouTube Shorts 是一种视觉媒介。我见过诗歌频道使用动态背景、动感排版、细腻的动态图形,以及与诗歌基调相匹配的配色方案。下一版 Dreim Paper 将探索:

  • 背景纹理或渐变,与诗歌情绪相辅相成
  • 细微的摄像机平移/缩放,在不分散文字注意力的前提下增加深度
  • 动画插图,与关键句同步出现
  • 改进的音效设计(环境音乐,叠加铅笔书写声)

所有这些都将保持可选,并由我掌控,保留诗歌本身是主角的核心理念。

TL;DR

  • 问题: r/OCPoetry 上的优秀诗歌很快被埋没。
  • 解决方案: 半自动化流水线(发现 → 筛选 → 录制 → 发布),尊重创作者。
  • 当前技术栈: 使用 AWS Lambda + SNS 进行发现,手动网页 UI 进行筛选,手动屏幕录制并上传至 YouTube。
  • 未来技术栈: 使用 Puppeteer + FFmpeg 实现自动录制,YouTube Data API 上传,半手动外联,更丰富的视觉效果。

c 背景、快速转场、AI 生成图像。 这种风格能获得互动,说实话,我也觉得相当吸引人。

问题在于: 我该如何增加视觉趣味,同时不失去这项工作的独特之处?

我正在考虑的选项

1. 精选背景图片

从艺术子版块如 r/HeavyMind 或 r/ImaginaryLandscapes 中获取。挑战:

  • 许可问题变得模糊
  • 存储/带宽成本随内容增长
  • 增加了另一层策展复杂性

2. 生成式背景

使用 p5.js 或 Three.js 创建抽象、不会分散注意力的动画:

// Simple particle system
function draw() {
  particles.forEach(p => {
    p.x += sin(frameCount * 0.01) * 0.5;
    p.y += cos(frameCount * 0.01) * 0.5;
    ellipse(p.x, p.y, 2);
  });
}

进入全屏模式
退出全屏模式

保持一切自包含,没有版权问题。

3. 保持极简

也许简约本身就有价值。并非每段内容都需要成为感官体验。有时让文字呼吸就足够了。

仍在摸索中。

技术栈概览

  • 后端: AWS Lambda (Python) 用于爬取
  • 通知: SNS → Email
  • 前端: 自定义网页 UI 用于策展
  • 计划: Puppeteer + FFmpeg 用于录制
  • 计划: YouTube Data API v3 用于上传

接下来

  • 构建 Puppeteer 录制管道
  • 集成 YouTube API
  • 搭建作者外联工作流
  • 试验视觉增强效果
  • 也许将工具开源,让其他人能够运行类似项目

目标并非大规模扩张,而是创建一个小空间,让优秀的文字能够触达更多读者。如果你有兴趣跟进,或对视觉方向有想法,欢迎与我联系。

链接

  • r/OCPoetry

Matthew 是一名软件工程师,在 DREIM 开发创意软件。曾在 AWS 工作 5 年,专注于 AI/ML 系统。现在致力于为艺术家服务并促进连接的项目。

Back to Blog

相关文章

阅读更多 »