核心代码

完整客户端代码
<?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 客户端,核心作用是:
- 读取本地的
test.wav音频文件(语音文件); - 通过 WebSocket 协议,把音频数据分片发送到本地运行的 Vosk WebSocket 服务端(端口 2700);
- 接收 Vosk 服务端返回的实时语音识别结果;
- 音频发送完成后,告知服务端 "传输结束",并接收最终的识别结果。
简单说:你把本地的语音文件 "拆成小块" 传给 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 服务模式:
- 服务端 :你需要先启动 Vosk 的 WebSocket 服务(监听localhost:2700),这个服务负责处理音频、做语音识别;
- 客户端(这段代码):作为 "数据传输器",把本地的 WAV 音频文件分片传给 Vosk 服务端,同时接收识别结果。
关键细节(新手必看)
- 为什么要 "分片发送"?WAV 文件可能很大,一次性发送会占满网络 / 内存,分片(每次 8000 字节)是更稳定的方式,也符合 Vosk 流式识别的设计(边传边识别)。
- 为什么指定
'binary'?音频数据是二进制格式(不是文字),如果不指定,WebSocket 会把它当文本处理,导致数据错乱,Vosk 无法识别。 {"eof" : 1}的作用?告诉 Vosk 服务端 "音频已经传完了",服务端收到后会返回最终的完整识别结果,而不是实时的中间结果。
四、使用前提(新手要注意)
- 必须先安装依赖:这段代码用了 PHP 的 WebSocket 客户端库,需要通过
composer安装(执行composer require textalk/websocket); - Vosk 服务端必须启动:要先运行 Vosk 的 WebSocket 服务(比如
python vosk_server_websocket.py),且端口是 2700; - 音频文件格式正确:
test.wav必须是16kHz 采样率、单声道、16 位 PCM 编码(Vosk 的标准格式),否则识别失败。
总结
- 这段 PHP 代码是 Vosk 语音识别的WebSocket 客户端,核心是 "分片发送 WAV 音频→接收实时识别结果→发送结束标识→接收最终结果";
- 关键要点:音频要二进制发送、分片传输、结束时发
eof标识,且音频格式必须符合 Vosk 要求; - 依赖条件:安装 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