在php项目中实现用户语音转文字指令的功能,可通过调用小米AI语音识别接口完成,整个过程需要按照接口规范处理请求参数和响应结果。首先开发者需要前往小米开放平台申请语音识别相关的应用权限,获取对应的AppKey和AppSecret,这是后续接口调用的必要凭证。

前期准备工作
调用接口前需要完成以下基础准备:
- 注册小米开放平台账号,创建语音识别应用,获取
AppKey和AppSecret - 准备待识别的语音文件,要求格式为wav或者pcm,采样率16kHz,单声道,16位编码
- 确保php环境开启了curl扩展,用于发送HTTP请求
接口调用核心步骤
1. 生成接口请求签名
小米AI语音识别接口要求请求携带签名参数,签名生成规则是将AppSecret、时间戳、随机字符串等参数按照指定顺序拼接后做MD5加密,具体实现代码如下:
<?php
/**
* 生成小米AI语音识别接口请求签名
* @param string $appSecret 应用密钥
* @param int $timestamp 当前时间戳
* @param string $nonce 随机字符串
* @return string 签名结果
*/
function generateSign($appSecret, $timestamp, $nonce) {
$params = [
'app_secret' => $appSecret,
'timestamp' => $timestamp,
'nonce' => $nonce
];
// 按参数名升序排序
ksort($params);
$str = '';
foreach ($params as $key => $val) {
$str .= $key . '=' . $val . '&';
}
$str = rtrim($str, '&');
// MD5加密后转小写
return strtolower(md5($str));
}
// 示例调用
$appSecret = 'your_app_secret';
$timestamp = time();
$nonce = substr(md5(uniqid()), 0, 16);
$sign = generateSign($appSecret, $timestamp, $nonce);
echo "生成的签名为:" . $sign;
?>
2. 构造语音识别请求
准备好签名后,需要将语音文件读取为二进制数据,和必要参数一起构造POST请求发送到小米语音识别接口,完整请求代码如下:
<?php
/**
* 调用小米AI语音识别接口
* @param string $appKey 应用Key
* @param string $appSecret 应用密钥
* @param string $voiceFilePath 语音文件路径
* @return string 识别结果
*/
function xiaomiVoiceToText($appKey, $appSecret, $voiceFilePath) {
// 接口地址,实际以小米开放平台最新文档为准
$apiUrl = 'https://api.xiaomi.com/ai/v1/speech/recognize';
// 检查语音文件是否存在
if (!file_exists($voiceFilePath)) {
return '语音文件不存在';
}
// 读取语音二进制数据
$voiceData = file_get_contents($voiceFilePath);
if (empty($voiceData)) {
return '语音文件读取失败';
}
// 构造请求参数
$timestamp = time();
$nonce = substr(md5(uniqid()), 0, 16);
$sign = generateSign($appSecret, $timestamp, $nonce);
$postData = [
'app_key' => $appKey,
'timestamp' => $timestamp,
'nonce' => $nonce,
'sign' => $sign,
'voice_data' => base64_encode($voiceData),
'format' => 'wav',
'rate' => 16000,
'channel' => 1
];
// 初始化curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8'
]);
// 跳过SSL证书验证,生产环境建议配置正确证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if (!empty($error)) {
return '请求失败:' . $error;
}
// 解析响应结果
$result = json_decode($response, true);
if ($result['code'] == 0) {
return '识别成功,文字内容:' . $result['data']['text'];
} else {
return '识别失败,错误码:' . $result['code'] . ',错误信息:' . $result['message'];
}
}
// 调用示例
$appKey = 'your_app_key';
$appSecret = 'your_app_secret';
$voiceFile = '/path/to/your/voice.wav';
$res = xiaomiVoiceToText($appKey, $appSecret, $voiceFile);
echo $res;
?>
3. 结果处理与指令解析
接口返回的文字内容可以直接作为用户的语音指令使用,如果需要处理特定指令,可以对返回的文字做关键词匹配,例如:
<?php
$text = '打开客厅的灯';
// 指令关键词匹配
if (strpos($text, '打开') !== false && strpos($text, '灯') !== false) {
echo '执行打开灯光指令';
} elseif (strpos($text, '关闭') !== false && strpos($text, '灯') !== false) {
echo '执行关闭灯光指令';
} else {
echo '未匹配到对应指令';
}
?>
常见问题排查
- 签名错误:检查参数拼接顺序、MD5加密逻辑是否正确,时间戳是否在有效范围内
- 识别失败:确认语音文件格式、采样率、编码是否符合接口要求,语音内容是否清晰
- 请求超时:检查网络连接,适当增加curl超时时间配置
注意:实际接口地址、参数要求以小米开放平台官方最新文档为准,本文示例代码仅作为实现逻辑参考,生产环境需要做好参数校验和异常处理。