SenseVoiceSmall实战案例:智能客服情绪识别系统搭建步骤详解

1. 引言

想象一下,你是一家电商公司的客服主管。每天,客服团队要处理成百上千的通话录音,你很难知道哪些客户是真的满意,哪些只是在强压怒火。传统的语音转文字工具只能告诉你客户说了什么,却无法告诉你他们说话时的情绪。是开心?是愤怒?还是失望?

这就是我们今天要解决的问题。通过搭建一个智能客服情绪识别系统,我们不仅能将通话录音转成文字,还能自动识别出客户的情绪状态,比如开心、愤怒、悲伤,甚至能检测出背景音乐、掌声或笑声。这对于提升客服质量、预警潜在投诉、优化服务流程有着巨大的价值。

本文将手把手带你,基于阿里开源的 SenseVoiceSmall 模型,从零开始搭建这样一个系统。你不需要是AI专家,只要跟着步骤操作,就能拥有一个能“听懂”情绪的智能客服助手。我们会使用预置的Gradio Web界面,让你无需编写复杂代码,通过浏览器就能上传音频、查看带情绪标签的识别结果。

2. 环境准备与快速部署

2.1 理解我们的工具:SenseVoiceSmall

在开始动手之前,我们先花两分钟了解一下核心工具。SenseVoiceSmall不是一个普通的语音转文字模型。你可以把它理解为一个“超级耳朵”,它有两项核心超能力:

  1. 多语言听力:能准确识别中文、英文、日语、韩语,甚至粤语。
  2. 情绪与事件感知:不仅能听清字词,还能感知说话者的情绪(开心、愤怒、悲伤)和声音环境中的特定事件(背景音乐、掌声、笑声、哭声)。

它把这些信息都融合在转写的文字里,我们称之为“富文本识别”。比如,它输出的可能不是干巴巴的“好的,我知道了”,而是“[开心] 好的,我知道了 [笑声]”。这样,系统就能自动统计出“愤怒”情绪出现的频率,帮助管理者快速定位问题。

2.2 一键启动服务

得益于集成的镜像,部署过程变得极其简单。如果你的环境已经预装了所需组件,系统可能已经自动运行了服务。如果没有,或者你想了解背后的原理,我们可以手动启动。

首先,打开终端,确保我们安装了必要的Python库。核心是funasr(语音识别框架)和gradio(Web界面库)。

# 安装音频处理库和Web界面库
pip install av gradio

接下来,我们需要创建一个Python脚本,这个脚本将作为我们Web服务的“大脑”。我们创建一个名为 app_sensevoice.py 的文件。

# app_sensevoice.py
import gradio as gr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
import os

# 1. 加载SenseVoiceSmall模型
# 这里指定使用阿里开源的SenseVoiceSmall模型,并启用GPU加速
model_id = "iic/SenseVoiceSmall"
model = AutoModel(
    model=model_id,
    trust_remote_code=True, # 信任远程代码以加载完整模型
    vad_model="fsmn-vad", # 语音活动检测模型,用于切分长音频
    vad_kwargs={"max_single_segment_time": 30000}, # 设置每段音频最长30秒
    device="cuda:0", # 使用GPU,如果只有CPU则改为"cpu"
)

def sensevoice_process(audio_path, language):
    """处理音频文件的核心函数"""
    if audio_path is None:
        return "请先上传音频文件"
    
    # 2. 调用模型进行识别
    # 输入音频路径和语言,模型会返回识别结果
    res = model.generate(
        input=audio_path,
        cache={},
        language=language,  # 使用用户选择的语言
        use_itn=True, # 启用逆文本归一化,将“一二三”转为“123”
        batch_size_s=60,
        merge_vad=True,
        merge_length_s=15,
    )
    
    # 3. 对结果进行后处理,让情感标签更易读
    if len(res) > 0:
        raw_text = res[0]["text"] # 原始识别文本,包含标签
        clean_text = rich_transcription_postprocess(raw_text) # 清洗后的文本
        return clean_text
    else:
        return "识别失败"

# 4. 构建网页界面
with gr.Blocks(title="SenseVoice 智能客服情绪识别系统") as demo:
    gr.Markdown("# 🎙️ SenseVoice 智能客服情绪识别系统")
    gr.Markdown("""
    **系统功能:**
    - **多语言客服支持**:自动识别中、英、日、韩、粤语客服录音。
    - **客户情绪分析**:自动检测通话中的开心、愤怒、悲伤等客户情绪。
    - **交互事件标记**:自动标注背景音乐、掌声、笑声等关键声音事件。
    - **可视化报告**:直观展示带情绪标签的对话文本。
    """)
    
    with gr.Row():
        with gr.Column():
            # 音频上传组件
            audio_input = gr.Audio(type="filepath", label="上传客服通话录音或直接录制")
            
            # 语言选择组件
            lang_dropdown = gr.Dropdown(
                choices=["auto", "zh", "en", "yue", "ja", "ko"], 
                value="auto", 
                label="选择录音语言 (auto为自动检测)"
            )
            
            # 识别按钮
            submit_btn = gr.Button("开始智能分析", variant="primary")
        
        with gr.Column():
            # 结果显示区域
            text_output = gr.Textbox(label="智能识别结果(含情绪与事件标签)", lines=20)

    # 绑定按钮点击事件
    submit_btn.click(
        fn=sensevoice_process, 
        inputs=[audio_input, lang_dropdown], 
        outputs=text_output
    )

# 5. 启动Web服务
# server_name="0.0.0.0" 允许外部访问,server_port=6006 指定端口
demo.launch(server_name="0.0.0.0", server_port=6006)

保存文件后,在终端运行这个脚本:

python app_sensevoice.py

看到终端输出类似 Running on local URL: http://0.0.0.0:6006 的信息,就说明服务启动成功了。

2.3 访问你的智能客服系统

由于安全设置,你可能需要通过SSH隧道在本地浏览器访问这个服务。在你自己电脑的终端(不是云服务器的终端)里执行以下命令:

ssh -L 6006:127.0.0.1:6006 -p [你的服务器SSH端口号] root@[你的服务器IP地址]

连接成功后,打开你电脑上的浏览器,输入地址 http://127.0.0.1:6006,就能看到我们刚刚搭建的智能客服情绪识别系统的操作界面了。

3. 系统核心功能与操作演示

现在,你的智能客服系统已经就绪。让我们通过一个模拟的客服场景,看看它如何工作。

3.1 上传与分析客服录音

假设我们有一段客户投诉的录音。在Web界面中:

  1. 点击“上传客服通话录音”区域,选择你的音频文件(支持mp3, wav等常见格式)。
  2. 在“选择录音语言”下拉框中,如果知道确切语言(如中文“zh”),就选择它;如果不确定,就保持“auto”(自动检测)。
  3. 点击“开始智能分析”按钮。

系统会开始处理音频。SenseVoiceSmall模型会在后台进行:

  • 语音活动检测:自动切分有效人声片段,过滤静音。
  • 语音转文字:将切分后的音频转为文字。
  • 情绪与事件识别:并行分析语音中的情感倾向和特殊声音事件。
  • 结果融合与后处理:将文字、情感标签(如[开心])、事件标签(如[笑声])融合成一段富文本。

3.2 解读识别结果

处理完成后,右侧的文本框会显示类似下面的结果:

[客服] 您好,这里是XX客服,请问有什么可以帮您? [标准]
[客户] [愤怒] 我上周买的手机,才用了三天屏幕就碎了!你们这质量也太差了吧! [愤怒]
[客服] [平静] 先生您先别着急,非常理解您的心情。请问您购买时是否购买了我们的意外险服务呢? [平静]
[客户] [愤怒] 我哪知道要买什么险!现在怎么办? [愤怒]
[客服] [平静] 您放心,即使没有意外险,我们也可以为您提供付费维修服务。我这边先帮您登记一下问题,稍后会有专员联系您处理,您看可以吗? [平静]
[客户] [平静] 那...好吧,快点啊。 [平静]
[背景音] [BGM] (检测到轻微的等待音乐)

结果解读:

  • 角色分离(模拟):虽然当前模型不直接区分说话人,但我们可以通过上下文或结合其他工具(如声纹识别)来标注[客服][客户]。上例是手动模拟的。
  • 情绪标签:清晰标注了每一句话对应的情绪,如[愤怒][平静]。这让我们一眼就能看出客户的情绪变化曲线:从愤怒开始,在客服安抚后逐渐平静。
  • 事件标签:检测到了[BGM](背景音乐),这有助于分析客服等待时的用户体验。
  • 完整对话:保留了完整的对话文本,可供后续质检或分析。

这个结果对于客服主管来说价值巨大。他可以快速定位到含有[愤怒]标签的对话片段,复盘客服的处理话术是否得当。也可以统计全天录音中“愤怒”情绪出现的比例,作为团队服务质量的KPI之一。

4. 进阶应用:从分析到自动化

一个基础的识别系统已经搭建完成。但它的潜力远不止于此。下面我们探讨如何将其融入真实的客服工作流,实现自动化分析。

4.1 批量处理历史录音

客服中心每天产生大量录音,手动上传分析不现实。我们可以写一个简单的脚本,自动扫描某个文件夹下的所有音频文件,批量处理并生成报告。

# batch_process.py
import os
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess

# 初始化模型(与之前相同)
model = AutoModel(model="iic/SenseVoiceSmall", trust_remote_code=True, device="cuda:0")

def analyze_audio_folder(folder_path, output_file="客服情绪报告.txt"):
    """批量分析一个文件夹内的所有音频文件"""
    audio_extensions = ['.wav', '.mp3', '.m4a', '.flac']
    results = []
    
    for filename in os.listdir(folder_path):
        if any(filename.lower().endswith(ext) for ext in audio_extensions):
            filepath = os.path.join(folder_path, filename)
            print(f"正在处理: {filename}")
            
            try:
                res = model.generate(input=filepath, language="zh")
                if res:
                    raw_text = res[0]["text"]
                    clean_text = rich_transcription_postprocess(raw_text)
                    # 简单统计情绪关键词出现次数
                    emotion_count = {
                        "HAPPY": clean_text.count("开心") + clean_text.count("HAPPY"),
                        "ANGRY": clean_text.count("愤怒") + clean_text.count("ANGRY"),
                        "SAD": clean_text.count("悲伤") + clean_text.count("SAD"),
                    }
                    
                    results.append({
                        "file": filename,
                        "text": clean_text[:500] + "...", # 只保存前500字符
                        "emotion_stats": emotion_count
                    })
            except Exception as e:
                print(f"处理 {filename} 时出错: {e}")
                results.append({"file": filename, "error": str(e)})
    
    # 生成简易报告
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write("=== 客服录音批量情绪分析报告 ===\n\n")
        total_angry = sum(r.get('emotion_stats', {}).get('ANGRY', 0) for r in results if 'emotion_stats' in r)
        f.write(f"分析文件总数: {len(results)}\n")
        f.write(f"总'愤怒'情绪出现次数: {total_angry}\n\n")
        
        for r in results:
            f.write(f"文件: {r['file']}\n")
            if 'emotion_stats' in r:
                f.write(f"情绪统计: {r['emotion_stats']}\n")
                f.write(f"内容摘要: {r['text']}\n")
            else:
                f.write(f"错误: {r.get('error', '未知错误')}\n")
            f.write("-"*50 + "\n")
    
    print(f"分析完成!报告已保存至: {output_file}")

# 使用示例:分析 /data/call_records 文件夹下的所有录音
analyze_audio_folder("/data/call_records")

运行这个脚本,它会自动处理指定文件夹里的所有录音,并生成一个包含情绪统计的文本报告,极大提升了分析效率。

4.2 构建实时情绪监控看板

对于大型客服中心,实时监控正在发生的通话情绪更有价值。我们可以将系统稍作改造,接入实时音频流(如从电话系统获取),并搭配一个数据可视化看板(如使用Gradio或Streamlit)。

思路是:

  1. 实时接入:从呼叫中心的音频流接口获取实时通话数据(需根据具体系统API调整)。
  2. 滑动窗口分析:不是等通话结束,而是每隔10-15秒分析一次最近一段时间的音频。
  3. 情绪打分与预警:为“愤怒”等负面情绪设定一个阈值。当短时间内负面情绪出现频率过高时,系统自动标记该通话,并实时通知主管或质检员介入。
  4. 可视化展示:在看板上用图表展示全公司/全团队当前通话的“整体情绪健康度”,比如用绿色(良好)、黄色(关注)、红色(预警)来表示。

这相当于给客服中心安装了一个“情绪雷达”,问题在萌芽阶段就能被发现和处理。

4.3 与现有系统集成

这个情绪识别引擎可以作为一个独立的服务(API)集成到你们现有的客服质检系统或CRM系统中。

# 简易的Flask API服务示例
from flask import Flask, request, jsonify
from funasr import AutoModel
import tempfile

app = Flask(__name__)
model = AutoModel(model="iic/SenseVoiceSmall", trust_remote_code=True, device="cuda:0")

@app.route('/analyze', methods=['POST'])
def analyze_audio():
    """提供一个HTTP API接口,供其他系统调用"""
    if 'file' not in request.files:
        return jsonify({'error': '未提供音频文件'}), 400
    
    audio_file = request.files['file']
    language = request.form.get('language', 'auto')
    
    # 保存临时文件
    with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as tmp:
        audio_file.save(tmp.name)
        audio_path = tmp.name
    
    try:
        res = model.generate(input=audio_path, language=language)
        if res:
            text = res[0]["text"]
            # 这里可以添加更复杂的分析逻辑,如情绪占比计算
            return jsonify({
                'status': 'success',
                'text': text,
                'language': language
            })
        else:
            return jsonify({'error': '识别失败'}), 500
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

这样,你们的质检系统在抓取到录音文件后,就可以直接调用这个http://你的服务地址:5000/analyze接口,将带情绪标签的文本结果写回数据库,供后续的报表和质检评分使用。

5. 总结

通过本文的步骤,我们从零搭建了一个具备情绪识别能力的智能客服系统。让我们回顾一下关键收获:

  1. 系统核心:我们利用了阿里开源的SenseVoiceSmall模型,它强大的“富文本识别”能力是我们系统的基石,能同时输出文字和情感标签。
  2. 快速搭建:借助预置的Gradio Web界面,我们通过一个Python脚本就实现了完整的、可视化的操作平台,无需前端开发知识。
  3. 价值落地:这个系统能直接将技术能力转化为业务价值:
    • 质检提效:自动筛选出高负面情绪的通话,质检员可优先复查,提升问题发现率。
    • 服务优化:通过分析高频“愤怒”场景,优化客服话术和业务流程。
    • 风险预警:实时监控可对可能升级的投诉进行预警,及时干预。
    • 客户洞察:宏观分析客户整体情绪变化,评估新品发布、营销活动后的客户反馈。

下一步,你可以尝试:

  • 收集一些真实的、脱敏后的客服录音,用这个系统跑一遍,看看效果。
  • 尝试修改batch_process.py脚本,让它输出更漂亮的Excel或HTML报告。
  • 探索模型对笑声、掌声的识别,或许可以用于分析客户满意度调研的访谈录音。

技术的最终目的是解决问题。希望这个搭建指南,能帮你打开智能客服优化的一扇新门。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐