vosk-ASR python调用[AI人工智能(五十一)]—东方仙盟

核心代码

客户端完整代码

复制代码
#!/usr/bin/env python3

import wave
import sys
import traceback

from websocket import create_connection

ws = create_connection("ws://localhost:2700")

wf = wave.open(sys.argv[1], "rb")
ws.send('{ "config" : { "sample_rate" : %d } }' % (wf.getframerate()))
buffer_size = int(wf.getframerate() * 0.2) # 0.2 seconds of audio

try:

    while True:
        data = wf.readframes(buffer_size)

        if len(data) == 0:
            break

        ws.send_binary(data)
        print (ws.recv())
    ws.send('{"eof" : 1}')
    print (ws.recv())

except Exception as err:
    print(''.join(traceback.format_exception(type(err), err, err.__traceback__)))

基于 Vosk 语音识别引擎、通过 WebSocket 协议实现音频文件实时转写的 Python 代码。Vosk 是一款开源离线语音识别工具,代码核心逻辑是把音频文件切成小块,通过 WebSocket 传给本地 Vosk 服务,逐段获取识别结果,最后完成完整转写。下面用初学者能懂的语言(少量东方仙盟比喻)拆解代码的每一部分。

一、代码整体作用

这段代码的核心功能:读取本地 WAV 格式音频文件建立与本地 Vosk WebSocket 服务的连接按固定时长切割音频数据逐段发送音频数据给 Vosk 服务实时接收并打印语音识别结果发送结束信号并获取最终识别结果。可以类比成:你(代码)是 "东方仙盟" 的传讯弟子,要把一卷长音频 "天书" 拆成小份,通过 "WebSocket 仙桥" 传给盟里的 "Vosk 语音仙师",仙师看完一小份就告诉你内容,直到整卷天书解读完毕。

二、逐行代码解释

python

运行

复制代码
#!/usr/bin/env python3
  • 作用:指定代码用 Python3 解释器运行,是 Linux/macOS 系统的 "约定",Windows 下可忽略。
  • 比喻:相当于给 "传讯弟子" 指定了专属的 "修行法门(Python3)",确保执行规则统一。

python

运行

复制代码
import wave
import sys
import traceback
from websocket import create_connection
  • 导入核心库:
    • wave:Python 内置库,专门读取 WAV 格式音频文件(处理音频的 "天书解码器");
    • sys:获取命令行参数(接收外界传入的 "天书路径");
    • traceback:捕获并打印详细的错误信息(记录 "传讯过程中的差错");
    • websocket.create_connection:创建 WebSocket 连接(搭建和 "Vosk 仙师" 沟通的 "仙桥")。

python

运行

复制代码
ws = create_connection("ws://localhost:2700")
  • 核心操作:连接本地 2700 端口的 Vosk WebSocket 服务。
  • 前提:你需要先启动 Vosk 的 WebSocket 服务(比如通过vosk-server-websocket命令),否则会报错 "连接失败"。
  • 比喻:弟子通过 "仙桥"(WebSocket)连接到仙师的洞府(localhost:2700),准备传讯。

python

运行

复制代码
wf = wave.open(sys.argv[1], "rb")
  • 作用:读取命令行传入的第一个参数(即 WAV 音频文件路径),以二进制只读模式打开。
  • 示例:运行代码时需输入python3 代码名.py 音频文件.wavsys.argv[1]就是 "音频文件.wav"。
  • 比喻:弟子拿到外界送来的 "天书"(音频文件),用 "解码器"(wave.open)打开准备拆解。

python

运行

复制代码
ws.send('{ "config" : { "sample_rate" : %d } }' % (wf.getframerate()))
  • 作用:向 Vosk 服务发送配置信息,核心是告知音频的采样率(wf.getframerate()获取 WAV 文件的采样率,比如 16000Hz)。
  • 比喻:弟子先告诉仙师 "天书的文字编码规则(采样率)",确保仙师能看懂后续的内容。

python

运行

复制代码
buffer_size = int(wf.getframerate() * 0.2) # 0.2 seconds of audio
  • 作用:计算每次发送的音频数据长度,即 "0.2 秒的音频帧数量"(采样率 × 时长)。比如采样率 16000 时,buffer_size=3200,每次读 3200 帧(0.2 秒)。
  • 比喻:弟子把 "天书" 按 "每 0.2 页" 切成小份,避免一次传太多导致仙桥拥堵。

python

运行

复制代码
try:
    while True:
        data = wf.readframes(buffer_size)
        if len(data) == 0:
            break
        ws.send_binary(data)
        print (ws.recv())
    ws.send('{"eof" : 1}')
    print (ws.recv())
  • 核心逻辑(逐行拆解):
    1. while True:循环读取音频数据,直到读完;
    2. data = wf.readframes(buffer_size):读取 buffer_size 帧的音频数据(0.2 秒);
    3. if len(data) == 0: break:如果没有数据了(音频读完),退出循环;
    4. ws.send_binary(data):以二进制形式发送音频数据给 Vosk 服务;
    5. print (ws.recv()):接收 Vosk 返回的实时识别结果并打印;
    6. ws.send('{"eof" : 1}'):发送 "EOF(文件结束)" 信号,告知 Vosk 音频已传完;
    7. print (ws.recv()):接收最终的完整识别结果。
  • 比喻:弟子循环切分 "天书",每次送一小份给仙师,仙师看完立刻告诉弟子解读结果;等天书全送完,弟子说 "解读完毕",仙师给出最终的完整解读。

python

运行

复制代码
except Exception as err:
    print(''.join(traceback.format_exception(type(err), err, err.__traceback__)))
  • 作用:捕获代码运行中的所有异常(比如连接断开、音频文件不存在、采样率不匹配等),并打印详细的错误堆栈,方便排查问题。
  • 比喻:如果传讯过程中仙桥断了、天书损坏,弟子会记录详细的 "差错日志",方便后续排查。

三、初学者使用前的准备

  1. 环境安装

    • 安装依赖库:pip install wave websocket-client vosk(注意:wave 是 Python 内置库,无需额外装;websocket-client 是 WebSocket 连接的核心库);

    • 下载 Vosk 模型:从 Vosk 官网(https://alphacephei.com/vosk/models)下载对应语言的模型(比如中文模型vosk-model-small-cn-0.22);

    • 启动 Vosk WebSocket 服务: bash

      运行

      复制代码
      vosk-server-websocket -m 模型路径 -p 2700

      (-m 指定模型路径,-p 指定端口 2700,和代码中的ws://localhost:2700对应)。

  2. 音频文件要求

    • 必须是 WAV 格式;
    • 采样率需和 Vosk 模型匹配(比如中文小模型是 16000Hz);
    • 单声道、16 位深度(Vosk 的默认要求)。

四、运行示例

假设你有一个 16000Hz 采样率的中文 WAV 音频文件test.wav,步骤:

  1. 启动 Vosk WebSocket 服务:vosk-server-websocket -m vosk-model-small-cn-0.22 -p 2700
  2. 运行代码:python3 asr_code.py test.wav
  3. 输出:逐段打印实时识别结果,最后打印完整结果(JSON 格式,包含识别的文字)。

总结

  1. 核心逻辑:通过 WebSocket 将 WAV 音频按固定时长分片发送给本地 Vosk 服务,实时获取语音识别结果,最后发送结束信号获取完整结果;
  2. 关键前提:需先启动 Vosk WebSocket 服务、确保音频格式(WAV、采样率匹配、单声道)符合要求;
  3. 核心库作用:wave读音频、websocket建立连接、sys获取命令行参数,异常捕获确保代码鲁棒性。

(东方仙盟比喻总结:代码像 "传讯弟子",WebSocket 是 "仙桥",Vosk 是 "语音仙师",音频文件是 "天书",拆解发送是为了 "高效解读",最终得到 "天书的文字内容(识别结果)"。)

东方仙盟:拥抱知识开源,共筑数字新生态

在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。

开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。

共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议 与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。

知识普惠,共促发展:通过开源社区 、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济 的普惠式增长

阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目 维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基 生命,为科技进步添砖加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology

相关推荐
AI浩1 小时前
小目标检测:微小目标的精准感知调研
人工智能·目标检测·计算机视觉
工业机器视觉设计和实现1 小时前
人工智能的革命范式(对称美)
人工智能·cudnn微积分
trsoliu1 小时前
本地 AI Agent Memory 系统建设方案
人工智能
月落三千雪1 小时前
使用AI智能体搭建知识库-RAG语义检索
人工智能
汀沿河1 小时前
2 模型预训练、微调、强化学习的格式
人工智能·算法·机器学习
灵机一物1 小时前
灵机一物AI智能电商小程序(已上线)-产品化架构与全场景功能解析
人工智能
黄焖鸡能干四碗2 小时前
业务数据中台技术方案(PPT)
大数据·数据库·人工智能·安全·需求分析
KG_LLM图谱增强大模型2 小时前
Palantir “本体论”:是跨时代的AI架构,还是精心包装的“建表”骗局?
人工智能
东离与糖宝2 小时前
AI 智能体安全踩坑记:Java 为 OpenClaw 添加权限控制与审计日志实战
java·人工智能