恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
FunASR Android 客户端实战:基于 WebSocket 的流式语音识别应用,从构建、运行到协议解析
首页
资讯中心
/
FunASR Android 客户端实战:基于 WebSocket 的流式语音识别应用,从构建、运行到协议解析
FunASR Android 客户端实战:基于 WebSocket 的流式语音识别应用,从构建、运行到协议解析
发布时间:2026/9/13 12:31:55
FunASR Android 客户端实战基于 WebSocket 的流式语音识别应用从构建、运行到协议解析【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASRFunASR 官方仓库的runtime/android目录下提供了一个可直接运行的 Android 语音识别示例客户端。它不是把 FunASR 模型部署进手机端而是通过 WebSocket 连接远程 FunASR 在线识别服务将手机麦克风采集的 PCM 音频流式上传实现按住说话、松开出结果的实时识别体验。读完本文你将掌握该 Android 客户端的构建与安装方法、服务端部署前提、WebSocket 交互协议细节以及其源码中的录音、SSL 与波形可视化等关键实现。一、项目定位客户端架构而非端侧部署首先必须明确runtime/android/AndroidClient是 FunASR 在线服务的客户端它依赖一台已经部署好 FunASR 在线识别服务2pass 流式/非流式的服务器通过 WebSocket 长连接完成语音的实时上传与识别结果的实时回传并不会在 Android 设备上运行 ASR 模型、也不占用手机算力。服务端的启动与配置方式请查阅仓库内的在线服务部署文档SDK_advanced_guide_online_zh.md英文版见 SDK_advanced_guide_online.md。只有先准备好可用的 WebSocket 服务地址客户端才能正常工作。从工程结构看整个客户端是一个标准的单模块 Android 工程位于 AndroidClient入口与业务逻辑app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.javaSSL 工具类app/src/main/java/com/yeyupiaoling/androidclient/SSLSocketClient.java波形可视化控件app/src/main/java/com/yeyupiaoling/androidclient/AudioView.java界面布局app/src/main/res/layout/activity_main.xml、dialog_input_uri.xml、dialog_input_hotwords.xml菜单定义app/src/main/res/menu/menu.xml权限声明app/src/main/AndroidManifest.xml二、构建与安装两种上手方式2.1 使用 Android Studio 构建使用最新版本的 Android Studio直接打开AndroidClient工程目录即 runtime/android/AndroidClient等待 Gradle 同步完成后运行到手机或模拟器即可。工程关键构建配置见 app/build.gradle配置项取值说明applicationIdcom.yeyupiaoling.androidclient应用包名compileSdk/targetSdk33编译与目标 SDKminSdk24最低支持 Android 7.0versionName1.0应用版本OkHttpcom.squareup.okhttp3:okhttp:4.9.1负责 WebSocket 连接AppCompat / Material1.6.1/1.8.0UI 基础组件依赖仓库配置见 settings.gradle统一从google()与mavenCentral()拉取依赖。2.2 直接安装 APK除自行构建外原文档还提供了直接下载 APK 安装包安装使用的方式也可使用手机扫码下载二维码见 runtime/android/images/QRcode.png。两种方式任选其一即可体验。三、使用说明按住说话松开出结果应用的功能非常聚焦按下录音按钮开始识别松开按钮结束识别。首次打开应用时会弹出对话框要求设置 WebSocket 服务地址之后也可以在右上角菜单中随时修改地址或热词。菜单项定义在 menu.xml服务地址change_uri修改 WebSocket 服务地址热词change_hotwords修改热词表提升指定词汇的识别命中率。主界面见 activity_main.xml自下而上由三部分组成底部的按下录音按钮、上方的实时波形区域AudioView录音时显示、以及占满剩余空间的识别结果文本区。应用效果图如下四、源码剖析一条完整的流式识别链路4.1 运行时权限申请应用在onCreate中即检查并申请录音与外部存储权限见 MainActivity.java 的hasPermission()/requestPermission()同时在 AndroidManifest.xml 中声明了INTERNET、RECORD_AUDIO、WRITE_EXTERNAL_STORAGE三项权限。4.2 录音参数与音频采集录音器使用系统AudioRecord关键常量定义在 MainActivity.java常量值说明SAMPLE_RATE16000采样率 16 kHz与 FunASR 前端要求一致CHANNELCHANNEL_IN_MONO单声道AUDIO_FORMATENCODING_PCM_16BIT16 bit PCMSEND_SIZE1920每次读取/发送的音频字节数按下按钮后startRecording()创建AudioRecord并启动录音线程录音循环中每次读取SEND_SIZE字节封装为ByteString后通过 WebSocket 发送给服务端同时把原始字节交给AudioView.setWaveData()驱动波形绘制。松开按钮时stopRecording()释放录音器并发送一条{is_speaking: false}的 JSON 消息告知服务端本次语音结束对应源码 MainActivity.java。4.3 WebSocket 握手协议getMessage()连接建立后客户端首先发送一条 JSON 配置消息其生成逻辑集中在getMessage(boolean isSpeaking)MainActivity.java核心字段如下{ mode: 2pass, chunk_size: [5, 10, 5], chunk_interval: 10, wav_name: default, hotwords: {\阿里巴巴\:20,\达摩院\:20,\夜雨飘零\:20}, wav_format: pcm, is_speaking: true }各字段含义与取值依据mode识别模式源码中固定为2pass即流式 非流式两遍识别的混合模式对应服务端 2pass 在线服务chunk_size分块大小源码为5, 10, 5会被按逗号拆分为[5,10,5]整数数组发送chunk_interval分块间隔固定为10wav_name本次音频标识示例固定为defaulthotwords热词表由用户输入的文本按行拆分、再按空格拆成词 权重对最终序列化为 JSON 字符串。默认热词为阿里巴巴 20 / 达摩院 20 / 夜雨飘零 20格式不合法非两段的行会被跳过并打印hotWords格式不正确日志wav_format音频格式固定为pcm与服务端约定的裸 PCM 流对应is_speaking是否正在说话首包为true结束包为false。4.4 识别结果接收与展示服务端消息在WebSocketListener.onMessage中处理MainActivity.java解析 JSON 中的text识别文本、mode消息模式、is_final是否结束标志当mode为2pass-offline时属于非流式最终结果追加到allAsrText并清空asrText源码注释指出这里可以做一些自动停止录音识别的程序其他模式流式中间结果追加到asrText界面实时刷新allAsrText asrText若is_final为true主动以状态码1000关闭 WebSocket结束本次识别。4.5 自签名证书处理SSLSocketClient默认服务地址为wss://101.37.77.25:10088见 MainActivity.java 的DEFAULT_HOST是带 TLS 的 WebSocket。由于私有部署的服务端常使用自签名证书SSLSocketClient.java提供了信任所有证书的SSLSocketFactory、X509TrustManager以及不校验域名的HostnameVerifier并在构建 OkHttpClient 时通过.sslSocketFactory(...)与.hostnameVerifier(...)注入MainActivity.java。注意信任所有证书仅适用于测试/内网环境若面向公网生产使用应替换为正规 CA 证书校验避免中间人攻击风险。4.6 波形可视化AudioViewAudioView是一个自定义 ViewAudioView.java将每次送入的 PCM 字节转换为 128 个柱条LUMP_COUNT支持STYLE_HOLLOW_LUMP空心柱、STYLE_WAVE曲线、STYLE_NOTHING不显示三种样式上下半区可分别配置录音循环每发送一包数据就post一次setWaveData实现接近实时的频谱跳动效果为应用提供直观的正在录音反馈。五、配置持久化与自定义扩展5.1 地址与热词的本地持久化应用使用SharedPreferences文件名为FunASR保存两项配置MainActivity.javauriWebSocket 服务地址首次启动为空时强制弹出输入框输入确认后写入对话框还提供使用官方服务按钮一键填入DEFAULT_HOSThotwords热词文本非空时覆盖默认热词。再次打开应用时直接读取本地保存值无需重复配置。5.2 面向实际项目的改造点基于上述源码将示例改造成生产级应用时可关注采样率与分块SAMPLE_RATE、SEND_SIZE、CHUNK_SIZE、CHUNK_INTERVAL需与服务端 2pass 在线服务配置保持一致修改前请对照 SDK_advanced_guide_online_zh.md 中服务端的分块参数约定热词交互热词格式为词 权重每行一条权重为整数如20客户端会按空格拆分并组装为hotwordsJSON 字符串下发自动停止源码在收到2pass-offline最终结果时预留了自动停止录音识别的扩展点注释可实现说话停顿自动结束录音安全加固将SSLSocketClient的信任所有证书逻辑替换为正规证书链校验并对wss://地址做合法性校验。六、总结FunASR 的 Android 客户端示例完整演示了移动端采集 服务端识别的经典在线 ASR 架构通过 OkHttp 建立 WebSocket 长连接以 16 kHz 单声道 PCM 分块上行用一段 JSON 握手消息声明2pass模式、分块参数与热词再根据mode/is_final字段区分流式中间结果与最终结果并实时渲染。整条链路的协议字段与交互时序均可在 MainActivity.java 中逐行验证是快速对接 FunASR 在线服务、或在其基础上定制按住说话类语音交互应用的可靠起点。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考