SmartCall v1.0.2:让 AI 通话可追溯,并精细控制录音打断

2026-08-03 50 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

SmartCall v1.0.2 新增了两项直接影响呼叫中心运营效率的能力:查看 AI 对话内容,以及配置录音打断。前者让通话过程从“只能听结果”变成可检索、可复盘的数据;后者则帮助语音机器人在播放提示音或合成语音时,更准确地处理客户插话。

SmartCall 本身基于 AI 大模型与 Asterisk 通信引擎构建,覆盖智能呼入、智能外呼、IVR 编排、实时语音识别(ASR)、语音合成(TTS)和大模型意图识别。此次更新没有改变这些基础能力,而是补上了运营审计和交互控制中的两个关键环节。

AI 对话内容不只是“聊天记录”

在智能客服系统中,一次通话通常会经过多层处理:Asterisk 建立媒体通道,ASR 将语音转换为文本,大模型识别意图并生成回复,TTS 再把回复播放给客户。过去如果只能拿到录音,排查一次异常通话往往需要从头听到尾。

能够直接查看 AI 对话内容后,运营和开发团队可以围绕文本开展更细致的工作:

  • 定位 ASR 是否把产品名、金额或地址识别错误。
  • 检查大模型是否遗漏上下文,或生成了不符合业务规则的回答。
  • 对照客户问题与机器人回复,评估知识库的覆盖范围。
  • 根据高频未解决问题调整 IVR 节点、提示词和人工转接条件。
  • 在投诉复盘或质检过程中,快速找到关键对话片段。

对话文本也存在边界。它不能完全替代录音,因为语气、停顿、背景噪声和双方抢话等信息可能不会完整保留在转写结果中。较稳妥的做法是将对话文本作为检索入口,再通过时间戳关联原始录音。

录音打断决定了机器人是否“会听人说话”

语音机器人播放欢迎语、业务说明或确认问题时,客户经常会提前回答。如果系统坚持把整段语音播放完,通话会显得迟钝;如果任何声音都触发打断,键盘声、咳嗽或环境噪声又可能导致提示语被截断。

录音打断配置需要在响应速度与抗噪能力之间取舍。实际部署时通常需要关注以下参数维度:

  • 是否允许客户语音打断当前播放内容。
  • 检测到多长时间的连续语音后才触发打断。
  • 音量或置信度达到什么阈值才视为有效输入。
  • 打断后是立即进入 ASR,还是先等待短暂静音。
  • 欢迎语、合规声明等特定节点是否禁止打断。

例如,菜单询问“请问您要查询订单还是申请退款”适合允许打断;金融风险提示、录音授权声明等必须完整播放的内容,则应谨慎开启。

可以这样实践:把打断参数纳入版本管理

来源摘要没有给出 SmartCall v1.0.2 的实际配置字段或 API。下面是一个可直接改造的 YAML 配置模板,用来说明如何在项目中管理不同场景的打断策略;字段名需要替换为 SmartCall 实际支持的配置项。

# voice-policy.yaml
# 假设性配置模板:请按 SmartCall 实际字段进行映射
profiles:
  interactive_service:
    interrupt_enabled: true
    min_speech_ms: 350
    end_silence_ms: 600
    confidence_threshold: 0.72

  mandatory_notice:
    interrupt_enabled: false

routes:
  order_query:
    profile: interactive_service
  refund_request:
    profile: interactive_service
  compliance_notice:
    profile: mandatory_notice

可以使用 Python 在上线前检查配置,避免出现阈值越界、路由引用不存在等问题。下面的脚本可以直接运行,唯一依赖是 PyYAML:

python -m pip install pyyaml
python validate_voice_policy.py voice-policy.yaml
# validate_voice_policy.py
import sys
from pathlib import Path

import yaml


def validate(path: Path) -> None:
    data = yaml.safe_load(path.read_text(encoding="utf-8"))
    profiles = data.get("profiles", {})
    routes = data.get("routes", {})

    if not profiles:
        raise ValueError("profiles must not be empty")

    for name, profile in profiles.items():
        if not profile.get("interrupt_enabled", False):
            continue

        min_speech_ms = profile.get("min_speech_ms", 0)
        confidence = profile.get("confidence_threshold", 0)
        if not 100 <= min_speech_ms <= 2000:
            raise ValueError(f"{name}: min_speech_ms must be 100..2000")
        if not 0 <= confidence <= 1:
            raise ValueError(f"{name}: confidence_threshold must be 0..1")

    for route, settings in routes.items():
        profile_name = settings.get("profile")
        if profile_name not in profiles:
            raise ValueError(f"{route}: unknown profile {profile_name!r}")

    print(f"OK: {len(profiles)} profiles, {len(routes)} routes")


if __name__ == "__main__":
    config_path = Path(sys.argv[1] if len(sys.argv) > 1 else "voice-policy.yaml")
    validate(config_path)

这类配置适合与 IVR 流程版本一起提交到 Git。修改阈值时应记录业务场景、测试号码和变更原因,避免运营人员只能看到一个数字,却不知道它为什么存在。

上线时同时验证文本、录音与打断事件

仅确认页面上能看到对话内容还不够。建议选择安静环境、办公室噪声和免提通话三类场景,分别执行正常问答、播放中插话、短促噪声和长时间沉默等测试。

一条完整的测试记录至少应包含:

  • 通话 ID、主叫与被叫的脱敏标识。
  • 每轮用户文本和 AI 回复文本。
  • ASR、模型生成与 TTS 的时间戳或耗时。
  • 发生打断时的节点、阈值和识别结果。
  • 与对话时间戳对应的录音位置。
  • 是否触发重试、兜底话术或人工转接。

对话内容可能包含姓名、手机号、订单号和身份信息,因此查看权限、导出权限、数据脱敏与保留周期必须同步设计。生产环境中不宜让所有坐席默认看到完整敏感字段,也不应在普通应用日志中重复输出完整对话。

升级前后的检查清单

SmartCall v1.0.2 的价值不只在于多了两个配置入口,而在于团队能否把它们接入质检和调优流程。升级时可以按以下顺序落地:

  1. 先在测试环境确认历史通话与新通话的对话内容展示是否符合预期。
  2. 检查查看对话、导出数据和访问录音的角色权限。
  3. 为可交互话术和不可打断声明建立不同策略。
  4. 使用真实线路测试噪声、抢话、方言和网络抖动场景。
  5. 记录升级前后的打断率、误打断率、平均通话时长和人工转接率。
  6. 小流量灰度后再逐步扩大范围,并保留快速回退配置。

对于已经在电商售后、金融服务或外呼场景中运行 AI 客服的团队,这次更新适合从高频、低风险的流程开始验证。对话可见性解决“发生了什么”,录音打断配置解决“机器人何时闭嘴并开始听”;两者结合,才能形成可观察、可调试的语音交互闭环。


相关推荐