diff --git a/app/api/controller/XunFeiController.php b/app/api/controller/XunFeiController.php index 8c7edbe33..09086408d 100644 --- a/app/api/controller/XunFeiController.php +++ b/app/api/controller/XunFeiController.php @@ -139,103 +139,120 @@ class XunFeiController extends BaseApiController if (!file_exists($file)) { return $this->fail('未上传音频文件'); } + $filesize = filesize($file); + if ($filesize > 1 * 1024 * 1024) { + return $this->fail('录音文件太长'); + } + $ext = pathinfo($file, PATHINFO_EXTENSION); + if ($ext != 'mp3') { + return $this->fail('录音格式错误'); + } // $file = "https://lihai001.oss-cn-chengdu.aliyuncs.com/media/iat_mp3_16k.mp3"; $audioFile = fopen($file, 'rb'); if ($audioFile === false) { return $this->fail('音频文件异常'); } - $words = ''; - $iatHostUrl = "wss://iat-api.xfyun.cn/v2/iat"; - $iat = new IatClient($this->app_id, $this->api_key, $this->api_secret); - $client = new Client($iat->assembleAuthUrl($iatHostUrl)); - if ($client) { - $frameSize = 1280; //每一帧的音频大小 - $intervel = 20 * 1000; //发送音频间隔 - $status = 0; - while (true) { - $len = fread($audioFile, $frameSize); - if ($len === false) { - break; - } - if ($len === '') { //文件读取完了 - $status = 2; - } - switch ($status) { - case 0: //发送第一帧音频,带business 参数 - $frameData = array( - 'common' => array( - 'app_id' => $this->app_id //appid 必须带上,只需第一帧发送 - ), - 'business' => array( //business 参数,只需一帧发送 - 'language' => 'zh_cn', - 'domain' => 'iat', - 'accent' => 'mandarin' - ), - 'data' => array( - 'status' => 0, - 'format' => 'audio/L16;rate=16000', - 'audio' => base64_encode($len), - 'encoding' => 'lame' - ) - ); - $client->send(json_encode($frameData)); - $status = 1; + + try { + $words = ''; + $iatHostUrl = "wss://iat-api.xfyun.cn/v2/iat"; + $iat = new IatClient($this->app_id, $this->api_key, $this->api_secret); + $client = new Client($iat->assembleAuthUrl($iatHostUrl)); + if ($client) { + $frameSize = 1280; //每一帧的音频大小 + $intervel = 40 * 1000; //发送音频间隔 + $status = 0; + while (true) { + $len = fread($audioFile, $frameSize); + if ($len === false) { break; - case 1: - $frameData = array( - 'data' => array( - 'status' => 1, - 'format' => 'audio/L16;rate=16000', - 'audio' => base64_encode($len), - 'encoding' => 'raw' - ) - ); - $client->send(json_encode($frameData)); + } + if ($len === '') { //文件读取完了 + $status = 2; + } + switch ($status) { + case 0: //发送第一帧音频,带business 参数 + $frameData = array( + 'common' => array( + 'app_id' => $this->app_id //appid 必须带上,只需第一帧发送 + ), + 'business' => array( //business 参数,只需一帧发送 + 'language' => 'zh_cn', + 'domain' => 'iat', + 'accent' => 'mandarin' + ), + 'data' => array( + 'status' => 0, + 'format' => 'audio/L16;rate=16000', + 'audio' => base64_encode($len), + 'encoding' => 'lame' + ) + ); + $client->send(json_encode($frameData)); + $status = 1; + break; + case 1: + $frameData = array( + 'data' => array( + 'status' => 1, + 'format' => 'audio/L16;rate=16000', + 'audio' => base64_encode($len), + 'encoding' => 'raw' + ) + ); + $client->send(json_encode($frameData)); + break; + case 2: + $frameData = array( + 'data' => array( + 'status' => 2, + 'format' => 'audio/L16;rate=16000', + 'audio' => base64_encode($len), + 'encoding' => 'raw' + ) + ); + $client->send(json_encode($frameData)); + break 2; + } + //模拟音频采样间隔 + usleep($intervel); + } + while (true) { + $response = $client->receive(); + if ($response === null) { break; - case 2: - $frameData = array( - 'data' => array( - 'status' => 2, - 'format' => 'audio/L16;rate=16000', - 'audio' => base64_encode($len), - 'encoding' => 'raw' - ) - ); - $client->send(json_encode($frameData)); - break 2; + } + $resp = json_decode($response,true); + $code = $resp['code']; + $message = $resp['message']; + $data = $resp['data']; + $result = $data['result']; + $status = $data['status']; + foreach($result['ws'] as $v) { + $words .= $v['cw'][0]['w'] ?? ''; + } + if ($code != 0 || $status === 2) { + break; + } } - //模拟音频采样间隔 - usleep($intervel); + } else { + // 删除临时音频文件 + if (file_exists($file)) { + //unlink($file); + } + return $this->fail('无法连接到 WebSocket 服务器'); } - while (true) { - $response = $client->receive(); - if ($response === null) { - break; - } - $resp = json_decode($response,true); - $code = $resp['code']; - $message = $resp['message']; - $data = $resp['data']; - $result = $data['result']; - $status = $data['status']; - foreach($result['ws'] as $v) { - $words .= $v['cw'][0]['w'] ?? ''; - } - if ($code != 0 || $status === 2) { - break; - } - } - } else { + fclose($audioFile); // 删除临时音频文件 if (file_exists($file)) { //unlink($file); } - return $this->fail('无法连接到 WebSocket 服务器'); - } - fclose($audioFile); - // 删除临时音频文件 - if (file_exists($file)) { - //unlink($file); + } catch (\Exception $e) { + if (file_exists($file)) { + // 删除临时文件 + unlink($file); + } + return $this->fail($e->getMessage()); } return $this->data(['words' => $words]); }