mcpField
S
sinch-voice-api

sinch-voice-api

github.com/sinch其他11203 次安装4 周前更新
代码仓库

关于 sinch-voice-api

sinch-voice-api 是用于开发 Sinch Voice API v1 集成的 Agent 技能,面向实现可编程通话的开发者。它涵盖 REST 操作和基于 SVAML 的通话流程,并明确区分 v1 与独立的 Voice API 2.0 预览版。

主要功能

  1. 01以编程方式发起和控制通话
  2. 02SVAML 通话流程动作与指令
  3. 03ICE、ACE、DiCE 和 PIE 回调指引
  4. 04语音与会议通话呼叫
  5. 05区域 API 端点指引

适用场景

  1. 01创建文本转语音呼叫
  2. 02处理接听和 DTMF 回调
  3. 03管理进行中的通话和会议参与者

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sinch/skills --skill sinch-voice-api

安装后在 Claude Code 中输入/sinch-voice-api确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
callbacks.md
shared-policy.md
svaml.md
references/examples/
dotnet.md
java.md
nodejs.md
python.md
scripts/
get_call_info.cjs
list_numbers.cjs
make_conference_call.cjs
make_tts_call.cjs
scripts/common/
voice_client.cjs

详细介绍

Sinch Voice API

概述

Sinch Voice API 让你通过 REST 以编程方式发起、接收和控制语音通话。它使用 SVAML(Sinch Voice Application Markup Language)通过回调事件定义通话流程。

版本范围:仅限 Voice API v1。 此技能涵盖 /calling/v1 API、其 SVAML 方言以及 ICE/ACE/PIE/DiCE 回调。Sinch 还提供 Voice API 2.0,目前处于公开预览阶段,API 结构有所不同。如果用户询问 Voice 2.0、v2 端点或预览版 API,请勿套用以下 v1 指南。请改为加载 sinch-voice-api-v2 技能。

Agent 指令

策略门禁 sinch-shared-policy@5(sha256:4864cf0fa8d6): 以下策略摘要具有约束力,必须按原文执行。在实现或实时执行之前,每次对话都要阅读完整的 Sinch 共享策略一次;如果已加载完全相同的 ID/版本/指纹,则跳过;如果版本更新或指纹不同,则阅读。此技能的规范操作路由位于其 Agent 指令和链接部分。

Sinch 策略摘要(具有约束力):

  1. 每次对话加载一次共享策略;跳过 ID/版本/指纹相同的重复副本。
  2. 根据请求和工作区推断产品、语言、区域和环境;只有在确实存在阻碍时,才提出一个综合问题。优先使用官方 Sinch SDK,除非请求或工作区另有决定,或没有官方 SDK 支持相应语言或操作。
  3. 批准生成代码不等于批准执行。对每项操作分类(只读/可逆/计费/破坏性),并在进行计费或破坏性调用前取得明确批准。
  4. B 级事实——端点路径、方法、字段名称、枚举值、限制、Webhook 载荷、签名算法、SDK 签名——使用前必须在当前会话中获取确切的规范文档。
  5. 随附脚本、参考资料和示例属于 C 级内容:仅作说明,不能作为架构依据。绝不能将示例值提升为生产默认值。
  6. 如果路由未解决或规范文档获取失败,必须按顺序沿解析流程逐步处理:重新搜索已获取的文档(原始内容,不得使用摘要)、查阅 https://developers.sinch.com/llms.txt、访问第一方链接、重试一次——然后才停止处理。绝不能猜测文档 URL,也绝不能用记忆、搜索摘要或随附文件替代。
  7. 保留证据台账,将每个获取的来源映射到其授权使用的字段和声明。
  8. 限制所有轮询和重试(退避、抖动、硬性上限);重试计费或破坏性操作前检查状态;超时应报告为未知,而不是失败。
  9. 分别报告验证级别(lint → unit → mock contract → sandbox → live → end-to-end);HTTP 2xx 不代表已送达。说明未执行的级别。
  10. 仅加载负责相应行为所需的最小技能集;如果所需技能不可用,应指出该技能并停止,不得自行编造指令。

生成代码前,向用户收集以下信息(提示或上下文中已说明的项目除外):

  1. 方式——SDK 还是直接调用 API(curl/fetch/requests)?
  2. 语言——使用 SDK 时:Node.js、Python、Java 还是 .NET。直接调用 API 时:任意语言或 curl。

用户选择 SDK 时,请参考 sinch-sdks 技能,了解安装和客户端初始化;然后参考随附示例以及“链接”中链接的 SDK 参考资料。

用户选择直接调用 API时,请参考“链接”中链接的 Voice API Reference,了解请求/响应架构。

安全性:有关 URL 获取策略、入站回调内容处理和凭据处理,请参阅下方的“安全性”部分。

事实来源——加载哪些内容,以及哪些内容具有权威性

此技能包含三类可靠性各不相同的内容。请按以下优先级处理:

  1. developers.sinch.com 上的规范文档(权威)。 此技能中的 .md 文档链接是请求/响应架构、字段名称和嵌套结构、枚举值、签名/身份验证方案及限制的唯一事实来源。在编写构造有效负载、验证签名或解析回调/响应的代码之前,请先获取相应链接文档,并确认其中的确切结构。根据安全/URL 政策,允许获取 developers.sinch.com 第一方 URL。切勿臆造、猜测或按模式推断文档 URL——只获取此技能中逐字列出的文档 URL,或通过已获取页面上的链接访问的 URL;域名可信,不代表猜测的路径真实存在。
  2. 捆绑的 references/*.md(导航摘要——非权威)。 这些内容为你提供方向,并指向正确的规范文档;但可能已过时、遗漏字段或简化嵌套结构。用它们来确定要构建什么,以及要打开哪篇文档。不得在未通过第 1 级文档确认的情况下,将参考资料或 SKILL.md 概述中的字段名称、嵌套结构、编码或枚举直接写入交付代码。如果某项细节只出现在摘要中,应将其视为未经核实,并明确说明。
  3. 捆绑的 scripts/**(执行工具——不是架构参考)。 这些是可运行的辅助工具,可在无需编写应用代码时执行任务(例如创建 webhook、发送测试消息、列出资源)。运行它们来完成操作。不得将其中的有效负载字面值或逻辑复制到新代码库中,并将其当作规范。编写代码时,忽略这些脚本,并以第 1 级资料为准。

简要规则:执行一次性任务 → 运行脚本。编写代码 → 加载文档。 切勿引用只在摘要或脚本中看到的确切字段、标头、枚举或编码。

入门

Agent 凭证处理

将凭证存储在环境变量中,切勿在命令或源代码中硬编码应用密钥或机密:

export SINCH_APPLICATION_KEY="your-application-key"
export SINCH_APPLICATION_SECRET="your-application-secret"
身份验证

进行 API 调用时,请确保正确设置身份验证标头。Voice API 使用应用密钥 + 应用机密(而非项目级 OAuth2):

-u "$SINCH_APPLICATION_KEY:$SINCH_APPLICATION_SECRET"

完整设置说明请参阅 sinch-authentication 技能。

  • Basic Auth:Authorization: Basic base64(APPLICATION_KEY:APPLICATION_SECRET) (仅为摘要——实现前请根据权威的 Authentication Guide 文档确认确切名称/编码/枚举。)
  • 签名请求(生产环境):HMAC-SHA256 签名。请参阅 Authentication Guide。
基础 URL
区域基础 URL
全球(默认)https://calling.api.sinch.com
北美https://calling-use1.api.sinch.com
欧洲https://calling-euc1.api.sinch.com
东南亚 1https://calling-apse1.api.sinch.com
东南亚 2https://calling-apse2.api.sinch.com
南美https://calling-sae1.api.sinch.com

配置端点(号码、回调)使用:https://callingapi.sinch.com

SDK 安装

有关所有语言的安装和客户端初始化,请参阅 sinch-sdks。

首次 API 调用:TTS 外呼
curl -X POST \
  "https://calling.api.sinch.com/calling/v1/callouts" \
  -u "$SINCH_APPLICATION_KEY:$SINCH_APPLICATION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "ttsCallout",
    "ttsCallout": {
      "destination": { "type": "number", "endpoint": "+14045005000" },
      "cli": "+14045001000",
      "locale": "en-US",
      "text": "Hello! This is a test call from Sinch."
    }
  }'

Node.js SDK:

import { SinchClient } from "@sinch/sdk-core";

const sinch = new SinchClient({
  applicationKey: "{APPLICATION_KEY}",
  applicationSecret: "{APPLICATION_SECRET}",
});

const response = await sinch.voice.callouts.tts({
  ttsCalloutRequestBody: {
    destination: { type: "number", endpoint: "+14045005000" },
    cli: "+14045001000",
    locale: "en-US",
    text: "Hello! This is a test call from Sinch.",
  },
});
console.log("Call ID:", response.callId);

更多示例请参阅 Callouts Reference 或捆绑示例。

核心概念

SVAML(Sinch Voice Application Markup Language)

SVAML 控制呼叫流程。每个 SVAML 响应都包含:

  • instructions(数组):多个任务 — 播放音频、录音、设置 Cookie
  • action(对象):恰好一个路由/控制操作

完整参考:SVAML Actions | SVAML Instructions | 打包的 SVAML 参考

操作(每个响应一个)
操作描述
hangup结束呼叫
continue继续呼叫设置(ACE 响应,用于继续而不重新路由)
connectPstn连接到 PSTN 号码。支持 amd,用于应答机器检测
connectMxp连接到 Sinch SDK(应用内)端点
connectConf通过 conferenceId 连接到会议室
connectSip连接到 SIP 端点
connectStream连接到 WebSocket 服务以实时流式传输音频(封闭 Beta — 联系 Sinch 启用)
runMenu带 DTMF 收集功能的 IVR 菜单(支持通过 enableVoice 输入语音)
park停放(保持)呼叫并循环播放提示词

(仅为摘要 — 实施前请对照权威的 SVAML Actions 文档,确认准确的名称、编码和枚举值。)

指令(每个响应可有多个)
指令描述
playFiles播放音频文件、通过 #tts[] 使用 TTS、通过 #ssml[] 使用 SSML
say合成并播放文本转语音
sendDtmf发送 DTMF 音
setCookie在会话的回调事件之间持久保存键值状态
answer接听呼叫(向 INVITE 发送 SIP 200 OK,从而开始计费)。对尚未接听的呼叫播放提示词前必须执行
startRecording开始录音。支持通过 transcriptionOptions 自动转录
stopRecording停止正在进行的录音

(仅为摘要 — 实施前请对照权威的 SVAML Instructions 文档,确认准确的名称、编码和枚举值。)

回调事件
事件触发条件SVAML 响应
ICESinch 平台收到呼叫是
ACE被叫方接听呼叫是
DiCE呼叫断开否(即发即弃,仅用于日志记录)
PIE来自 runMenu 的 DTMF/语音输入是
Notify通知(例如,录音完成)否

事件架构请参阅回调参考,完整字段表和 JSON 示例请参阅打包的回调参考。

呼出类型
方法用例
ttsCallout呼叫并播放合成语音。支持 text 或高级 prompts(#tts[]、#ssml[]、#href[])
conferenceCallout呼叫并连接到会议室
customCallout通过内联 ICE/ACE/PIE 实现完整的 SVAML 控制

(仅为摘要 — 实施前请对照权威的 Callouts 文档,确认准确的名称、编码和枚举值。)

呼出标志:enableAce(默认 false)、enableDice(默认 false)、enablePie(默认 false)控制触发哪些回调。

REST 端点

以 /calling/v1/ 开头的路径使用上表中的区域基础 URL。以 /v1/configuration/ 开头的路径使用 https://callingapi.sinch.com。

方法端点描述
POST/calling/v1/callouts发起外呼(TTS、会议或自定义)
PATCH/calling/v1/calls/id/{callId}使用 SVAML 更新进行中的通话(仅限 PSTN/SIP)
GET/calling/v1/calls/id/{callId}获取通话信息
PATCH/calling/v1/calls/id/{callId}/leg/{callLeg}管理通话分支(仅限 PlayFiles/Say)
GET/calling/v1/conferences/id/{conferenceId}获取会议信息
DELETE/calling/v1/conferences/id/{conferenceId}移除所有参与者
PATCH/calling/v1/conferences/id/{conferenceId}/{callId}静音/取消静音/保持参与者
DELETE/calling/v1/conferences/id/{conferenceId}/{callId}移除指定参与者
GET/v1/configuration/numbers列出号码及其功能
POST/v1/configuration/numbers将号码分配给应用
DELETE/v1/configuration/numbers取消分配号码
GET/POST/v1/configuration/callbacks/applications/{applicationkey}获取/更新回调 URL

常见模式

IVR 菜单(SVAML)
{
  "instructions": [
    { "name": "setCookie", "key": "step", "value": "ivr" }
  ],
  "action": {
    "name": "runMenu",
    "mainMenu": "main",
    "menus": [{
      "id": "main",
      "mainPrompt": "#tts[Press 1 for sales or 2 for support.]",
      "options": [
        { "dtmf": 1, "action": "return(sales)" },
        { "dtmf": 2, "action": "return(support)" }
      ]
    }]
  }
}
带录音的会议
{
  "instructions": [
    { "name": "startRecording", "options": { "notificationEvents": true } }
  ],
  "action": {
    "name": "connectConf",
    "conferenceId": "myRoom",
    "moh": "ring"
  }
}
带 AMD 的 PSTN 转接
{
  "action": {
    "name": "connectPstn",
    "number": "+14045009000",
    "cli": "+14045001000",
    "maxDuration": 3600,
    "amd": { "enabled": true }
  }
}

注意事项和最佳实践

  1. 回调 URL 必须可公开访问。 本地开发时使用 ngrok。在 Dashboard 的 Voice 应用设置中进行配置。
  2. 每个 SVAML 响应只能执行一个操作。 可以包含多条指令。若要依次执行多个操作,请链接回调(ICE → ACE → PIE)。
  3. 应用内目标不会收到 ACE。 目标类型为 username 时不会发出 ACE,只有 PSTN/SIP 目标才会发出。对于应用内目标,设置 enableAce: true 不会产生任何效果。
  4. DiCE 是即发即弃的。 它仅用于传递信息,不需要 SVAML 响应。可用于日志记录或清理。
  5. 区域端点很重要。 区域错误会增加延迟。会议室有区域范围限制——跨区域会议时,请强制所有参与者使用同一区域。
  6. 指令顺序很重要。 数组顺序就是执行顺序。将 answer 放在 playFiles 之前;将 startRecording 放在连接操作之前。
  7. 通话时长上限:14400 秒(4 小时)。 在 connectPstn/connectSip 上设置 maxDuration,即可缩短时长限制。
  8. 在生产环境中验证回调签名。 Authorization 标头中包含 HMAC-SHA256 签名。请参阅回调签名。
  9. 使用 setCookie 保存状态。 它会在一次通话会话中的 ICE、ACE、PIE、DiCE 之间传递键值对。
  10. connectMxp 不支持录音。 与 connectMxp 配合使用时,startRecording/stopRecording 指令会被忽略。
  11. runMenu 的默认值。 barge:true(提示词播放期间接受输入)。timeoutMills:5000 毫秒。
  12. connectPstn 上的 AMD。 使用 amd: { enabled: true, async: true/false } 检测应答机。
  13. startRecording 转录。 使用 transcriptionOptions: { enabled: true, locale: "en-US" } 进行自动转录。
  14. 会议 DTMF 选项。 在 conferenceCallout/connectConf 上使用 conferenceDtmfOptions,支持以下模式:ignore(默认)、forward、detect(发送 PIE)。(仅为摘要——实施前请根据权威的 SVAML Actions 文档确认准确名称、编码和枚举值。)
  15. TTS 外呼必须设置 cli 才能接通。 API 接受未提供 cli 参数的 TTS 外呼请求并返回通话 ID,但通话永远不会接通目标号码。cli 是来电显示的号码——请使用已验证号码或 Dashboard 分配的号码,并采用 E.164 格式(例如 "+14151112223333")。如需测试,请在 Sinch Dashboard 注册并使用分配给应用的免费号码。请参阅分配号码。

安全性

  • API 密钥处理 — 切勿暴露 SINCH_APPLICATION_KEY,尤其切勿在客户端代码、日志或已提交的源代码中暴露 SINCH_APPLICATION_SECRET。Application Secret 用于对请求进行 HMAC-SHA256 签名并验证回调签名;如果 Secret 泄露,攻击者就能通过你的账户发起外呼(存在话费欺诈风险),并伪造 ICE/ACE/PIE 回调。请从环境变量或 Secret 管理器加载。通话录音和转录文本都属于个人身份信息(PII),应实施适当的数据保留和访问控制。如果 Secret 泄露,请通过 Sinch Build Dashboard 轮换。
  • URL 抓取策略 — 仅抓取来自可信第一方域名(developers.sinch.com、dashboard.sinch.com)的 URL。除非明确设置允许列表,否则不要抓取或跟随入站回调负载中的 URL(如录音下载链接、发送方提供的 URL)。
  • 回调处理程序 — 在信任 ICE/ACE/PIE/DiCE 负载之前,始终验证 Authorization 标头中的 HMAC-SHA256 回调签名。(仅为摘要 — 实施前,请查阅权威的 Callback Signing 文档,确认确切名称、编码和枚举值。) 回调正文中的字段(来电方 cli、to、custom、DTMF 输入)均应视为不可信 — 在记录日志、渲染或插入提示词/SVAML/Shell 命令之前,先进行清理。

链接

评论

支持 Markdown