如何使用PHP与Curl将Voicerss API返回的音频保存为文件
解决VoiceRSS TTS API音频数据保存与浏览器兼容问题
问题分析
你遇到的Chrome显示乱码问题,本质是直接输出二进制音频数据时未指定正确的响应头,浏览器无法识别这是MP3文件,所以把二进制流当成文本解析了;而Firefox可能自动识别了音频类型,所以能正常播放。
保存音频到本地文件的解决方案
修改你的代码,在获取到API返回的二进制音频数据后,用file_put_contents()将数据写入本地文件即可。需要注意目标目录要有写入权限,示例代码如下:
$src = $_GET['src']; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://voicerss-text-to-speech.p.rapidapi.com/?key=MYAPIKEY&src=$src&hl=en-us&r=0&c=mp3&f=8khz_8bit_mono", CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "X-RapidAPI-Host: voicerss-text-to-speech.p.rapidapi.com", "X-RapidAPI-Key: MYAPIKEY" ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { // 定义保存路径,确保该目录存在且PHP有写入权限 $savePath = './audio/' . uniqid() . '.mp3'; // 自动创建上级目录(如果不存在) if (!is_dir(dirname($savePath))) { mkdir(dirname($savePath), 0755, true); } // 写入音频文件 if (file_put_contents($savePath, $response)) { echo "音频已保存到:$savePath"; // 也可以输出文件访问链接供下载 // echo "<a href='$savePath'>点击下载音频</a>"; } else { echo "保存音频文件失败,请检查目录权限"; } }
额外:修复浏览器直接播放的兼容问题
如果需要直接在浏览器播放而不保存文件,只需在echo $response前添加正确的响应头,告诉浏览器这是MP3音频:
// 添加响应头指定内容类型 header('Content-Type: audio/mpeg'); echo $response;
这样Chrome就能正确识别音频数据,不会显示乱码。
内容的提问来源于stack exchange,提问作者David Jeffery
相关产品推荐
相关产品推荐

