本文目录导读:

在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,性价比最高。