(教程) 用阿里云的"语音服务"API 实现打电话
最少能节省你 30 分钟。

这篇文章讲什么
如何代码调用 API,给手机号打电话。
注意:不是语音识别(语音转成文本)也不是语音合成(文本转成语音)
是打电话。用程序给真人打电话。通知真人一些信息。
(例子:比如你点美团外卖,外卖到了会收到一个机器人语音电话,说"您的外卖已送达,请前往门口领取")
备注
- 代码示例用 Ruby 编程语言。
- 我们将会使用阿里云的"语音服务"。
- 因为我们用的是阿里云(官方提供了接口),所以编程语言不重要,你就算用 Java,PHP,Python等任何语言,看完本文也有收获。
最终效果
用户会收到电话,接通后语音播报:"会议 XX 还有 X 分钟开始。"
面向读者
想实现打电话功能的程序员。
对读者的价值
最少节省 30 分钟(查资料,看文档的时间)
背景信息
- 我最近(2024年2月)用代码实现了打电话的功能,趁着记忆还鲜活,记录一下
需求的背景:
- 我供职的公司内部使用"飞书"作为协作工具(微信也用,但是不用钉钉)
- 有人希望"飞书日历"的日程即将开始之前(比如 1 小时前,15分钟前)打个电话提醒一下。
(截图示例)给没用过飞书和飞书日历的朋友,截图看看飞书日历长什么样。
右上角 "创建日程"

填写标题,日程的开始时间

设置提醒时间

可以设置0个或多个提醒时间,比如提前 5 分钟,提前 1 小时

无法给中国大陆手机号打电话的服务商列表(无用)
截止至 2024年2月:
- AWS (亚马逊云服务) 和 Twilio 无法给中国大陆地区的手机号打电话(港澳台我不清楚行不行,因为我们的用例是中国手机号,所以没查过港澳台行不行)
- AWS 的打电话服务叫 Amazon Connect,第一:AWS 中国区没有这个 Connect 服务,第二:AWS 国际区也不可以给中国大陆打电话。
可以给中国大陆手机号打电话的服务商
- 百度云-语音通知:https://cloud.baidu.com/product/vns.html
- 腾讯云-语音消息 VMS https://cloud.tencent.com/product/vms
- 阿里云-语音服务 https://www.aliyun.com/product/vms/
因为我们已经用阿里云的另外 2 个服务:发送手机短信和域名管理。
所以这次也干脆用阿里云。
备注:这个列表我忽略了其他厂商,我懒得为了写个博客去收集完整的服务商列表。
简述:如何使用阿里云的"语音服务"
这是语音服务的首页

第一步:添加资质
需要做这一步的理由如图所示:


资质需要填写不少信息




第二步:资质提交并通过后,新建话术,例子如下:
图中有 4 个审核通过的话术。

需要"新增话术"的理由如图:

第三步:新建语音通知的模板

添加模板

截图(续)

如图,
- 填写"模板名称","模板内容"
- 选择声音(男/女)以及音色。
- 填写"使用说明"(帮助过审)
等待审核通过。
我们用的是公共模式(意思是每次拨出的手机号是不固定的)
至此,阿里云上的操作就完成了,接下来是用代码调用 API,从而打电话出去
我们的项目是 Ruby on Rails 7.1
经过调查,这个 gem 是可用的:https://github.com/ciscolive/aliyun-rails

Ruby代码示例
require "aliyun-rails"
client = Aliyun::Dyvms.new(
access_key_id: ENV['ALIYUN_ACCESS_KEY_ID'],
access_key_secret: ENV['ALIYUN_ACCESS_KEY_SECRET'],
)
# 调用语音方法
called_show_number = nil # 被叫显号。若您使用的语音通知文本转语音模板或语音验证码模板为公共模式外呼,则该参数值不填。
called_number = "135xxxx9999" # 收到电话的手机号。
# 模版 ID
tts_code = "TTS_28697xxxx" # 飞书日历-通知用户日程即将开始-女声, # 会议 ${name} 还有 ${time} 分钟开始
tts_param = { name: "每周会议", time: 30 }
resp = client.single_call_by_tts(called_show_number, called_number, tts_code, tts_param)
puts JSON.pretty_generate(resp)
{
"Message": "OK",
"RequestId": "6DC3D3B6-A39D-5059-AA92-46151001860D",
"CallId": "140607723407^127359268407",
"Code": "OK"
}
# RequestId 请求ID。
# CallId 此次通话的唯一回执ID。CallId可以通过QueryCallDetailByCallId接口查询呼叫详情。
总结
为了用阿里云的 API 打电话(你输入文本,由阿里云负责变成语音),需要以下步骤:
- 新建资质(提交企业信息,法人信息,管理员信息)
- 新建话术(这一步似乎只是为了过审)
- 新建模板(文字内容和变量在这一步)
- 模版过审后就可以打电话了。用代码调用即可。