使用 Cloudflare Workers AI 的 Whisper-large-v3-turbo
在本教程中,您将学习如何:
- 转录大型音频文件: 使用 Cloudflare Workers AI 的 Whisper-large-v3-turbo 模型执行自动语音识别(ASR)或翻译。
- 处理大型文件: 将大型音频文件分割成更小的块进行处理,这有助于克服内存和执行时间的限制。
- 使用 Cloudflare Workers 进行部署: 在无服务器环境中创建可扩展、低延迟的转录管道。
- Sign up for a Cloudflare account ↗.
- 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
的新项目:
npm create cloudflare@latest -- whisper-tutorial
yarn create cloudflare whisper-tutorial
pnpm 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
目录将包括:
src/index.ts
中的一个"Hello World"
Worker。- 一个
wrangler.jsonc
配置文件。
转到您的应用程序目录:
cd whisper-tutorial
您必须为您的 Worker 创建一个 AI 绑定以连接到 Workers AI。绑定允许您的 Workers 与 Cloudflare 开发者平台上的资源(如 Workers AI)进行交互。
要将 Workers AI 绑定到您的 Worker,请将以下内容添加到 wrangler.toml
文件的末尾:
{ "ai": { "binding": "AI" }}
[ai]binding = "AI"
您的绑定在您的 Worker 代码中的 env.AI
上可用。
在您的 wrangler 文件中,添加或更新以下设置以启用 Node.js API 和 polyfill(兼容性日期为 2024-09-23 或更晚):
{ "compatibility_flags": [ "nodejs_compat" ], "compatibility_date": "2024-09-23"}
compatibility_flags = [ "nodejs_compat" ]compatibility_date = "2024-09-23"
将 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>;
-
在本地运行 Worker:
使用 wrangler 的开发模式在本地测试您的 Worker:
npx wrangler dev
打开您的浏览器并转到 http://localhost:8787 ↗,或使用 curl:
curl "http://localhost:8787?url=https://raw.githubusercontent.com/your-username/your-repo/main/your-audio-file.mp3"
将 URL 查询参数替换为您的音频文件的直接链接。(对于 GitHub 托管的文件,请确保使用原始文件 URL。)
-
部署 Worker:
测试完成后,使用以下命令部署您的 Worker:
npx wrangler deploy
-
测试已部署的 Worker:
部署后,通过将音频 URL 作为查询参数传递来测试您的 Worker:
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-username
、your-repo
和 your-audio-file.mp3
替换为您的实际详细信息。
如果成功,Worker 将返回音频文件的转录:
这是音频的转录...
- @2025 Cloudflare Ubitools
- Cf Repo