vosk-ASR php调用[AI人工智能(四十九)]—东方仙盟

核心代码

完整客户端代码

复制代码
<?php

require_once("./vendor/autoload.php");

use WebSocket\Client;

$client = new Client("ws://localhost:2700/", array('timeout' => 2000));
$myfile = fopen("test.wav", "r");
while(!feof($myfile)) {
   $data = fread($myfile, 8000);
   $client->send($data, 'binary');
   echo $client->receive() . "\n";
}
$client->send("{\"eof\" : 1}");
echo $client->receive() . "\n";
fclose($myfile);

?>

一、代码整体功能(Vosk 场景下)

这段代码是一个Vosk 语音识别服务的 WebSocket 客户端,核心作用是:

  1. 读取本地的 test.wav 音频文件(语音文件);
  2. 通过 WebSocket 协议,把音频数据分片发送到本地运行的 Vosk WebSocket 服务端(端口 2700);
  3. 接收 Vosk 服务端返回的实时语音识别结果;
  4. 音频发送完成后,告知服务端 "传输结束",并接收最终的识别结果。

简单说:你把本地的语音文件 "拆成小块" 传给 Vosk 服务,Vosk 一边接收一边识别,实时返回结果,最后返回完整识别文本。

二、逐行代码解释(新手友好版)

php

运行

复制代码
<?php
// 1. 引入第三方库的自动加载文件(WebSocket客户端依赖这个)
// 作用:不用手动一个个引入WebSocket相关的类文件,composer会自动处理
require_once("./vendor/autoload.php");

// 2. 引入WebSocket客户端类(相当于"拿过来"别人写好的WebSocket工具)
use WebSocket\Client;

// 3. 创建WebSocket客户端,连接到本地Vosk的WebSocket服务(端口2700)
// timeout=2000:连接/收发数据的超时时间是2000毫秒(2秒),避免一直等
$client = new Client("ws://localhost:2700/", array('timeout' => 2000));

// 4. 打开本地的test.wav音频文件,模式是"只读(r)"
// test.wav必须是Vosk支持的格式(16kHz、单声道、PCM编码),否则识别会出错
$myfile = fopen("test.wav", "r");

// 5. 循环读取音频文件,直到文件末尾(feof=file end of file)
while(!feof($myfile)) {
   // 6. 每次读取8000字节的音频数据(分片读取,避免一次性传太大)
   $data = fread($myfile, 8000);
   // 7. 通过WebSocket发送二进制音频数据('binary'指定是二进制,不是文本)
   $client->send($data, 'binary');
   // 8. 接收Vosk服务端返回的实时识别结果,并打印
   echo $client->receive() . "\n";
}

// 9. 音频发送完后,给Vosk服务端发一个"结束标识"(JSON格式)
$client->send("{\"eof\" : 1}");
// 10. 接收Vosk返回的最终完整识别结果,并打印
echo $client->receive() . "\n";

// 11. 关闭音频文件,释放资源
fclose($myfile);
?>

三、在 Vosk 中的核心作用

Vosk 是一个离线语音识别工具,它支持 WebSocket 服务模式:

  1. 服务端 :你需要先启动 Vosk 的 WebSocket 服务(监听localhost:2700),这个服务负责处理音频、做语音识别;
  2. 客户端(这段代码):作为 "数据传输器",把本地的 WAV 音频文件分片传给 Vosk 服务端,同时接收识别结果。

关键细节(新手必看)

  • 为什么要 "分片发送"?WAV 文件可能很大,一次性发送会占满网络 / 内存,分片(每次 8000 字节)是更稳定的方式,也符合 Vosk 流式识别的设计(边传边识别)。
  • 为什么指定'binary'?音频数据是二进制格式(不是文字),如果不指定,WebSocket 会把它当文本处理,导致数据错乱,Vosk 无法识别。
  • {"eof" : 1}的作用?告诉 Vosk 服务端 "音频已经传完了",服务端收到后会返回最终的完整识别结果,而不是实时的中间结果。

四、使用前提(新手要注意)

  1. 必须先安装依赖:这段代码用了 PHP 的 WebSocket 客户端库,需要通过composer安装(执行composer require textalk/websocket);
  2. Vosk 服务端必须启动:要先运行 Vosk 的 WebSocket 服务(比如python vosk_server_websocket.py),且端口是 2700;
  3. 音频文件格式正确:test.wav必须是16kHz 采样率、单声道、16 位 PCM 编码(Vosk 的标准格式),否则识别失败。

总结

  1. 这段 PHP 代码是 Vosk 语音识别的WebSocket 客户端,核心是 "分片发送 WAV 音频→接收实时识别结果→发送结束标识→接收最终结果";
  2. 关键要点:音频要二进制发送、分片传输、结束时发eof标识,且音频格式必须符合 Vosk 要求;
  3. 依赖条件:安装 WebSocket 库、启动 Vosk WebSocket 服务、确保音频格式正确。

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

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

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

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

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

阿雪技术观

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

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

相关推荐
汽车仪器仪表相关领域11 分钟前
Kvaser Leaf Light HS v2 M12:5 针 M12 NMEA 2000 接口,海事与工业 CAN 总线测试的防水耐用之选
大数据·网络·人工智能·功能测试·安全性测试
xiaoxiang960919 分钟前
Graphify从入门到精通:用知识图谱彻底改变AI编程效率
人工智能·知识图谱·ai编程
CeshirenTester27 分钟前
航旅纵横APP故障18h后,各项功能才恢复正常
人工智能
_冷眸_28 分钟前
Voyago:龙虾(OpenClaw)驱动的一站式旅行规划套件
人工智能·自然语言处理·aigc·agent·claude code
CM莫问30 分钟前
详解机器学习中的马尔可夫链
人工智能·算法·机器学习·概率论·马尔可夫·马尔科夫
人工智能AI技术32 分钟前
编码基础:ASCII、Unicode、UTF-8 区别与原理
人工智能
大龄程序员狗哥37 分钟前
第17篇:词向量(Word2Vec)解析——让文字拥有数学灵魂(原理解析)
人工智能·自然语言处理·word2vec
ElfBoard39 分钟前
飞凌精灵(ElfBoard)技术贴|如何在RK3506开发板上实现UART功能复用
大数据·linux·人工智能·驱动开发·单片机·嵌入式硬件·物联网
慕涯AI1 小时前
Agent 30 课程开发指南 - 第28课
人工智能·python
HackTorjan1 小时前
AI驱动的制品库高效管理:智能分类、自动化追踪与全生命周期优化
linux·人工智能·分类·自动化