如何开始使用 Fonoster

Fonoster 是一个开源的 Twilio 替代方案,用来构建语音和消息应用。开始使用它需要三步:安装 SDK、用 CLI 创建并部署应用、从免费计划起步验证原型。它提供 NPM 或 CDN 两种 SDK 引入方式,支持浏览器和 Node.js 环境,语音应用可以用 Play、Say、Gather 等动词组合出交互流程。如果你只是想先跑通一个能接电话、能说话的 Demo,免费计划加本地开发环境就够了。

先确认它是不是你要的工具

Fonoster 的定位是“面向企业的语音应用平台”,核心能力包括:

  • 语音应用:把 Play、Say、Gather 等动词作为一等公民,直接编排通话流程
  • 认证:基于 OAuth2 和 JWT 的项目级认证
  • 存储:把音频文件放在 S3 桶里,便于后续分析
  • 语音 API:文本转语音(TTS)和自动语音识别(ASR)
  • SDK 与 CLI:在浏览器或 Node.js 里调用,或用命令行快速创建和部署

如果你的需求是“用代码控制一通电话说什么、听什么、按键后做什么”,它是对口的。如果只是要发短信或做复杂呼叫中心,需要先看它的消息能力和定价档位是否覆盖。

从免费计划开始

官网定价页写得很直接:Free 计划是限速的,用于快速学习和搭起原型应用,包含 1 个 Workspace。

这意味着:

  • 学习和验证阶段不需要先付费
  • 限速意味着不能拿它压生产流量
  • 1 个 Workspace 适合个人或小团队试水

先在免费计划里把“打进一个号码、听到一句问候、按提示按键”跑通,再决定是否升级。

安装 SDK:NPM 或 CDN

官方说明 SDK 可以从 NPM 或 CDN 安装,用在浏览器或 Node.js 应用里。

Node.js 项目:

npm install @fonoster/voice @fonoster/sdk

浏览器项目可以直接用 CDN 引入,适合快速做一个前端 Demo。

写第一个语音应用

下面这段来自官网示例,展示了一个最小可用的语音服务:接听、说一句话、挂断。

const VoiceServer = require("@fonoster/voice").default;

new VoiceServer().listen(async (req, voice) => {
  const { ingressNumber, appRef } = req;
  console.log(`Ingress Number: ${ingressNumber}`);
  console.log(`App Reference: ${appRef}`);

  await voice.answer();
  await voice.say("Hello and goodbye!");
  await voice.hangup();
});

预期结果:应用监听在 tcp://127.0.0.1:50061,有电话呼入时自动接听并播放语音。

本地开发时可以用 ngrok 把端口暴露到公网:

ngrok tcp 50061

这样外部电话才能找到你的本地服务。

用 SDK 主动发起呼叫

除了被动接听,也可以用 @fonoster/sdk 主动创建呼叫:

const { Client, Calls } = require("@fonoster/sdk");

const client = Client({ accessKeyId: "WO00000000000000000000000000000000" });

client.loginWithApiKey("your-api-key", "your-api-secret")
  .then(async () => {
    const response = await new Calls(client).createCall({
      from: "+18287854037",
      to: "+17853178070",
      appRef: "3e61ecb7-a1b6-4a93-84c3-4f1979165bca"
    });
    console.log(response);
  })
  .catch(console.error);

这里的关键输入是 accessKeyId、API key/secret 和 appRef。appRef 指向你部署的语音应用,呼叫接通后会执行那个应用的逻辑。预期结果是控制台打印出呼叫创建成功的响应。

用 CLI 加速创建和部署

官网把 CLI 列为独立能力:用命令行工具快速创建和部署应用。典型流程是:

  1. 用 CLI 初始化一个应用骨架
  2. 在生成的代码里写语音逻辑
  3. 用 CLI 部署,拿到 appRef
  4. 在 SDK 调用或号码配置里引用这个 appRef

这样就不用手动拼装项目结构和部署步骤。

常见卡点

  • 本地服务外部打不进来:127.0.0.1:50061 只有本机可达,开发阶段需要 ngrok 之类的隧道
  • 认证失败:accessKeyId、API key、API secret 三者要配套,缺一个都会登录失败
  • 呼叫创建成功但没声音:检查 appRef 是否指向已部署且逻辑正确的应用
  • 免费计划限速:原型阶段够用,压测或上线前要确认升级后的配额

遇到问题去哪里找支持

官网导航里有 Documentation、Community、Support 三个入口。社区方面,官方提到 Discord 社区已有 300 多名成员,从开源爱好者到电话系统专家都有。文档覆盖应用、认证、存储、SDK、CLI、语音 API 各模块,遇到具体 API 用法先查文档,再进社区问。

建议的起步路径

  1. 注册并从 Free 计划开始
  2. 用 NPM 装 @fonoster/voice 和 @fonoster/sdk
  3. 跑通官网那个“接听—说话—挂断”的最小示例
  4. 用 ngrok 暴露本地端口,打一个真实电话验证
  5. 需要主动外呼时,再用 SDK 的 createCall 配合 appRef
  6. 逻辑变复杂后,改用 CLI 管理创建和部署

按这个顺序走,每一步都有可验证的结果,不会一上来就卡在配置里。

fonoster.com