使用 Supabase 进行流式传输和缓存
使用 Supabase 进行流式传输和缓存
通过 Supabase Edge Functions 生成和流式传输语音。在 Supabase Storage 中存储语音,并通过内置 CDN 缓存响应。
操作指南 · 假设你已完成 ElevenAPI 快速入门,并拥有 Supabase 账户。
简介
本指南将介绍如何使用 Supabase Edge Functions、Supabase Storage 和 ElevenLabs 构建边缘 API,以生成、流式传输、存储和缓存语音。
要求
- 拥有 API 密钥的 ElevenLabs 账户。
- Supabase 账户(可通过 database.new 免费注册)。
- 在本机安装 Supabase CLI。
- 在本机安装 Deno runtime,也可选择在常用 IDE 中进行设置。
设置
在本地创建 Supabase 项目
安装 Supabase CLI 后,运行以下命令在本地创建新的 Supabase 项目:
配置存储桶
可以通过在 config.toml 文件中添加以下配置,让 Supabase CLI 自动生成存储桶:
运行 supabase start 后,本地 Supabase 项目中将创建新的存储桶。如需将其推送到托管的 Supabase 项目,可运行 supabase seed buckets --linked。
为 Supabase Edge Functions 配置后台任务
要在本地开发时使用 Supabase Edge Functions 的后台任务,需要在 config.toml 文件中添加以下配置:
使用 per_worker 策略运行时,Function 不会在编辑后自动重新加载。需要通过运行 supabase functions serve 手动重启。
为语音生成创建 Supabase Edge Function
运行以下命令创建新的 Edge Function:
如果使用 VS Code 或 Cursor,当 CLI 提示“Generate VS Code settings for Deno? [y/N]”时,选择 y!
设置环境变量
在 supabase/functions 目录中创建新的 .env 文件,并添加以下变量:
依赖项
项目使用以下依赖项:
- 用于与 Supabase 数据库交互的 @supabase/supabase-js 库。
- 用于与文本转语音 API 交互的 ElevenLabs JavaScript SDK。
- 用于从请求参数生成哈希值的开源 object-hash。
由于 Supabase Edge Function 使用 Deno runtime,无需安装依赖项,而是可通过 npm: 前缀导入它们。
编写 Supabase Edge Function
在新创建的 supabase/functions/text-to-speech/index.ts 文件中添加以下代码:
代码详解
代码中有几个值得注意的地方。让我们逐步了解。
处理传入请求
使用 Deno.serve 处理程序处理传入请求。演示中未验证请求来源,但你可以验证请求来源,或附加用户访问令牌并通过 Supabase Auth 进行验证。
函数从传入请求中提取 text 和 voiceId 参数。voiceId 参数是可选的,默认使用 ElevenLabs 的“Allison”音色 ID。
函数使用 object-hash 库根据请求参数生成哈希值。此哈希值用于检查 Supabase Storage 中是否已有音频文件。
检查 Supabase Storage 中是否已有音频文件
Supabase Storage 内置智能 CDN,可轻松缓存和提供文件。
此处,函数会检查 Supabase Storage 中是否已有音频文件。如果文件存在,函数将从 Supabase Storage 返回该文件。
本地运行
要在本地运行函数,请执行以下命令:
本地 Supabase 环境启动并运行后,执行以下命令启动函数并查看日志:
试用
访问 http://127.0.0.1:54321/functions/v1/text-to-speech?text=hello%20world,体验函数效果。
随后访问 http://127.0.0.1:54323/project/default/storage/buckets/audio,查看本地 Supabase Storage 存储桶中的音频文件。
部署到 Supabase
如果尚未创建 Supabase 账户,请前往 database.new 创建,并将本地项目关联到 Supabase 账户:
完成后,运行以下命令部署函数:
设置函数密钥
现在已在本地设置所有密钥,可以运行以下命令在 Supabase 项目中设置密钥:
测试函数
该函数的设计方式使其可直接作为 <audio> 元素的源使用。