From 7b9296039c6cac2bf92ada29539a34e5eafb7857 Mon Sep 17 00:00:00 2001 From: yaooo <272523191@qq.com> Date: Wed, 11 Oct 2023 15:04:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0ocr=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/controller/XunFeiController.php | 184 ++++++++++++------------ 1 file changed, 91 insertions(+), 93 deletions(-) diff --git a/app/api/controller/XunFeiController.php b/app/api/controller/XunFeiController.php index 20ba27c53..6c978ef7e 100644 --- a/app/api/controller/XunFeiController.php +++ b/app/api/controller/XunFeiController.php @@ -166,97 +166,89 @@ class XunFeiController extends BaseApiController $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' => $encoding - ) - ); - $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' => $encoding - ) - ); - $client->send(json_encode($frameData)); - break; - case 2: - $frameData = array( - 'data' => array( - 'status' => 2, - 'format' => 'audio/L16;rate=16000', - 'audio' => base64_encode($len), - 'encoding' => $encoding - ) - ); - $client->send(json_encode($frameData)); - break 2; - } - //模拟音频采样间隔 - usleep($intervel); + $frameSize = 1280; //每一帧的音频大小 + $intervel = 20 * 1000; //发送音频间隔 + $status = 0; + while (true) { + $len = fread($audioFile, $frameSize); + if ($len === false) { + break; } - while (true) { - $response = $client->receive(); - if ($response === null) { - break; - } - $resp = json_decode($response, true); - $code = $resp['code']; - if ($code != 0) { - break; - } - $message = $resp['message']; - $data = $resp['data']; - $result = $data['result']; - $status = $data['status']; - foreach($result['ws'] as $v) { - $words .= $v['cw'][0]['w'] ?? ''; - } - if ($status === 2) { - break; - } + if ($len === '') { //文件读取完了 + $status = 2; } - } else { - // 删除临时音频文件 - if (file_exists($file)) { - //unlink($file); + 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' => $encoding + ) + ); + $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' => $encoding + ) + ); + $client->send(json_encode($frameData)); + break; + case 2: + $frameData = array( + 'data' => array( + 'status' => 2, + 'format' => 'audio/L16;rate=16000', + 'audio' => base64_encode($len), + 'encoding' => $encoding + ) + ); + $client->send(json_encode($frameData)); + break 2; + } + //模拟音频采样间隔 + usleep($intervel); + } + while (true) { + $response = $client->receive(); + if ($response === null) { + break; + } + $resp = json_decode($response, true); + $code = $resp['code']; + if ($code != 0) { + break; + } + $message = $resp['message']; + $data = $resp['data']; + $result = $data['result']; + $status = $data['status']; + foreach($result['ws'] as $v) { + $words .= $v['cw'][0]['w'] ?? ''; + } + if ($status === 2) { + break; } - return $this->fail('无法连接到 WebSocket 服务器'); } fclose($audioFile); // 删除临时音频文件 if (file_exists($file)) { - //unlink($file); + unlink($file); } } catch (\Exception $e) { if (file_exists($file)) { @@ -334,6 +326,10 @@ class XunFeiController extends BaseApiController } $ext = pathinfo($file, PATHINFO_EXTENSION); $base64_image = base64_encode(file_get_contents($file)); + if (file_exists($file)) { + // 删除临时文件 + unlink($file); + } $ocr = new OcrClient($this->app_id, $this->api_key, $this->api_secret); $ocrHostUrl = $ocr->assembleAuthUrl($ocrHostUrl); $requestBody = [ @@ -359,7 +355,7 @@ class XunFeiController extends BaseApiController ] ] ]; - $responseData = ''; + $text = []; try { $client = new GzClient(['timeout' => 2]); $response = $client->request('POST', $ocrHostUrl, [ @@ -367,18 +363,20 @@ class XunFeiController extends BaseApiController 'verify' => false ]); $responseData = $response->getBody()->getContents(); - if (file_exists($file)) { - // 删除临时文件 - unlink($file); + $responseArray = json_decode($responseData, true); + if (empty($responseArray['payload']['result']['text'])) { + return $this->fail('json解析错误'); + } + $encodeText = $responseArray['payload']['result']['text']; + $textArray = json_decode(base64_decode($encodeText), true); + $lineArray = $textArray['pages'][0]['lines'] ?? []; + foreach($lineArray as $item) { + $text[] = $item['words'][0]['content'] ?? ''; } } catch (GuzzleException $e) { - if (file_exists($file)) { - // 删除临时文件 - unlink($file); - } return $this->fail($e->getMessage()); } - return $this->data(['words' => (string)$responseData]); + return $this->data(['words' => $text]); } }