Skip to content
Cloudflare Docs
非官方翻译 - 此文档为非官方中文翻译版本,仅供参考。如有疑问请以 英文官方文档 为准。

使用 Cloudflare Workers AI 的 Whisper-large-v3-turbo

Last reviewed: 2 months ago

在本教程中,您将学习如何:

  • 转录大型音频文件: 使用 Cloudflare Workers AI 的 Whisper-large-v3-turbo 模型执行自动语音识别(ASR)或翻译。
  • 处理大型文件: 将大型音频文件分割成更小的块进行处理,这有助于克服内存和执行时间的限制。
  • 使用 Cloudflare Workers 进行部署: 在无服务器环境中创建可扩展、低延迟的转录管道。

1:创建一个新的 Cloudflare Worker 项目

  1. Sign up for a Cloudflare account.
  2. Install Node.js.

Node.js version manager

Use a Node version manager like Volta or nvm to avoid permission issues and change Node.js versions. Wrangler, discussed later in this guide, requires a Node version of 16.17.0 or later.

您将使用 create-cloudflare CLI (C3) 创建一个新的 Worker 项目。C3 是一个命令行工具,旨在帮助您设置和部署新的应用程序到 Cloudflare。

通过运行以下命令创建一个名为 whisper-tutorial 的新项目:

Terminal window
npm create cloudflare@latest -- whisper-tutorial

运行 npm create cloudflare@latest 将提示您安装 create-cloudflare,并引导您完成设置。C3 还将安装 Wrangler,即 Cloudflare 开发者平台 CLI。

For setup, select the following options:

  • For What would you like to start with?, choose Hello World example.
  • For Which template would you like to use?, choose Worker only.
  • For Which language do you want to use?, choose TypeScript.
  • For Do you want to use git for version control?, choose Yes.
  • For Do you want to deploy your application?, choose No (we will be making some changes before deploying).

这将创建一个新的 whisper-tutorial 目录。您的新 whisper-tutorial 目录将包括:

转到您的应用程序目录:

Terminal window
cd whisper-tutorial

2. 将您的 Worker 连接到 Workers AI

您必须为您的 Worker 创建一个 AI 绑定以连接到 Workers AI。绑定允许您的 Workers 与 Cloudflare 开发者平台上的资源(如 Workers AI)进行交互。

要将 Workers AI 绑定到您的 Worker,请将以下内容添加到 wrangler.toml 文件的末尾:

{
"ai": {
"binding": "AI"
}
}

您的绑定在您的 Worker 代码中的 env.AI可用

3. 配置 Wrangler

在您的 wrangler 文件中,添加或更新以下设置以启用 Node.js API 和 polyfill(兼容性日期为 2024-09-23 或更晚):

{
"compatibility_flags": [
"nodejs_compat"
],
"compatibility_date": "2024-09-23"
}

4. 使用分块处理大型音频文件

src/index.ts 文件的内容替换为以下集成代码。此示例演示了如何:

(1) 从查询参数中提取音频文件 URL。

(2) 在明确遵循重定向的情况下获取音频文件。

(3) 将音频文件分割成更小的块(例如 1 MB 的块)。

(4) 通过 Cloudflare AI 绑定使用 Whisper-large-v3-turbo 模型转录每个块。

(5) 以纯文本形式返回聚合的转录。

import { Buffer } from "node:buffer";
import type { Ai } from "workers-ai";
export interface Env {
AI: Ai;
// 如果需要,添加您的 KV 命名空间以存储转录。
// MY_KV_NAMESPACE: KVNamespace;
}
/**
* 从提供的 URL 获取音频文件并将其分割成块。
* 此函数明确遵循重定向。
*
* @param audioUrl - 音频文件的 URL。
* @returns 一个 ArrayBuffer 数组,每个代表一个音频块。
*/
async function getAudioChunks(audioUrl: string): Promise<ArrayBuffer[]> {
const response = await fetch(audioUrl, { redirect: "follow" });
if (!response.ok) {
throw new Error(`获取音频失败:${response.status}`);
}
const arrayBuffer = await response.arrayBuffer();
// 示例:将音频分割成 1MB 的块。
const chunkSize = 1024 * 1024; // 1MB
const chunks: ArrayBuffer[] = [];
for (let i = 0; i < arrayBuffer.byteLength; i += chunkSize) {
const chunk = arrayBuffer.slice(i, i + chunkSize);
chunks.push(chunk);
}
return chunks;
}
/**
* 使用 Whisper‑large‑v3‑turbo 模型转录单个音频块。
* 该函数将音频块转换为 Base64 编码的字符串,并
* 通过 AI 绑定将其发送到模型。
*
* @param chunkBuffer - 作为 ArrayBuffer 的音频块。
* @param env - Cloudflare Worker 环境,包括 AI 绑定。
* @returns 来自模型的转录文本。
*/
async function transcribeChunk(
chunkBuffer: ArrayBuffer,
env: Env,
): Promise<string> {
const base64 = Buffer.from(chunkBuffer, "binary").toString("base64");
const res = await env.AI.run("@cf/openai/whisper-large-v3-turbo", {
audio: base64,
// 可选参数(如果需要,取消注释并设置):
// task: "transcribe", // 或 "translate"
// language: "en",
// vad_filter: "false",
// initial_prompt: "如果需要,提供上下文。",
// prefix: "转录:",
});
return res.text; // 假设转录结果包括一个 "text" 属性。
}
/**
* 主 fetch 处理程序。它提取 'url' 查询参数,获取音频,
* 以块为单位处理它,并返回完整的转录。
*/
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext,
): Promise<Response> {
// 从查询参数中提取音频 URL。
const { searchParams } = new URL(request.url);
const audioUrl = searchParams.get("url");
if (!audioUrl) {
return new Response("缺少 'url' 查询参数", { status: 400 });
}
// 获取音频块。
const audioChunks: ArrayBuffer[] = await getAudioChunks(audioUrl);
let fullTranscript = "";
// 处理每个块并构建完整的转录。
for (const chunk of audioChunks) {
try {
const transcript = await transcribeChunk(chunk, env);
fullTranscript += transcript + "\n";
} catch (error) {
fullTranscript += "[转录块时出错]\n";
}
}
return new Response(fullTranscript, {
headers: { "Content-Type": "text/plain" },
});
},
} satisfies ExportedHandler<Env>;

5. 部署您的 Worker

  1. 在本地运行 Worker:

    使用 wrangler 的开发模式在本地测试您的 Worker:

Terminal window
npx wrangler dev

打开您的浏览器并转到 http://localhost:8787,或使用 curl:

Terminal window
curl "http://localhost:8787?url=https://raw.githubusercontent.com/your-username/your-repo/main/your-audio-file.mp3"

将 URL 查询参数替换为您的音频文件的直接链接。(对于 GitHub 托管的文件,请确保使用原始文件 URL。)

  1. 部署 Worker:

    测试完成后,使用以下命令部署您的 Worker:

Terminal window
npx wrangler deploy
  1. 测试已部署的 Worker:

    部署后,通过将音频 URL 作为查询参数传递来测试您的 Worker:

Terminal window
curl "https://<your-worker-subdomain>.workers.dev?url=https://raw.githubusercontent.com/your-username/your-repo/main/your-audio-file.mp3"

确保将 <your-worker-subdomain>your-usernameyour-repoyour-audio-file.mp3 替换为您的实际详细信息。

如果成功,Worker 将返回音频文件的转录:

Terminal window
这是音频的转录...