在PHP项目中实现语音转文字功能,科大讯飞语音AI是成熟可靠的第三方服务,通过调用其开放接口可以快速完成音频内容识别。开发者只需要按照接口规范完成参数配置和请求发送,就能获取准确的文字识别结果。

前期准备工作
在开始集成之前,需要完成以下基础准备:
- 注册科大讯飞开放平台账号,创建语音转写应用,获取APPID和APIKey
- 确认需要使用的接口类型,本文以通用语音转写接口为例,支持多种音频格式
- 准备待测试的音频文件,建议优先使用16k采样率、单声道、16位深的pcm格式音频
接口核心参数说明
科大讯飞语音转写接口的请求需要包含公共参数和业务参数,核心参数如下:
| 参数名 | 参数说明 | 是否必填 |
|---|---|---|
| app_id | 应用唯一标识,从开放平台获取 | 是 |
| time_stamp | 当前时间戳,单位为秒 | 是 |
| sign | 请求签名,由APIKey和参数拼接后加密生成 | 是 |
| audio_data | 经过base64编码的音频二进制数据 | 是 |
| encoding | 音频编码格式,如pcm、wav、mp3等 | 是 |
签名生成逻辑
签名是接口鉴权的核心,生成规则为:将APIKey、app_id、time_stamp按照固定顺序拼接后,进行MD5加密,生成32位小写字符串。具体实现代码如下:
<?php
/**
* 生成科大讯飞接口请求签名
* @param string $apiKey 开放平台获取的APIKey
* @param string $appId 应用APPID
* @param int $timeStamp 当前时间戳
* @return string 32位小写MD5签名
*/
function generateSign($apiKey, $appId, $timeStamp) {
// 按照接口要求的顺序拼接参数
$signStr = $apiKey . $appId . $timeStamp;
// 生成MD5签名并转为小写
return strtolower(md5($signStr));
}
// 示例调用
$apiKey = 'your_api_key_here';
$appId = 'your_app_id_here';
$timeStamp = time();
$sign = generateSign($apiKey, $appId, $timeStamp);
echo "生成的签名为:" . $sign;
?>
音频文件处理
接口要求音频数据必须经过base64编码,因此需要先读取音频文件内容,再进行编码处理。如果音频格式不符合要求,还需要先进行格式转换,以下是音频处理的代码:
<?php
/**
* 处理音频文件,返回base64编码后的字符串
* @param string $audioPath 音频文件本地路径
* @return string base64编码后的音频数据
* @throws Exception 文件不存在或读取失败时抛出异常
*/
function processAudio($audioPath) {
if (!file_exists($audioPath)) {
throw new Exception("音频文件不存在:{$audioPath}");
}
// 读取音频二进制内容
$audioData = file_get_contents($audioPath);
if ($audioData === false) {
throw new Exception("读取音频文件失败:{$audioPath}");
}
// 进行base64编码
return base64_encode($audioData);
}
// 示例调用
$audioPath = '/data/audio/test.pcm';
try {
$base64Audio = processAudio($audioPath);
echo "音频base64编码完成,长度:" . strlen($base64Audio);
} catch (Exception $e) {
echo "处理失败:" . $e->getMessage();
}
?>
完整接口调用实现
整合上述步骤,完成完整的接口请求发送和结果解析,代码如下:
<?php
// 配置参数
$appId = 'your_app_id_here';
$apiKey = 'your_api_key_here';
$apiUrl = 'https://api.xfyun.cn/v1/aiui/v1/voice_trans'; // 接口地址,实际以开放平台文档为准
$audioPath = '/data/audio/test.pcm';
// 生成时间戳和签名
$timeStamp = time();
$sign = generateSign($apiKey, $appId, $timeStamp);
// 处理音频
try {
$base64Audio = processAudio($audioPath);
} catch (Exception $e) {
die("音频处理失败:" . $e->getMessage());
}
// 构造请求参数
$postData = [
'app_id' => $appId,
'time_stamp' => $timeStamp,
'sign' => $sign,
'audio_data' => $base64Audio,
'encoding' => 'pcm', // 音频格式,根据实际文件调整
'rate' => 16000, // 采样率
'channel' => 1 // 声道数,1为单声道
];
// 初始化curl请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// 如果是https接口,跳过证书验证(生产环境建议配置正确证书)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 发送请求并获取响应
$response = curl_exec($ch);
if (curl_errno($ch)) {
die("请求失败:" . curl_error($ch));
}
curl_close($ch);
// 解析响应结果
$result = json_decode($response, true);
if ($result['code'] == 0) {
echo "语音转文字成功,识别结果:" . $result['data']['result'];
} else {
echo "识别失败,错误码:" . $result['code'] . ",错误信息:" . $result['message'];
}
?>
常见问题处理
在实际集成过程中,可能会遇到以下问题:
- 签名错误:检查APIKey和APPID是否正确,拼接顺序是否符合接口要求,时间戳是否为当前有效时间
- 音频格式不支持:确认
encoding参数和实际音频格式一致,采样率等参数匹配接口要求 - 请求超时:检查网络连通性,适当调大curl超时时间,大音频文件建议分片上传
注意:实际接口地址、参数名称、返回格式请以科大讯飞开放平台最新官方文档为准,本文示例代码仅作为实现逻辑参考。