语音评测技术作为人工智能领域的重要应用之一,在教育、语言学习等领域发挥着越来越重要的作用。本文将详细介绍如何基于WebSocket协议和讯飞开放平台实现一个实时语音评测系统,该系统能够对用户朗读的中英文内容进行实时评测并给出评分反馈。

系统架构概述

整个语音评测系统采用前后端分离的架构设计:

  1. 前端部分:基于Vue.js框架和Element UI组件库实现用户界面

  2. 通信层:使用WebSocket协议与讯飞语音评测服务建立实时连接

  3. 评测服务:依托讯飞开放平台的语音评测API实现核心评测功能

系统工作流程如下:

  1. 用户在前端选择评测题型并输入/获取评测文本

  2. 前端通过WebSocket与讯飞服务建立连接

  3. 用户开始朗读,系统实时采集音频数据

  4. 音频数据通过WebSocket发送到评测服务

  5. 服务返回评测结果并在前端展示

关键技术实现

1. 前端界面设计

系统使用Element UI组件库构建了直观的用户界面,主要分为三个部分:

<template>
  <div class="Evaluate-container">
    <!-- 评测题型列表 -->
    <div>
      <el-row :gutter="10" style="border-bottom: 1px dashed grey">
        <!-- 各种题型卡片 -->
      </el-row>
    </div>
    
    <!-- 合成文本区域 -->
    <div>
      <el-input type="textarea" v-model="iseContent" rows="15"></el-input>
    </div>
    
    <!-- 操作按钮 -->
    <el-button type="primary" @click="recordEvaluate">录音评测</el-button>
    <el-button type="danger" @click="stopScore">停止打分</el-button>
  </div>
</template>

题型选择区采用卡片式布局,每种题型包含:

  • 图标标识

  • 题型名称

  • 适用语言和人群标签

  • 单选按钮

2. 音频采集与处理

系统使用recorder.js库实现浏览器端的音频采集:

// 初始化录音工具
let recorder = new Recorder("../../recorder")
recorder.onStart = () => {
  console.log("开始录音了")
}
recorder.onStop = () => {
  console.log("结束录音了")
}

// 帧录音回调
recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {
  if (!isLastFrame && wsFlag) {
    // 发送中间帧数据
    const params = {
      "business": {
        "cmd": "auw",
        "aus": 1,
        "aue": "raw"
      },
      "data": {
        "status": 1,
        "data": toBase64(frameBuffer),
        "data_type": 1,
        "encoding": "raw"
      }
    }
    wsTask.send(JSON.stringify(params))
  } else {
    // 发送结束帧
    const params = {
      "business": {
        "cmd": "auw",
        "aus": 4,
        "aue": "raw"
      },
      "data": {
        "status": 2,
        "data": ""
      }
    }
    wsTask.send(JSON.stringify(params))
  }
}

音频参数配置:

  • 采样率:16000Hz

  • 帧大小:1280字节

  • 编码格式:原始PCM(raw)

3. WebSocket通信实现

系统与讯飞语音评测服务的通信基于WebSocket协议,主要流程包括:

  1. 建立连接:获取鉴权URL并创建WebSocket连接

async wsInit() {
  let _this = this;
  let reqeustUrl = await _this.getWebSocketUrl()
  wsTask = new WebSocket(reqeustUrl);
  
  wsTask.onopen = function() {
    // 发送第一帧数据
    let params = {
      "common": { "app_id": atob(_this.user.appid) },
      "business": {
        "rst": "entirety",
        "ise_unite": "1",
        "category": _this.category,
        "ent": _this.ent,
        "text": _this.utf8bom + _this.iseContent
      },
      "data": { "status": 0, "data": "" }
    }
    wsTask.send(JSON.stringify(params))
    
    // 开始录音
    recorder.start({ sampleRate: 16000, frameSize: 1280 });
  }
}
  1. 鉴权处理:使用HMAC-SHA256算法生成签名

getWebSocketUrl() {
  return new Promise((resolve, reject) => {
    var url = this.URL;
    var host = "ise-api.xfyun.cn";
    var apiKeyName = "api_key";
    var date = new Date().toGMTString();
    var algorithm = "hmac-sha256";
    var headers = "host date request-line";
    var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/open-ise HTTP/1.1`;
    var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, atob(this.user.apisecret));
    var signature = CryptoJS.enc.Base64.stringify(signatureSha);
    var authorizationOrigin = `${apiKeyName}="${atob(this.user.apikey)}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
    var authorization = base64.encode(authorizationOrigin);
    url = `${url}?authorization=${authorization}&date=${encodeURI(date)}&host=${host}`;
    resolve(url);
  });
}
  1. 消息处理:接收评测结果并解析

wsTask.onmessage = function(message) {
  let resJson = JSON.parse(message.data);
  if (resJson.data.status == 2) {
    let res = base64.decode(resJson.data.data)
    _this.iseContent = res
    wsTask.close();
    wsFlag = false
  }
}

4. 多题型支持

系统支持多种评测题型,通过watch监听题型变化并自动填充示例文本:

watch: {
  radio(newVal, oldVal) {
    let tempArray = newVal.split("+")
    this.ent = tempArray[0]
    this.category = tempArray[1]
    
    switch(newVal) {
      case "cn_vip+read_syllable":
        this.iseContent = "国"
        break
      case "cn_vip+read_word":
        this.iseContent = "中国"
        break
      // 其他题型处理...
    }
  }
}

支持的题型包括:

  • 中文:单字、词语、句子、篇章评测

  • 英文:单词、句子、篇章、选择、复述、自由评测等

系统特色与优化

  1. 实时性优化

    • 采用WebSocket协议实现低延迟通信

    • 音频数据分帧传输,减少等待时间

    • 前端实时显示评测结果

  2. 多题型适配

    • 统一接口支持多种评测模式

    • 自动根据题型填充示例文本

    • 支持中英文不同评分标准

  3. 安全性保障

    • 使用HMAC-SHA256进行API鉴权

    • 敏感信息(API Key)进行Base64编码处理

    • 通信数据加密传输

  4. 用户体验优化

    • 响应式界面设计

    • 操作流程简洁明了

    • 实时反馈和错误提示

实现效果展示

系统实现了以下核心功能:

  1. 多种语音评测题型选择

  2. 实时音频采集与传输

  3. 评测结果实时返回

  4. 中英文双语支持

  5. 不同年龄段适配

操作流程:

  1. 用户选择评测题型

  2. 系统自动填充示例文本

  3. 点击"录音评测"开始朗读

  4. 系统实时传输音频数据

  5. 评测完成显示结果

总结与展望

本文详细介绍了一个基于WebSocket的实时语音评测系统的设计与实现。系统充分利用现代Web技术(Vue.js、WebSocket)和讯飞开放平台的语音评测能力,实现了高效、稳定的语音评测功能。

未来可改进方向:

  1. 增加更多语种支持

  2. 实现更详细的发音问题分析

  3. 加入历史记录和对比功能

  4. 开发移动端适配版本

  5. 增加AI辅助练习功能

该系统可作为在线教育平台的核心模块,为语言学习者提供实时、准确的发音反馈,具有广阔的应用前景。

Logo

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

更多推荐