简介:这套AI智能电话语音通话销售机器人源码,面向电话营销、客服系统开发人员与部署实施者,覆盖自然语言处理、语音识别、语音合成及机器学习优化模块,并附系统搭建教程,可快速搭建自动化外呼与客户服务场景。资源包共2002个文件,约103.6MB,以JavaScript、HTML、CSS等前端界面文件为主,辅以PHP、SO动态库及SQL数据库脚本,涵盖Web管理、语音引擎、通话组件等组成部分,目录结构完整,便于定位与二次开发。目前已有1237人浏览学习,适合需要实际部署或改造智能外呼系统的技术人群。源码除了提供完整呼叫流程与对话策略,还包含FreeSWITCH相关库、语音配置文件、证书及数据缓存文件,可支撑从环境配置到接口联调的全过程,并可根据CRM或业务需求进行个性化定制。
1. AI电话销售机器人源码与搭建教程:把按坐席付费的SaaS换成自建
之前有同行接了个“帮客户搭一套电话销售机器人”的活,用按并发坐席收费的SaaS,一个坐席一年上万,接到第三个项目时软件成本已经吃掉一半利润。后来他换成这套方案——拿AI智能电话语音通话销售机器人源码,照着搭建教程在服务器上部署,把外呼链路、ASR识别、意图理解、话术播报串起来,每个项目边际成本只剩一台云主机。这标题给的就是这条可落地的路。
这套系统解决的是重复外呼的人力问题:导入号码、自动呼叫、接通后听客户说什么、按话术应答、标记意向、把高价值通话转人工。跟普通聊天机器人不一样,它所有模块都为电话信道做了优化:窄带音频、几十秒到三分钟的短通话、随时可能被挂断的现场。适合想私有化部署的创业团队、需要沉淀语音产品的软件公司,以及要做本地化交付的一线开发。
2. 系统拆解与选型逻辑:通话链路、AI模块和对话状态机
2.1 外呼线路怎么接:三种模式与SIP中继的取舍
电话机器人第一道关卡是线路,不是AI。常见做法有两种:一种是在服务器上装开源软交换(SIP软交换),通过运营商SIP中继外呼;另一种是插真机卡,用语音网关把卡信号转成SIP,机器人侧不直接面对运营商。真机卡适合量小、对号码归属地有要求的场景,一张卡可以同时跑几个并发;SIP中继适合需要大并发和统一外显号码的团队,成本按线路月租加通话分钟数算。
外呼模式有直接外呼、回拨、中间号三种,直接影响接通率和线路健康度。
| 模式 | 主叫方向 | 接通率表现 | 典型场景 |
|---|---|---|---|
| 直接外呼 | 平台侧直拨客户 | 好,但容易被风控 | 低频、小规模验证 |
| 回拨 | 平台先呼本机,再呼客户 | 相对稳,线路压力小 | 每日几百通的常规外呼 |
| 中间号 | 平台、客户均呼中间号 | 号码安全、防标记 | 房产、金融等高敏感行业 |
我一般建议新项目先跑回拨。回拨模式下,平台侧是“接电话”的一方,运营商看到的主叫行为更像正常回拨电话,线路被拦截的概率明显低于直拨。代价是多一次信令开销,接通延迟多一两秒,客户那边收到的是陌生号码来电,话术开场要能解释清楚“为什么打给我”。
2.2 ASR、NLU、TTS三项选型:选贵的还是选能落地的
ASR(语音识别)决定了“能不能听清客户说话”。云厂商的语音识别接口按分钟计费,识别率高,开箱即用;本地部署的开源识别模型一次投入算力成本,后面没有按量费用。电话场景里有个细节:音频是8kHz窄带经过压缩的,很多模型在普通麦克风上表现好,放到电话上识别率直接掉一截,选型时必须要确认支持电话场景或做过窄带微调。
NLU(意图理解)在销售话术里没必要做得很重。开场、拒绝、有意向、要求转人工、挂断,翻来覆去就那十几类。我的做法是规则加槽位提取打底,命中不了再交给大模型接口兜底。大模型接口延迟不稳定,通话中不能全程阻塞等待,要给超时降级路径,比如把兜底模型从对话链路里拆出来,通话结束后再补打标签。
TTS(语音合成)有两个选择:云接口实时合成,或者预录音频。预录音频成本最低,适合固定话术;动态拼接适合“您是王先生吗”这类带变量的句子。这里有个容易被低估的点:真人录音的接通率和会话时长,普遍比机器合成音高,尤其是开场白,多花点钱录一套值得。
2.3 对话状态机为什么是电话机器人的心脏
电话销售机器人和普通问答机器人本质区别是它是流程引擎,不是聊天引擎。每个话术节点都定义了三件事:说什么(TTS播报)、听什么(ASR加意图识别)、怎么做(跳转、挂断还是转人工)。比如开场节点后面只能挂这几个出口:客户有兴趣、没兴趣、要求转人工、直接挂断,外加一个“客户没说话”的超时分支。
状态机的设计约束直接影响工程结构:话术必须能导出成JSON或类似的配置格式,让运营同学也能改,而不是每次调整都找开发改代码。另一个约束是状态机的跳转要能记录路径,通话结束后要知道这个客户是在哪个节点挂断的、哪个节点表现出意向,这些数据是优化话术和评估效果的基础。没有状态机做骨,ASR和TTS再强也只是个会说话的黑匣子。
3. 在服务器上跑通源码:外呼控制、ASR识别与应答播报核心代码
3.1 先搭出最小运行环境,别一上来上集群
拿到这类源码包,我的建议是先按搭建教程把环境初始化、依赖安装、密钥配置三步走完,在一台4核8G的云主机上跑通,再考虑扩容。最小运行环境由四部分组成:开源软交换负责SIP信令和媒体转发,AI网关负责ASR、意图识别、TTS播报,管理台负责导入号码和查看记录,数据库存通话明细。
软交换和AI网关建议拆成两个进程,不要塞在同一个服务里。原因很直接:软交换对网络延迟敏感,AI网关会跑GPU或高CPU任务,两个挤在一起,一通电话识别时延迟波动,整个通话质量都被拖累。数据库用常规的关系型库就够,通话记录一天几千条,远没到需要上大数据组件的程度。
3.2 用软交换管理接口发起外呼:核心代码与四个关键参数
下面这段是外呼模块的典型核心代码,按源码包里的调用方式整理。它的作用是向软交换发起一通外呼,并且指定接通后把音频流交给AI网关处理。
# ai_outbound.py import json import socket # 软交换管理端口,搭建教程里会给到实际地址 SWITCH_HOST = "127.0.0.1" SWITCH_PORT = 8021 def call_switch(cmd: dict) -> str: """向软交换发送一条控制命令,返回原始响应。""" payload = json.dumps(cmd) with socket.create_connection((SWITCH_HOST, SWITCH_PORT), timeout=3) as s: s.sendall(payload.encode("utf-8")) return s.recv(65536).decode("utf-8", "ignore") def originate(caller, callee, scenario="sales_opening"): """发起一通外呼:接通后把音频流交给AI网关。""" cmd = { "action": "originate", "caller": caller, # 外显号码,需与线路侧报备一致 "callee": callee, # 客户号码 "timeout": 15, # 响铃15秒未接听,挂断释放 "max_duration": 90, # 机器人通话最长90秒,防止空挂 "hangup_on_fail": True, "on_answer": { "handler": "ai_gateway", # 接通后回调AI网关 "params": {"scenario": scenario} } } return call_switch(cmd) if __name__ == "__main__": print(originate("4008xxxxxx", "139xxxx8888"))这段代码里有四个参数会影响线路健康和外呼效果。caller是外显号码,必须和线路侧报备的号码一致,否则接通率低甚至直接被拒。timeout设15秒比较合理,太长会让客户觉得烦,太短会误伤正在掏手机的人。max_duration设90秒是兜底,防止线路异常导致通话一直不释放,占着并发不还。on_answer这个字段是核心——接通事件发生时才把媒体流转给AI网关,避免客户没接还白白跑识别。
3.3 接通后的AI对话循环:音频流里的识别与应答
通话接通后,AI网关接管音频流。这部分的调用逻辑不是“听完一整段再回复”,而是一边收音频、一边识别、一边按状态机跳转。下面是一个话术会话对象的简化结构,实际的源码包基本也是按这个模块边界组织的。
# ai_gateway/session.py class CallSession: """一通电话的AI处理上下文:持有音频流、话术状态、标签。""" def __init__(self, call_id, scenario): self.call_id = call_id self.flow = load_flow(scenario) # 加载话术JSON状态机 self.labels = [] self.full_text = "" def run(self): node = self.flow.root while node: # 1. 播报当前节点话术,同步等待播完 self.say(node.prompt) # 2. 听客户回复:3秒没有有效语音判为静音 text = self.listen(timeout=3) self.full_text += text # 3. 意图识别:先走槽位规则,命中不了走兜底模型 intent = self.nlu.match(node.intents, text) # 4. 按意图执行跳转、挂断或转人工 if intent.action == "next": node = self.flow.get(intent.next) elif intent.action == "release": self.labels.append(intent.label) self.hangup() break elif intent.action == "transfer": self.transfer_to_agent(agent_extension="8001") break这里的关键设计是交互严格串行:先播报、再听取、再跳转,绝不能一边播报一边识别,会把播报内容当客户语音。listen方法的timeout参数是静音判断阈值,3秒是经验值,太短客户来不及开口,太长整通电话节奏会被拖慢。say和listen之间的间隔也要留300到500毫秒,防止上一句话最后一个字被识别器吞掉,这是纯工程细节,不调过的人很容易翻车。
意图匹配走的是“规则优先、模型兜底”的路径。node.intents里定义了每个节点关心的意图集合,先做关键词和槽位匹配,毫秒级返回;命中不了再走兜底模型,并给兜底模型设置更短超时,宁可判定“未识别”走重试分支,也不能让客户在电话里干等。
3.4 通话结束写记录:给每一通电话打上意向标签
通话结束后,会话对象里已经积累了完整信息:完整转写文本、状态机路径、意图跳转记录、累计标签。这个时刻要做的事很简单,就是落库。
def on_hangup(session): record = { "call_id": session.call_id, "callee": session.callee, "duration": session.duration, "transcript": session.asr.full_text(), "labels": session.labels, # 例:["无效"] 或 ["意向", "需人工跟进"] "intent_path": session.flow.path() # 例:opening -> qualify -> confirm } save_to_db(record)labels不是AI模型自己猜的,而是状态机跳转的副产物。客户在某个节点明确表达了“有兴趣”,状态机才把“意向”这个标签累加上去,这个设计让标签可解释、可追溯。intent_path字段同样重要,它能直接回答“客户在哪个话术节点流失最严重”,这是后面优化话术最需要的数据,没有它就只能靠人工听录音碰运气。
提示:外呼任务建议做成队列,分批下发,不要每通电话都在主进程里创建一个线程。软交换和AI网关之间用消息队列解耦,任务失败可以重试,线路抖动也不会拖垮整个服务。
4. 从能通话到能销售:话术配置化、意向标签与人工转接闭环
4.1 把话术状态机做成JSON:运营能自己改,才是产品
一套电话机器人能不能真正用起来,分界线是“运营能不能自己改话术”。如果每次调整都要改代码重新部署,这个项目就死在半路上了。话术配置化的常见载体是JSON,每个节点包含播报文案、意图出口、静音处理策略。下面是一个精简但结构完整的话术文件:
{ "root": "opening", "nodes": { "opening": { "prompt": "您好,我这边是XX服务中心,想跟您同步一个售后回访,耽误您一分钟可以吗?", "intents": { "yes": {"action": "next", "next": "ask_intent"}, "no": {"action": "next", "next": "polite_close"}, "hangup": {"action": "release", "label": "无效"} }, "no_speech": {"retry": 1, "next": "opening_retry"} }, "opening_retry": { "prompt": "喂,您好,请问在听吗?", "intents": { "yes": {"action": "next", "next": "ask_intent"}, "hangup": {"action": "release", "label": "无效"} }, "no_speech": {"action": "release", "label": "无人接听"} } } }结构上有几个地方值得注意。no_speech字段必须给,真实外呼里“对方喂了一声但没说话”的比例不低,没有这个分支客户就永远停在当前节点。retry只设1次,给客户一次补救机会,两次以上就明显有骚扰感。intents里的hangup出口要单独识别,客户挂断不能算“没听清重试”,要直接释放并打“无效”标签,这样统计数据才干净。
话术文案本身也影响结果。开场白里避免出现“机器人”“AI助手”这类词,客户一听是机器容易直接挂断。更自然的说法是“服务中心”“售后回访”,并且尽早说明来电目的。这里没有玄学,所有词都能用接通率、首句完成率、挂断位置三个指标量化验证。
4.2 意向标签与统计SQL:从通话记录里找出值得跟进的客户
标签体系在落地时一般分四级:S级强意向、A级有意向但需确认、B级可跟进、C级无效。状态机跳转时按客户表现落标签,比如问价格打S级,说“你晚点再打”打B级,直接挂断打C级。标签定义要跟业务方一起定,并且每两周校准一次,因为“有意向”的标准会随产品和话术变化。
统计上最常用的是一张按标签分组的汇总查询:
SELECT label, COUNT(*) AS call_cnt, ROUND(AVG(duration), 0) AS avg_duration_sec FROM call_records WHERE group_id = '2025Q1' AND called_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY label;这张表的意义不是看总量,而是看比例。如果C级占比超过七成,先别急着骂线路,大概率是号码质量或开场白出了问题;如果A级客户平均通话时长只有20秒,说明话术没有足够深的钩子把人留在后面。单看接通率会骗人,把标签、时长、挂断节点三个维度放在一起看,问题才藏不住。
4.3 转人工的三种触发方式与桥接超时处理
转人工是销售机器人价值兑现的一步,触发方式有三类:客户主动要求、AI识别到强意向、话术节点配置了特定跳转。不管哪种,实现路径都是先让机器人播报过渡语,再把通话桥接到坐席分机。
转接这里有参数值得调。坐席接起等待超时一般设15秒,超过就回到机器人话术分支,不能让客户对着静音干等。要有“转接失败”的退路话术,比如“坐席正忙,稍后让同事给您回电”,然后按规划落一个回拨任务。转人工的记录要打特殊标签,方便后续统计“转人工成功率”,这个指标直接反映话术引导质量。
5. 搭建与调优的高频坑:线路限制、并发瓶颈与识别质量排查
5.1 号码被运营商拦截,接通率一个月从25%掉到8%
现象很典型:刚开始外呼接通率还行,跑了半个月,接通率明显跳水,甚至外显号码被标记为骚扰电话。原因基本是直接在SIP中继上高频发起主叫,风控系统识别出外呼行为特征,做了限流或标记。
解决思路分三步:先降频,单条线路每分钟呼叫间隔拉大到30秒以上,每日总量设上限;再切回拨模式,让平台侧先接听再呼客户;最后换线路或换外显号码池,多个号码轮询分摊。这三个措施要一起做,只降频不回拨,治标不治本。
5.2 并发超过10路服务器CPU被打满:媒体转发与ASR抢资源
现象是并发一上去,软交换延迟变大,客户听到明显杂音,ASR识别也变慢。原因是单台机器里软交换做媒体转发,AI网关做识别,两边都是CPU大户,互相抢资源。尤其是ASR要处理多路音频流,CPU占用比想象中高得多。
解决是把服务拆开:软交换留在靠近线路的节点,AI网关放到另一台机器,只传音频流和识别结果。单机方案不是不能跑,但并发上限基本就个位数到十几路,想跑几十路就别在单机上勉强,扩容一台专用机器比优化代码性价比高得多。顺带把软交换的日志级别从debug调回info,日志本身也会吃掉不少CPU。
5.3 ASR频繁返回空文本:窄带音频与VAD参数的玄学
现象是客户明明说了话,识别结果却是空的,话术走到“没听清”分支,客户被反复问第二遍,体验很差。原因有两个方向:一是识别模型没有针对电话窄带音频优化,二是VAD(语音端点检测)参数太激进,把说话开头和结尾的弱音当静音切掉了。
解决方法是先确认用的ASR服务或模型支不支持电话信道场景,这步选型关键;然后把VAD的静音阈值调低一点,端点检测的尾音静音时长从默认的500毫秒调到800毫秒。还有个容易忽略的点:客户说“喂”“嗯”“啊”这类语气词时,识别器经常返回空标签,要把这些词加进容忍词典,直接映射为“无有效意图但通话存活”。
5.4 通话进行到30秒出现单通:NAT与RTP媒体流回传问题
现象是通话前30秒正常,到某个时间点客户听不到声音或机器人听不到客户,而通话还在继续。原因是RTP媒体流的网络路径出了问题,常见于服务器在NAT后面,RTP端口没做映射或防火墙只放行了SIP信令端口,媒体端口被丢包。
解决是先确认软交换配置里内外网地址映射正确,再把RTP媒体端口范围一次性放行,不要只开几个端口碰运气。验证方法是抓包看RTP流是否双向有包,如果只有一方有包,基本就是媒体路径问题。这个问题在网络环境一变就复现,云主机换IP或加安全组后要重新核对一遍。
5.5 深夜进程崩溃,第二天外呼任务全部停摆
现象是早上上班发现昨晚的外呼队列没跑,进程不知道什么时候挂了,日志也没留下有用信息。原因是启动方式太裸,没有进程守护,也没有健康检查和自动重启,日志文件没做轮转被写满,进程直接退出。
解决是给AI网关和软交换都套上守护进程,崩溃自动拉起;日志按天轮转,保留7到30天;再加一个每5分钟拨测的探活脚本,连续两次失败就告警。这套兜底做完,系统才算达到能长期跑的生产状态。源码包里的教程一般会覆盖部署步骤,但守护和告警往往要靠自己补,别省。
6. 进阶:把源码版电话机器人调出自己的效果与壁垒
先做一轮定量拨测,再谈优化。我的习惯是部署完不急着上线,拿真实的客户号码列表抽100个号码,用回拨模式跑一轮,然后拉出转写文本和状态机路径,统计三个指标:接通率、有效会话率、S级意向占比。这三个数就是这套系统的基线,之后所有话术和参数的调整,都拿这个基线做对比。
录音抽检是必须补的一环。转写文本会掩盖语气、沉默、背景声这些关键信息,每周抽两三通录音完整听完,重点关注“识别对了但意图判错了”的场景,比如客户说“你这个多少钱”,状态机却走到“售后咨询”,这种情况规则里加一个词就能修,性价比极高。抽检还有一个作用:积累一批真实电话音频,拿这批数据去微调本地ASR模型,识别率会越用越贴合自己的业务词汇。
如果要把这套系统做成产品,我建议把话术编辑做成可视化配置平台,这是源码方案相对SaaS最有差异化价值的地方。销售话术迭代极快,运营能自己拖节点、改文案、配标签,就能脱离开发排期,一天内试跑新话术。这一步做完,你手里的就不再是套Demo源码,而是能对业务快速响应的销售基础设施。
我自己调这套系统最大的教训是:拿到源码先别急着改代码,先把默认话术在真机上跑满一百通,记录每一个翻车现场再动手。电话销售机器人这个东西,网络、线路、话术、识别任何一个环节出问题,面上都是“机器人不好用”,排查起来却要一层层剥。但恰恰因为坑都摆在台面上,照着源码和教程做一遍,再按指标调一轮,你会比买SaaS时更清楚每一分钱花在了哪里,也更有底气应对别人的质疑。希望帮到你。
本文还有配套的精品资源,点击获取