使用Cloudflare Stream从视频中提取音频

本文详细介绍Cloudflare Stream新推出的音频提取功能,包括两种实现方式:实时媒体转换和直接音频下载,并提供了完整的技术架构说明和代码示例,帮助开发者高效处理音视频内容。

使用Cloudflare Stream从视频中提取音频

Cloudflare Stream热爱视频处理。但我们知道并非每个工作流程都需要完整的视频内容,播客的流行凸显了独立音频的吸引力。对开发者而言,仅为了获取音频而处理视频既缓慢、昂贵又复杂。

为何需要音频提取

视频文件是由高分辨率图像按时间顺序堆叠而成的密集容器,包含每秒帧数、分辨率、编解码器等高维数据。相比之下,音频文件简单得多——如果是单声道,仅定义为单一波形,技术特征由采样率(每秒音频样本数)和位深度(每个样本精度)决定。

随着计算密集型AI推理管道的兴起,许多客户希望执行仅需分析音频的下游工作流程,例如:

  • 增强AI和机器学习:除了翻译和转录,还可将音频输入语音转文本模型进行语音识别、分析或AI驱动的摘要生成
  • 改进内容审核:分析视频中的音频以确保内容安全合规

在这些场景中使用视频数据既昂贵又不必要。

两种灵活的音频提取方法

1. 通过媒体转换实现实时音频提取

媒体转换非常适合处理存储在任意位置的短视频(如社交媒体剪辑)。它通过直接从源获取媒体、在边缘优化并高效交付来工作。我们扩展了此工作流程以支持音频提取——只需在转换URL中添加mode=audio参数,即可从任意位置的视频文件中实时提取音频。

为域名启用媒体转换后,您可以从任何源视频提取音频,甚至可通过指定时间和持续时间来剪辑特定片段。

例如:

1
https://example.com/cdn-cgi/media/mode=audio,time=5s,duration=10s/<SOURCE-VIDEO>

上述请求从源视频的5秒标记处开始生成10秒的M4A音频剪辑。

2. 音频下载

现在您可以直接为Stream中管理的任何内容下载音轨。除了生成可下载的MP4以供离线观看外,现在还可以创建并存储持久的M4A音频文件。

Workers AI演示

以下示例代码演示了如何将媒体转换与Cloudflare的Workers AI结合使用,创建两步流程:首先将视频音频转录为英语,然后翻译成西班牙语。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
export default {
  async fetch(request, env, ctx) {
    // 1. 使用媒体转换仅获取音轨
    const res = await fetch("https://blog.cloudflare.com/cdn-cgi/media/mode=audio/https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/announcing-audio-mode.mp4");
    const blob = await res.arrayBuffer();

    // 2. 使用Whisper将音频转录为文本
    const transcript_response = await env.AI.run(
      "@cf/openai/whisper-large-v3-turbo",
      {
        audio: base64Encode(blob), // @cf/openai/whisper-large-v3-turbo需要base64编码字符串
      }
    );

    // 检查转录是否成功且文本存在
    if (!transcript_response.text) {
      return Response.json({ error: "Failed to transcribe audio." }, { status: 500 });
    }

    // 3. 使用M2M100模型翻译转录文本
    const translation_response = await env.AI.run(
      '@cf/meta/m2m100-1.2b',
      {
        text: transcript_response.text,
        source_lang: 'en', // 源语言(英语)
        target_lang: 'es'  // 目标语言(西班牙语)
      }
    );

    // 4. 返回原始转录和翻译
    return Response.json({
      transcription: transcript_response.text,
      translation: translation_response.translated_text
    });
  }
};

export function base64Encode(buf) {
  let string = '';
  (new Uint8Array(buf)).forEach((byte) => { string += String.fromCharCode(byte) });
  return btoa(string);
}

运行后,worker返回简洁的JSON响应,包含转录和翻译结果。

技术细节

作为Stream团队的暑期实习生,我负责交付这个期待已久的功能。第一步是理解Stream媒体管道的复杂架构。

当视频被Stream处理时,可能遵循两条路径之一:第一条是视频点播(VOD)管道,处理直接上传到Stream的视频,生成并存储一组编码视频段用于自适应比特率流媒体,可通过HLS/DASH流式传输;另一条是实时编码(OTFE)管道,驱动Stream Live和媒体转换服务,不预处理和存储文件,而是从客户自己的网站获取媒体并在边缘执行转换。

我的项目涉及扩展这两个管道以支持音频提取。

OTFE管道

OTFE管道专为实时操作设计。现有流程是为视觉任务设计的。当启用媒体转换的客户在其网站上发出请求时,该请求被路由到我们的边缘服务器(作为入口点),然后验证请求,并根据用户请求,OTFE将获取视频并生成调整大小版本或静态缩略图。

为了支持仅音频提取,我在现有工作流程基础上添加了新模式,涉及:

  • 扩展验证逻辑:特别是对于音频,关键验证步骤是在尝试提取前验证源视频包含音轨
  • 构建新的转换处理器:在OTFE平台内构建专门丢弃视觉轨道的新处理器,以提供高质量的M4A文件

VOD管道

与OTFE工作类似,此项目涉及将当前MP4下载工作流程扩展到仅音频的M4A下载,这带来了一系列有趣的技术决策。

创建视频下载的典型流程从向主API层发出POST请求开始,该层处理身份验证和验证,并创建相应的数据库记录,然后在异步队列中排队作业,由工作进程执行处理任务。

为启用VOD的音频下载,我引入了新的类型特定API端点(POST /downloads/{type}),同时保留传统的POST /downloads路由作为创建默认(或视频)下载类型的别名,确保完全向后兼容。

创建下载的核心工作由我们的异步队列执行,包括:

  • 向消费者添加检测新音频下载类型的逻辑
  • 拉取我们在API层定义的ffmpeg模板,以正确将音频流编码为高质量的M4A容器

通过扩展此管道的每个组件——从API路由到媒体处理命令——我能够交付一个备受期待的新功能,为客户解锁以音频为中心的工作流程!

仪表板截图

我们很高兴地宣布此功能也可在Stream仪表板中使用。只需导航到任何视频,您就会找到下载视频或仅下载音频的选项。

下载准备就绪后,您将看到文件的URL以及禁用的选项。

总结

这个项目解决了长期存在的客户需求,提供了更简单的方式来处理视频中的音频。我衷心感谢这整个旅程——从理解问题到交付解决方案,特别感谢团队在此过程中给予的指导和帮助。我们期待看到开发者如何使用这一新功能在Cloudflare Stream上构建更高效、更令人兴奋的应用程序。

您可以通过上传视频到Stream或使用API来尝试音频提取功能!如果您有兴趣亲自应对这类技术挑战,请探索我们的实习和早期人才计划,开始您自己的旅程。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计