本文目录导读:

在PHP项目中实现语音识别,通常有以下几种主流方案:
使用云服务API(推荐方案)
百度语音识别
<?php
require_once 'AipSpeech.php';
// 初始化
$client = new AipSpeech('你的AppId', '你的API Key', '你的Secret Key');
// 读取音频文件
$audio = file_get_contents('./test.pcm');
// 识别
$result = $client->asr($audio, 'pcm', 16000, [
'dev_pid' => 1536, // 普通话(支持简单的英文识别)
]);
if ($result['err_no'] == 0) {
echo "识别结果:" . $result['result'];
} else {
echo "错误:" . $result['err_msg'];
}
?>
阿里云语音识别
<?php
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
// 配置
AlibabaCloud::accessKeyClient('your-access-key', 'your-access-secret')
->regionId('cn-shanghai')
->asDefaultClient();
try {
$result = AlibabaCloud::nlsFiletrans()
->v20180817()
->createTask()
->withTask(json_encode([
'appkey' => 'your-appkey',
'file_link' => 'https://your-file-url/audio.wav',
'version' => '4.0',
'enable_words' => false
]))
->request();
print_r($result->toArray());
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}
?>
使用WebSocket实时识别
<?php
// 使用百度实时语音识别WebSocket
$ws = new WebSocket\Client("wss://ws-api.baidu.com/aip/auth");
$ws->send(json_encode([
'type' => 'START',
'appid' => 'your-appid',
'token' => 'access-token',
'params' => [
'format' => 'pcm',
'rate' => 16000,
'dev_pid' => 1536,
]
]));
// 发送音频数据
$audioData = file_get_contents('audio.pcm');
$ws->send(bin2hex($audioData));
// 结束识别
$ws->send(json_encode(['type' => 'FINISH']));
// 接收结果
while (true) {
$msg = $ws->receive();
$data = json_decode($msg, true);
if ($data['type'] == 'RESULT') {
echo "识别结果:" . $data['result'] . "\n";
}
if ($data['type'] == 'FINISH') {
break;
}
}
?>
使用本地语音识别引擎
PocketSphinx(离线方案)
<?php
// 需要安装pocketsphinx-php扩展
$decoder = new PocketSphinx\Decoder();
$decoder->setConfiguration([
'hmm' => '/path/to/acoustic/model',
'lm' => '/path/to/language/model',
'dict' => '/path/to/dictionary'
]);
$audio = file_get_contents('audio.wav');
$result = $decoder->decode($audio);
echo "识别结果:" . $result;
?>
音频预处理优化
音频格式转换
<?php
function convertAudio($inputFile) {
// 使用FFmpeg转换音频格式
$outputFile = tempnam(sys_get_temp_dir(), 'audio') . '.pcm';
exec("ffmpeg -i {$inputFile} -ar 16000 -ac 1 -f s16le {$outputFile}", $output, $returnCode);
if ($returnCode === 0) {
return file_get_contents($outputFile);
}
return false;
}
?>
完整的语音识别服务类
<?php
class SpeechRecognitionService {
private $provider; // baidu, aliyun, tencent
public function __construct($provider = 'baidu') {
$this->provider = $provider;
}
public function recognize($audioFile, $options = []) {
switch ($this->provider) {
case 'baidu':
return $this->baiduRecognize($audioFile, $options);
case 'aliyun':
return $this->aliyunRecognize($audioFile, $options);
default:
throw new Exception("不支持的识别服务");
}
}
private function baiduRecognize($audioFile, $options) {
// 百度语音识别实现
require_once 'AipSpeech.php';
$client = new AipSpeech(
getenv('BAIDU_APP_ID'),
getenv('BAIDU_API_KEY'),
getenv('BAIDU_SECRET_KEY')
);
// 自动转换音频格式
$audioData = $this->prepareAudio($audioFile, 'pcm');
return $client->asr($audioData, 'pcm', 16000, [
'dev_pid' => $options['dev_pid'] ?? 1536,
]);
}
private function prepareAudio($audioFile, $format) {
$info = pathinfo($audioFile);
if ($info['extension'] !== 'pcm') {
return $this->convertAudio($audioFile);
}
return file_get_contents($audioFile);
}
}
?>
前端+后端完整流程
<!-- 前端HTML -->
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="audio_file" accept="audio/*" capture>
<button type="submit">上传并识别</button>
</form>
<!-- 或使用录音功能 -->
<script>
const recorder = new MediaRecorder(stream);
recorder.ondataavailable = async (event) => {
const formData = new FormData();
formData.append('audio', event.data);
const response = await fetch('recognize.php', {
method: 'POST',
body: formData
});
const result = await response.json();
console.log('识别结果:', result.text);
};
</script>
后端接收处理
// upload.php
<?php
if ($_FILES['audio']['error'] === UPLOAD_ERR_OK) {
$tmpFile = $_FILES['audio']['tmp_name'];
// 调用语音识别
$speechService = new SpeechRecognitionService('baidu');
$result = $speechService->recognize($tmpFile);
// 保存到数据库
$db->query("INSERT INTO speech_recognition SET
text = '{$result['result'][0]}',
created_at = NOW()
");
// 返回结果
echo json_encode([
'success' => true,
'text' => $result['result'][0]
]);
}
?>
注意事项
- 音频格式要求:大部分API需要16kHz采样率、16位量化、单声道PCM/WAV格式
- 文件大小限制:百度最长60秒,阿里云最长120秒
- 网络延迟:实时识别需要WebSocket,建议客户端直接调用云API
- 成本控制:离线方案成本更低,在线方案更准确
- 并发处理:使用队列系统处理大批量音频文件
- 错误处理:添加完善的异常处理和重试机制
选择哪个方案取决于你的具体需求:实时性要求、预算、准确率要求、数据隐私等因素,对于大多数项目,推荐使用云服务API,性价比最高。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播