RealtimeKit 提供两种由 Cloudflare Workers AI 支持的转录模式:
| 模式 | 模型 | 处理时间 | 使用场景 |
|---|---|---|---|
| 实时 | Deepgram Nova-3 | 会议期间 | 为参会者提供实时字幕 |
| 会后 | Whisper Large v3 Turbo | 会议结束后 | 转录文件和 Webhook |
RealtimeKit 分别处理每个参与者的音频流。这有助于在最终转录文本中识别每个发言者。
我们建议升级到 Workers Paid 计划,以避免 Free 计划中的 Workers AI 处理限制。在计费和 Free 计划限制中了解更多信息。
实时转录将参与者的音频流式传输到 Workers AI 上的 Deepgram Nova-3,并在会议期间向会议参与者发送转录事件。
您可以通过在参与者的预设(preset)中设置 permissions.transcription_enabled: true 来为参与者开启实时转录。这允许您决定转录哪些参与者的音频。例如,您可以转录发言者的音频,而不转录观众的音频。
要更新现有预设,请使用更新预设 API:
curl -X PATCH "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/presets/$PRESET_ID" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"permissions": {
"transcription_enabled": true
}
}'要创建预设,请参阅创建预设 API 参考。
RealtimeKit 仅为使用启用了 permissions.transcription_enabled: true 的预设加入的参与者转录音频。
在会议期间,RealtimeKit 会将转录更新流式传输到客户端 SDK。要从 meeting.ai.transcripts 访问现有转录,或使用 meeting.ai.on("transcript", ...) 监听新的转录事件,请参阅获取实时转录。
预设控制转录谁的音频。会议配置控制 RealtimeKit 如何转录该音频。使用 ai_config.transcription 设置所说语言、提高对自定义术语的识别度,并控制特定会议的脏话过滤。
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/meetings" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Weekly product review",
"ai_config": {
"transcription": {
"language": "en-US",
"keywords": ["RealtimeKit", "Cloudflare"],
"profanity_filter": false
}
}
}'| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
language |
string | en-US |
转录的语言代码 |
keywords |
string[] | [] |
提高识别度的术语(名称、术语) |
profanity_filter |
boolean | false |
过滤冒犯性语言 |
实时转录由 Workers AI 上的 Deepgram Nova-3 提供支持。
Workers AI 上的 Nova-3 支持以下转录语言:
| 语言 | 代码 |
|---|---|
| 英语 | en, en-US, en-AU, en-GB, en-IN, en-NZ |
| 西班牙语 | es, es-419 |
| 法语 | fr, fr-CA |
| 德语 | de, de-CH |
| 印地语 | hi |
| 俄语 | ru |
| 葡萄牙语 | pt, pt-BR, pt-PT |
| 日语 | ja |
| 意大利语 | it |
| 荷兰语 | nl |
使用 multi 可自动检测上述所有语言的多种语言内容。
如果未指定语言,模型默认使用 en-US。为获得最佳准确度,请显式设置与音频匹配的语言代码。
实时转录向客户端 SDK 发送临时(interim)和最终(final)转录更新。将临时更新用于实时字幕,将最终更新用于转录历史记录或保存的 UI 状态。
// 获取客户端已收到的转录条目。
const transcripts = meeting.ai.transcripts;
// 监听会议期间的转录更新。
meeting.ai.on("transcript", (transcript) => {
if (transcript.isPartialTranscript) {
updateLiveCaption(transcript.peerId, transcript.transcript);
return;
}
appendFinalTranscript(transcript);
});{
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "Alice",
"peerId": "4f5g6h7i-8j9k-0lmn-opqr-1234567890st",
"userId": "uvwxyz-1234-5678-90ab-cdefghijklmn",
"customParticipantId": "abc123xyz",
"transcript": "Hello everyone",
"isPartialTranscript": false,
"timestamp": 1716700000000
}| 字段 | 描述 |
|---|---|
id |
唯一转录条目 ID |
name |
发言参与者的显示名称 |
peerId |
发言参与者的 Peer ID。如果他们重新加入,该 ID 会改变。 |
userId |
持久参与者 ID |
customParticipantId |
添加参与者时设置的参与者标识符 |
transcript |
转录的文本 |
isPartialTranscript |
对于临时更新为 true,对于最终更新为 false |
timestamp |
以毫秒为单位的 Unix 时间戳 |
会后转录在会议结束后使用 Workers AI 上的 Whisper Large v3 Turbo 生成转录文本,并通过 Webhook 或 REST API 进行交付。为了识别发言者,RealtimeKit 在创建最终转录文本之前,会分别处理每个参与者的音频。
您可以在创建会议时开启会后转录。设置 transcribe_on_end: true 以在会议结束后生成转录文本。要在转录文本可用后自动生成总结,还要设置 summarize_on_end: true。
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/meetings" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Weekly product review",
"transcribe_on_end": true,
"summarize_on_end": true,
"ai_config": {
"transcription": {
"language": "en"
}
}
}'使用 ai_config.transcription.language 设置转录语言。有关支持的值,请参阅会后支持的语言。如果未设置 transcribe_on_end,RealtimeKit 将不会生成会后转录文本。
会后转录支持 Whisper Large v3 Turbo 语言代码。省略 ai_config.transcription.language 可让 Whisper 自动检测所说语言。
常用语言代码包括:
| 语言 | 代码 | 语言 | 代码 | 语言 | 代码 |
|---|---|---|---|---|---|
| 英语 | en |
西班牙语 | es |
法语 | fr |
| 德语 | de |
印地语 | hi |
葡萄牙语 | pt |
| 日语 | ja |
意大利语 | it |
荷兰语 | nl |
| 俄语 | ru |
中文 | zh |
粤语 | yue |
其他会后语言代码
| 语言 | 代码 |
|---|---|
| 南非荷兰语 | af |
| 阿尔巴尼亚语 | sq |
| 阿姆哈拉语 | am |
| 阿拉伯语 | ar |
| 阿萨姆语 | as |
| 阿塞拜疆语 | az |
| 巴什基尔语 | ba |
| 巴斯克语 | eu |
| 白俄罗斯语 | be |
| 孟加拉语 | bn |
| 波斯尼亚语 | bs |
| 布列塔尼语 | br |
| 保加利亚语 | bg |
| 加泰罗尼亚语 | ca |
| 克罗地亚语 | hr |
| 捷克语 | cs |
| 丹麦语 | da |
| 爱沙尼亚语 | et |
| 法罗语 | fo |
| 芬兰语 | fi |
| 加利西亚语 | gl |
| 格鲁吉亚语 | ka |
| 希腊语 | el |
| 古吉拉特语 | gu |
| 海地克里奥尔语 | ht |
| 豪萨语 | ha |
| 夏威夷语 | haw |
| 希伯来语 | he |
| 匈牙利语 | hu |
| 冰岛语 | is |
| 印度尼西亚语 | id |
| 爪哇语 | jw |
| 卡纳达语 | kn |
| 哈萨克语 | kk |
| 高棉语 | km |
| 韩语 | ko |
| 老挝语 | lo |
| 拉丁语 | la |
| 拉脱维亚语 | lv |
| 林加拉语 | ln |
| 立陶宛语 | lt |
| 卢森堡语 | lb |
| 马其顿语 | mk |
| 马达加斯加语 | mg |
| 马来语 | ms |
| 马拉雅拉姆语 | ml |
| 马耳他语 | mt |
| 毛利语 | mi |
| 马拉地语 | mr |
| 蒙古语 | mn |
| 缅甸语 | my |
| 尼泊尔语 | ne |
| 挪威语 | no |
| 新挪威语 | nn |
| 奥克语 | oc |
| 普什图语 | ps |
| 波斯语 | fa |
| 波兰语 | pl |
| 旁遮普语 | pa |
| 罗马尼亚语 | ro |
| 梵语 | sa |
| 塞尔维亚语 | sr |
| 绍纳语 | sn |
| 信德语 | sd |
| 僧伽罗语 | si |
| 斯洛伐克语 | sk |
| 斯洛文尼亚语 | sl |
| 索马里语 | so |
| 巽他语 | su |
| 斯瓦希里语 | sw |
| 瑞典语 | sv |
| 塔加洛语 | tl |
| 塔吉克语 | tg |
| 泰米尔语 | ta |
| 塔塔尔语 | tt |
| 泰卢固语 | te |
| 泰语 | th |
| 藏语 | bo |
| 土库曼语 | tk |
| 土耳其语 | tr |
| 乌克兰语 | uk |
| 乌尔都语 | ur |
| 乌兹别克语 | uz |
| 越南语 | vi |
| 威尔士语 | cy |
| 意第绪语 | yi |
| 约鲁巴语 | yo |
会后转录支持多种格式。在应用程序工作流中使用 CSV 或 JSON,在需要字幕文件时使用 SRT 或 VTT。
| 格式 | 使用场景 |
|---|---|
| CSV | 电子表格和数据分析 |
| JSON | 程序化访问 |
| SRT | 视频字幕文件 |
| VTT | Web 视频字幕(<track> 元素) |
"1000","peer-123","user-456","cust-789","Alice","Hello everyone"
"3000","peer-234","user-567","cust-890","Bob","Hi Alice"CSV 行使用以下字段顺序:以毫秒为单位的开始时间、peer ID、user ID、自定义参与者 ID、参与者名称和转录文本。
[
{
"startTime": 1000,
"endTime": 2500,
"sentence": "Hello everyone",
"peerData": {
"id": "peer-123",
"userId": "user-456",
"displayName": "Alice",
"cpi": "cust-789",
"joinedAt": "2024-08-07T10:15:29.000Z",
"leftAt": ""
}
}
]1
00:00:01,000 --> 00:00:02,500
Alice: Hello everyone
2
00:00:03,000 --> 00:00:04,500
Bob: Hi Alice在 RealtimeKit 完成会后转录处理后,您可以通过 Webhook 接收转录下载 URL,或使用 REST API 获取它。对于异步后端工作流,请使用 Webhook;当您需要检索特定会话的转录时,请使用 REST API。
在 RealtimeKit Webhook 中配置 meeting.transcript 事件:
{
"event": "meeting.transcript",
"meeting": {
"id": "bbb8940e-1b97-402a-97d6-2708b7feca41",
"title": "Weekly sync",
"endedAt": "2026-06-03T10:30:00.000Z",
"createdAt": "2026-06-03T10:00:00.000Z",
"sessionId": "05e57591-d89e-45c9-ae44-08dc1eaad0e0",
"startedAt": "2026-06-03T10:00:00.000Z",
"status": "LIVE",
"organizedBy": {
"id": "c94c437b-592a-4a39-b9e2-47ef1451e43b",
"name": "Example organization"
}
},
"transcriptDownloadUrl": "https://example.com/transcript.csv",
"transcriptDownloadUrlExpiry": "2026-06-10T10:30:00.000Z"
}请参阅获取会话的完整转录文本。
curl -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/sessions/$SESSION_ID/transcript" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"转录文本在会议结束后保留 7 天。请在 Webhook 或 REST API 返回的 URL 过期时间之前下载或复制转录文件。
RealtimeKit 的默认转录功能会记录每个参与者的音频轨道,并使用 Workers AI 对其进行处理。Workers AI 的使用费将根据音频模型定价记入您的 Cloudflare 账户,该定价按参与者的音频分钟数计算,而非会议时长。
在 Workers Free 计划中,Workers AI 每天包含 10,000 个 Neurons。要每天使用超过 10,000 个 Neurons,请升级到 Workers Paid 计划。Workers Paid 包含相同的每日 10,000 个免费 Neurons,超出后的使用量按每 1,000 个 Neurons $0.011 计费。
您可以在 Cloudflare 仪表板的 **Manage account(管理账户)**下升级到 Workers Paid 计划。
RealtimeKit 转录使用以下 Workers AI 音频模型费率:
| 转录模式 | Workers AI 模型 | 每音频分钟 Neurons 数 |
|---|---|---|
| 会后 | @cf/openai/whisper-large-v3-turbo |
46.63 |
| 实时 | @cf/deepgram/nova-3 WebSocket |
836.36 |
RealtimeKit 转录是一项托管转录工作流。当开启转录时,RealtimeKit 会使用 Workers AI 处理参与者的音频,并将转录输出存储在 RealtimeKit 托管的存储空间中。
对于实时转录,RealtimeKit 会将启用了转录的参与者的音频流式传输到 Workers AI,并在会议期间向会议参与者发送转录更新。
对于会后转录,RealtimeKit 会在会议结束后分别处理每个参与者的音频,创建最终的转录文件,并通过 Webhook 或 REST API 提供这些文件。