FunASR 前端语音识别代码解析

作者:Cosolar日期:2025/10/10

这是基于Web技术的FunASR( 阿里巴巴达摩院 开源语音识别项目) 前端实现方案,支持麦克风实时录音识别与本地音频文件上传识别两大核心场景。整体功能围绕WebSocket通信、音频数据处理、语音识别结果解析三大关键环节展开,以下从代码结构、核心模块及关键逻辑三方面进行详细剖析。

代码:gitee.com/towao/FunAS…

一、代码整体结构

代码采用原生JavaScript编写,无框架依赖,整体架构清晰,主要划分为初始化配置、UI交互 控制 、音频 数据 处理、WebSocket通信、识别结果解析五大模块,完整流程如下:

  1. 页面加载时初始化 WebSocket 连接对象、录音对象、UI 控件状态;
  2. 用户通过按钮选择「麦克风模式」或「文件模式」,配置识别参数(如热词、是否开启 ITN);
  3. 建立 WebSocket 连接,向后端 FunASR 服务发送音频数据(实时录音流或文件流);
  4. 接收后端返回的识别结果,解析并展示(支持带时间戳的文本输出);
  5. 识别结束后停止连接,支持音频回放。

二、核心模块解析

1. 初始化配置(页面加载时执行)

定义全局对象与初始状态,为后续各模块功能的正常运行奠定基础。

全局变量/对象作用关键参数
wsconnecterWebSocket 连接对象msgHandle:接收后端消息的回调;stateHandle:连接状态变化的回调
rec录音对象(依赖 Recorder.jstype: "pcm"(音频格式);sampleRate: 16000(采样率,ASR 常用);bitRate: 16(位深)
sampleBuf音频数据缓冲区存储待发送的 PCM 音频数据,避免单次发送数据量过大
isfilemode识别模式标记true:文件上传模式;false:麦克风实时模式
rec_text/offline_text识别结果存储分别存储在线/离线识别的文本结果

2. UI 交互与控件绑定

通过绑定页面核心按钮(开始录音、停止录音、连接服务、选择文件)的点击事件,实现识别流程的可视化控制。

关键按钮逻辑

  • 连接按钮(btnConnect) :触发 start() 函数,清除历史结果、初始化 WebSocket 连接,根据模式(文件/麦克风)进入不同流程;
  • 开始录音按钮(btnStart) :触发 record() 函数,调用 rec.open() 初始化录音设备,rec.start() 开始采集音频;
  • 停止录音按钮(btnStop) :触发 stop() 函数,停止录音、发送「结束标识」给后端、关闭 WebSocket 连接;
  • 文件选择按钮(upfile) :触发 upfile.onchange(),读取本地音频文件(支持 WAV 格式),解析文件头获取采样率等信息。

3. 音频处理(核心模块)

该模块是前端音频处理的核心,包含实时录音处理本地文件解析两大分支,最终目标是将音频数据转换为FunASR服务支持的PCM格式。

3.1 实时录音处理(麦克风模式)

在录音过程中,recProcess回调函数会持续触发,对音频流进行实时处理,具体步骤如下:

  1. 采样率转换:录音默认采样率可能为 48kHz,通过 Recorder.SampleData() 转为 16kHz(ASR 服务常用采样率);
  2. 数据缓冲:将转换后的 16kHz PCM 数据存入 sampleBuf
  3. 分片发送:当sampleBuf数据长度达到chunk_size: 960(对应约30ms音频,满足实时ASR低延迟需求)时,进行分片发送至后端,避免单次发送数据量过大导致网络阻塞。

3.2 本地文件解析(文件模式)

通过readWavInfo()函数解析WAV文件头信息,提取关键参数,具体逻辑如下:

  • 验证文件格式:检查是否为「RIFF-WAVE」格式,确保是单声道/双声道 PCM 数据;
  • 提取参数:读取 sampleRate(采样率)、bitRate(位深)、numChannels(声道数);
  • 数据截取:跳过 WAV 文件头(通常 44 字节),仅保留 PCM 数据部分,存入 file_data_array

文件发送逻辑:调用start_file_send()函数,将file_data_arraychunk_size: 960进行分片发送,发送完成后自动调用stop()函数结束流程。

4. WebSocket 通信(与后端交互)

wsconnecter对象封装了WebSocket连接的创建、数据发送、连接关闭等核心逻辑,是前端与FunASR后端服务进行数据交互的关键通道。

4.1 连接初始化

  • 连接地址生成:页面加载时,通过window.location.href自动生成WebSocket连接地址(将https协议转为wss,端口默认设为10095,用户可通过wssip输入框手动修改);
  • 连接状态回调:getConnState()函数负责处理连接状态变化:

4.2 数据发送与接收

  • 数据发送:通过wsconnecter.wsSend()方法发送数据,支持两种数据类型:
  • 结果接收:通过getJsonMessage()函数解析后端返回的JSON格式消息:

5. 识别结果解析与增强

该模块包含时间戳处理热词配置两大功能,旨在提升识别结果的可用性与准确性。

5.1 时间戳处理(handleWithTimestamp()

将后端返回的时间戳数据(格式示例:[[0, 300], [300, 600]],单位为毫秒)与识别文本进行关联,根据语言类型(中文/英文)调整时间戳粒度:

  • 英文:按「单词」拆分,每个单词对应一个时间戳;
  • 中文:按「字符」拆分,每个字符对应一个时间戳;
  • 输出格式:时间戳(秒): 文本片段(示例:0.3: 你好)。

5.2 热词配置(getHotwords()

支持用户自定义热词及对应权重,以此提升特定词汇的识别准确率,具体规则如下:

  • 输入格式:每行一个热词,空格后接权重(如 阿里巴巴 10);
  • 解析逻辑:按换行符拆分输入内容,过滤非数字权重项,最终生成JSON格式数据(示例:{"阿里巴巴": 10}),随连接请求一同发送至后端。

三、关键流程梳理

以下分别以「麦克风实时识别」和「本地文件识别」为场景,梳理完整的业务流程。

1. 麦克风实时识别流程

  1. 点击「连接」按钮,触发start()函数,清除历史识别结果并初始化WebSocket连接;
  2. 监听连接状态,若连接失败则弹窗提示地址错误,并重置按钮状态;
  3. 连接成功后,页面提示「连接成功,点击开始」,同时启用「开始录音」按钮;
  4. 点击「开始录音」按钮,触发record()函数,初始化录音设备并启动音频采集;
  5. 录音过程中,recProcess()函数实时处理音频流,将转换后的16kHz PCM数据存入sampleBuf,当数据长度达到960时进行分片发送;
  6. 点击「停止录音」按钮,触发stop()函数,停止录音并向后端发送「结束标识」;
  7. 通过getJsonMessage()函数接收并解析后端返回的最终识别结果;
  8. 更新页面文本框展示识别结果,随后关闭WebSocket连接。

2. 本地文件识别流程

  1. 选择「文件模式」,页面自动切换至文件上传相关交互界面;
  2. 点击「选择文件」按钮上传WAV格式音频文件,触发upfile.onchange()函数解析文件头,提取采样率、位深等参数及PCM数据存入file_data_array
  3. 点击「连接」按钮,触发start()函数,清除历史结果并初始化WebSocket连接;
  4. 监听连接状态,若连接失败则弹窗提示地址错误,重置按钮状态;
  5. 连接成功后,触发start_file_send()函数,将file_data_array按960的chunk_size进行分片发送;
  6. 通过getJsonMessage()函数接收并解析后端返回的识别结果;
  7. 判断结果是否为最终结果(is_final=true),若是则调用play_file()函数进行音频回放,并关闭WebSocket连接;
  8. 更新页面文本框展示识别结果,提示用户「请点击连接」以开始下一次识别。

四、注意事项与扩展建议

  1. 浏览器兼容性
    1. WebSocket与录音功能依赖HTTPS环境(localhost除外),HTTP环境下可能存在功能限制;
    2. 录音功能需用户授权麦克风权限,部分浏览器(如Safari)需手动触发授权流程。
  2. 后端依赖
    1. 需部署FunASR后端服务(默认端口为10095),确保服务支持WebSocket协议与PCM音频输入;
    2. 识别模式(在线/离线)需后端服务支持,文件模式下强制使用离线模式(mode: "offline")。
  3. 功能扩展
    1. 支持更多音频格式(如MP3):需引入音频解码库(如lamejs)将非PCM格式转换为PCM;
    2. 实时字幕展示:基于timestamp字段实现逐句/逐词的滚动字幕效果;
    3. 识别结果导出:添加「导出TXT」功能按钮,将varArea中的识别文本下载为本地文件。

该代码是FunASR前端应用的典型实现方案,核心在于音频格式适配WebSocket实时通信两大技术点,确保前端采集与解析的音频数据能被后端ASR服务正确处理,同时通过友好的UI交互与结果增强功能(时间戳、热词)提升整体用户体验。


FunASR 前端语音识别代码解析》 是转载文章,点击查看原文


相关推荐


Python私教FastAPI+React构建Web应用03 FARM技术栈介绍
Python私教2025/10/9

写在前面 作者:Python私教-张老师 时间:2025年10月07日 出处:电子书《Build Web Applications with FastAPI, React, and MongoDB》 翻译:英文是手抄的,可能会有错误,大家看到了请谅解一下。中文是使用有道词典翻译的。 改进:其中有些地方为了适配国内的阅读习惯以及录播课程,做了一些优化处理,可能会和原书不一样的地方。 简介:本篇文章主要介绍FARM技术栈,分别讲解FastAPI,React和MongoDB的优势以及组合后


“成章”写作助手开源:中秋赏不成月,那就开源一个 AI 实战项目吧
飞哥数智谈2025/10/7

前一阵的实战系列分享中,我们一块实现了一个 AI 写作助手 —— 成章。 当时就打算开源出来,方便感兴趣的同学学习、二开,但一直被各种事情打断,拖到了现在。 今天,赶上中秋节,但阴天没法赏月,索性整理一下先发布出来,需要的自取哈! 简介 “成章”写作助手是一个专为写作者设计的现代化写作平台,实现了文章编写、AI 辅助写作、图片上传等功能,旨在提供高效、便捷的写作体验。 前端开源地址:gitee.com/FlyFive/che… 后端开源地址:gitee.com/FlyFive/che… 功能


草梅 Auth 1.9.0 发布验证码组件 | 2025 年第 40 周草梅周报
草梅友仁2025/10/6

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。 前言 欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。 本周依旧在开发 草梅 Auth 中。 你也可以直接访问官网地址:auth.cmyr.dev/ Demo 站:auth-demo.cmyr.dev/ 文档地址:auth-docs.cmyr.dev/ 本周 草梅


SwiftUI redraw 机制全景解读:从 @State 到 Diffing
unravel20252025/10/4

为什么 UIKit 程序员总问“我的状态去哪了?” 特性UIKitSwiftUI视图定义与生命周期视图为类(Class),生命周期明确,长期驻留内存视图为值类型(Struct),每次刷新生成新实例状态保存方式状态保存在视图对象内部Struct 销毁后,状态需由外部系统(如 ObservableObject、@State 等)托管 SwiftUI 提供了一堆 Property Wrapper 来“假装”状态还在视图里,核心就是 @State。 @State


Vue基础10题:答不上来的,简历别写"熟悉Vue"
小时前端2025/10/3

前言 上周面了个应届生,简历上写着"熟悉Vue框架,有多个项目经验"。我问他v-if和v-show的区别,他说"一个是显示隐藏,一个是条件渲染"。我追问"那什么场景用哪个",他卡壳了,这就是典型的‘背题党’。 这就是大部分人的现状:概念背得滚瓜烂熟,一问实战场景就露馅。 今天这10道Vue基础题,每道题我都会告诉你:面试官为什么问这个、标准答案怎么说、什么回答会让你直接出局。每题都配"速记公式",面试前一晚看这篇就够了。 1. 什么是Vue.js?Vue的核心特性和设计理念是什么? 速记公式:


使用 uv 在 Windows 上快速搭建 Python 开发环境
马诗剑2025/10/2

本教程将指导你如何在 Windows 系统上,使用 uv(一个由 Ruff 的作者开发的极速 Python 打包和项目管理工具)来快速创建虚拟环境并安装项目依赖。uv 可以看作是 venv 和 pip 的一个更快、更现代的替代品。 环境要求 Windows 操作系统 已安装 Python (本教程以 Python 3.12 为例) Windows PowerShell 步骤 1: 安装 uv 首先,我们需要安装 uv。这里提供两种方法。 方法一:官方推荐脚本 (推荐) 从开始


Qwen-Image:开源图像生成新突破 —— 聚焦复杂文本渲染与精准图像编辑
算法打盹中2025/10/2

引言 继Qwen-coding与Qwen-reasoning模型取得突破性进展后,阿里巴巴Qwen团队推出了Qwen-Image模型。作为Qwen系列中的开源图像生成基础模型,该模型在复杂文本渲染与精确图像编辑领域实现了显著技术突破。 图像生成领域的核心挑战 尽管图像生成技术在近年取得长足进步,但特定任务场景下的技术瓶颈仍未完全突破: 在文本到图像生成(T2I)任务中,模型输出与多维度复杂提示词的语义对齐仍是亟待解决的关键问题。即便如GPT Image 1及Seedream 3.0等主流


【stm32】CAN分析仪+TJA1050+单片机通信不上,波特率等等都没问题,usb扩展坞的供电问题,绝了
小冷Hello10/2/2025

我就是,绝了,之前都没问题,好久没弄这个CAN了,然后想着插usb扩展坞有隔离安全一点,搞了半天检查代码有检查硬件,怎么都不行,结果突然拔掉插到电脑是,就又有了,绝!注意电源哈,tja1050要5v供电,单独连接到stlink的5v,因为是CAN是差分信号。,否则会出现重复终端(总阻值变小,例如 30Ω 左右),总线电平和收发都会异常。接收器,这里直接rx-rx,tx-tx,注意要区分跟串口不一样,然后再检查那个上位机和单片机波特率要一致,比如125kb,然后我又插回usb扩展坞,绝,又可以了。


[论文阅读] AI + 软件工程(Debug)| 告别 “猜 bug”:TreeMind 用 LLM+MCTS 破解 Android 不完整报告复现难题
张较瘦_10/1/2025

为解决Android bug报告(尤其不完整报告与高复杂度UI场景)自动复现的挑战——现有RL方法(如ReproBot)语义理解弱、LLM方法(如AdbGPT、ReBL)缺乏全局规划,易陷入UI组合爆炸困境,研究者提出**TreeMind**:首个将**LLM语义推理与定制化蒙特卡洛树搜索(MCTS)** 结合的技术。其核心是通过两个LLM引导智能体(**Expander**在MCTS扩展阶段生成top-k候选动作,**Simulator**在模拟阶段一步前瞻估计复现概率),结合多模态UI输入(文本+截图)


VSCode中Python库识别的设置(关于解决VSCode中Python库引入未下载的库不显示黄色虚线的问题)
岫珩9/30/2025

这篇文章介绍了如何解决VSCode中Python库未下载时不会显示黄色虚线警告的问题。通过分析发现,这可能是由于Pylance插件的配置问题导致的。解决方案包括:首先确保安装了Pylance插件,然后在设置中勾选"Enable Troubleshoot Missing Imports"选项,并检查"Diagnostics Source"是否设置为Pylance。最后重启VSCode即可使未下载的库显示黄色虚线警告。文章配有详细的操作截图指引,帮助读者快速解决问题。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0