PHP? AI ??? ?? ?? PHP ?? ?? ?? ??? ??? ?????.
Jul 25, 2025 pm 08:45 PM用戶語音輸入通過前端JavaScript的MediaRecorder API捕獲并發(fā)送至PHP后端;2. PHP將音頻保存為臨時(shí)文件后調(diào)用STT API(如Google或百度語音識(shí)別)轉(zhuǎn)換為文本;3. PHP將文本發(fā)送至AI服務(wù)(如OpenAI GPT)獲取智能回復(fù);4. PHP再調(diào)用TTS API(如百度或Google語音合成)將回復(fù)轉(zhuǎn)為語音文件;5. PHP將語音文件流式返回前端播放,完成交互。整個(gè)流程由PHP主導(dǎo)數(shù)據(jù)流轉(zhuǎn)與錯(cuò)誤處理,確保各環(huán)節(jié)無縫銜接。
搭建一個(gè)PHP驅(qū)動(dòng)的AI語音交互系統(tǒng),核心在于PHP作為后端樞紐,將前端捕獲的用戶語音輸入,通過API橋接到外部的AI語音識(shí)別(Speech-to-Text, STT)服務(wù),將識(shí)別出的文本送給AI智能處理(如大語言模型或NLU服務(wù)),再將AI生成的文本響應(yīng)通過API發(fā)送給AI語音合成(Text-to-Speech, TTS)服務(wù),最終將合成的語音傳回前端播放給用戶。這整個(gè)流程,PHP負(fù)責(zé)的是數(shù)據(jù)流轉(zhuǎn)、API調(diào)用、以及必要的文件管理和錯(cuò)誤處理。

解決方案
要構(gòu)建這樣一個(gè)系統(tǒng),你得把目光投向幾個(gè)關(guān)鍵環(huán)節(jié)。首先,前端是用戶交互的入口,它需要能錄音,然后把音頻數(shù)據(jù)傳給PHP。這通常通過JavaScript的Web Audio API或MediaRecorder API實(shí)現(xiàn),將錄制的音頻數(shù)據(jù)(比如Blob對(duì)象)通過Ajax發(fā)送到后端。
PHP收到音頻數(shù)據(jù)后,這才是它真正發(fā)力的地方。它需要:

- 處理音頻文件: 將前端傳來的音頻數(shù)據(jù)保存為臨時(shí)文件,或者直接以流的形式處理。考慮到各種AI語音服務(wù)的API要求,通常會(huì)是MP3、WAV等格式。
- 調(diào)用語音識(shí)別(STT)API: 這是將聲音轉(zhuǎn)成文字的關(guān)鍵一步。你會(huì)選擇一個(gè)AI服務(wù)商(比如Google Cloud Speech-to-Text、百度智能語音、科大訊飛或者OpenAI的Whisper API),用PHP的HTTP客戶端(如Guzzle或原生的cURL)將音頻文件或其編碼數(shù)據(jù)發(fā)送過去,等待識(shí)別結(jié)果。
- 調(diào)用AI智能處理API: 拿到識(shí)別出的文本后,下一步就是讓AI理解并給出響應(yīng)。這可能是調(diào)用一個(gè)大語言模型(如OpenAI的GPT系列),或者一個(gè)專業(yè)的自然語言理解(NLU)服務(wù)。PHP會(huì)把用戶的話作為Prompt發(fā)送過去,獲取AI的文字回復(fù)。
- 調(diào)用語音合成(TTS)API: AI給出的文字回復(fù)不能直接播放,需要轉(zhuǎn)換成語音。PHP再次出馬,將AI的文字回復(fù)發(fā)送給TTS服務(wù)(比如Google Cloud Text-to-Speech、百度智能語音合成等),請(qǐng)求合成語音文件。
- 返回語音數(shù)據(jù): TTS服務(wù)會(huì)返回合成好的語音文件(通常是MP3或WAV)。PHP需要將這個(gè)語音文件流式傳輸回前端,或者保存到服務(wù)器再提供下載鏈接,讓前端播放。
整個(gè)過程涉及多個(gè)API調(diào)用,所以錯(cuò)誤處理、網(wǎng)絡(luò)延遲、API密鑰管理都是PHP需要細(xì)致考慮的環(huán)節(jié)。
用戶語音輸入如何高效轉(zhuǎn)換為文本?
將用戶的語音輸入高效地轉(zhuǎn)換為文本,這其實(shí)是整個(gè)語音交互鏈條的起點(diǎn),也是用戶體驗(yàn)最直觀的感知。我個(gè)人覺得,這里的“高效”不僅僅是速度快,還得準(zhǔn)確,并且能處理各種復(fù)雜的語音環(huán)境。

從技術(shù)實(shí)現(xiàn)角度看,前端的音頻捕獲是第一步?,F(xiàn)代瀏覽器提供了強(qiáng)大的Web Audio API和MediaRecorder API,它們能讓你直接在瀏覽器里錄音,并將錄音數(shù)據(jù)封裝成Blob對(duì)象。這個(gè)Blob對(duì)象可以通過FormData或者Base64編碼的形式,通過Ajax請(qǐng)求發(fā)送到你的PHP后端。
PHP收到這些音頻數(shù)據(jù)后,通常會(huì)將其寫入一個(gè)臨時(shí)文件。這一步看似簡(jiǎn)單,但實(shí)際操作中可能會(huì)遇到文件權(quán)限、存儲(chǔ)空間、以及不同瀏覽器錄音格式兼容性問題。例如,有些瀏覽器默認(rèn)錄制WebM格式,而某些STT服務(wù)可能更偏愛WAV或MP3,這就需要在前端進(jìn)行格式轉(zhuǎn)換,或者PHP后端使用FFmpeg這樣的工具進(jìn)行轉(zhuǎn)碼,雖然FFmpeg在PHP中調(diào)用會(huì)增加復(fù)雜度,但它確實(shí)能解決很多格式兼容性問題。
接下來就是調(diào)用STT服務(wù)了。市面上有很多成熟的AI語音識(shí)別服務(wù),像Google Cloud Speech-to-Text,它的識(shí)別準(zhǔn)確率非常高,尤其是對(duì)多語言和嘈雜環(huán)境的處理。國內(nèi)的百度智能語音、科大訊飛等也做得不錯(cuò),針對(duì)中文語境有很好的優(yōu)化。OpenAI最近的Whisper模型也提供了API,其多語言和魯棒性表現(xiàn)非常驚艷。
PHP通過HTTP客戶端(例如Guzzle)向這些STT服務(wù)的API接口發(fā)送POST請(qǐng)求,請(qǐng)求體中包含音頻數(shù)據(jù)。API通常會(huì)返回一個(gè)JSON格式的響應(yīng),里面就包含了識(shí)別出的文本。這里需要注意API的認(rèn)證方式,大部分都采用API Key或者OAuth token。
<?php // 假設(shè)你使用了Guzzle HTTP客戶端 require 'vendor/autoload.php'; use GuzzleHttp\Client; function transcribeAudio(string $audioFilePath): ?string { $client = new Client(); $apiKey = 'YOUR_GOOGLE_CLOUD_SPEECH_API_KEY'; // 或者其他服務(wù)商的API Key try { // 示例:調(diào)用Google Cloud Speech-to-Text API // 實(shí)際應(yīng)用中,你可能需要根據(jù)API文檔調(diào)整請(qǐng)求體和認(rèn)證方式 $response = $client->post("https://speech.googleapis.com/v1/speech:recognize?key={$apiKey}", [ 'json' => [ 'config' => [ 'encoding' => 'LINEAR16', // 或 'WEBM_OPUS', 'MP3'等,取決于你的音頻格式 'sampleRateHertz' => 16000, // 音頻采樣率 'languageCode' => 'zh-CN', // 識(shí)別語言 ], 'audio' => [ 'content' => base64_encode(file_get_contents($audioFilePath)), ], ], ]); $result = json_decode($response->getBody()->getContents(), true); if (isset($result['results'][0]['alternatives'][0]['transcript'])) { return $result['results'][0]['alternatives'][0]['transcript']; } return null; } catch (\GuzzleHttp\Exception\RequestException $e) { // 捕獲網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤 error_log("STT API request failed: " . $e->getMessage()); if ($e->hasResponse()) { error_log("STT API error response: " . $e->getResponse()->getBody()->getContents()); } return null; } catch (\Exception $e) { // 捕獲其他異常 error_log("An error occurred during transcription: " . $e->getMessage()); return null; } } // 示例調(diào)用 // $transcribedText = transcribeAudio('/tmp/user_audio.wav'); // if ($transcribedText) { // echo "識(shí)別結(jié)果: " . $transcribedText; // } else { // echo "語音識(shí)別失敗。"; // }
這里有個(gè)小細(xì)節(jié),為了降低延遲,有些STT服務(wù)也支持流式識(shí)別,這意味著你可以邊錄音邊發(fā)送數(shù)據(jù),而不是等整個(gè)錄音結(jié)束后再發(fā)送。但PHP在處理HTTP長連接和流式數(shù)據(jù)方面,相比Node.js或Python,天生就沒那么順手,所以通常還是采用一次性上傳的方式。
PHP如何與主流AI智能服務(wù)進(jìn)行數(shù)據(jù)交互?
PHP與主流AI智能服務(wù)進(jìn)行數(shù)據(jù)交互,說白了就是調(diào)用它們的API接口。這就像你給一個(gè)遠(yuǎn)程的智能大腦發(fā)指令,然后它處理完再給你回話。這個(gè)過程,絕大部分是通過HTTP/HTTPS請(qǐng)求來完成的,數(shù)據(jù)格式普遍是JSON。
我用PHP做過不少這種集成,無論是調(diào)用OpenAI的GPT系列模型,還是Google的Dialogflow,甚至是一些企業(yè)內(nèi)部的NLU服務(wù),核心邏輯都差不多:構(gòu)建請(qǐng)求體、發(fā)送請(qǐng)求、解析響應(yīng)。
構(gòu)建請(qǐng)求體: AI服務(wù)通常需要你以特定的JSON結(jié)構(gòu)發(fā)送數(shù)據(jù)。比如,給GPT-4發(fā)送消息,你可能需要一個(gè)包含model
、messages
(一個(gè)數(shù)組,包含role
和content
)等字段的JSON對(duì)象。PHP的json_encode()
函數(shù)就是你的好幫手,它能把PHP數(shù)組或?qū)ο筠D(zhuǎn)換成JSON字符串。
發(fā)送請(qǐng)求: 這是PHP與外部服務(wù)通信的核心。Guzzle HTTP客戶端是PHP社區(qū)里非常流行且強(qiáng)大的工具,它封裝了底層的cURL操作,讓發(fā)送HTTP請(qǐng)求變得非常簡(jiǎn)單。你只需要指定請(qǐng)求的URL、方法(通常是POST)、請(qǐng)求頭(例如Content-Type: application/json
和Authorization: Bearer YOUR_API_KEY
),以及請(qǐng)求體。
<?php // 假設(shè)你已經(jīng)通過Composer安裝了Guzzle require 'vendor/autoload.php'; use GuzzleHttp\Client; function callOpenAIChat(string $prompt): ?string { $client = new Client([ 'base_uri' => 'https://api.openai.com/v1/', 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . getenv('OPENAI_API_KEY'), // 建議從環(huán)境變量獲取API Key ], ]); try { $response = $client->post('chat/completions', [ 'json' => [ 'model' => 'gpt-3.5-turbo', // 或 'gpt-4' 'messages' => [ ['role' => 'user', 'content' => $prompt] ], 'temperature' => 0.7, // 控制AI回復(fù)的創(chuàng)造性 'max_tokens' => 150, // 限制回復(fù)長度 ], ]); $result = json_decode($response->getBody()->getContents(), true); if (isset($result['choices'][0]['message']['content'])) { return $result['choices'][0]['message']['content']; } return null; } catch (\GuzzleHttp\Exception\RequestException $e) { error_log("OpenAI API request failed: " . $e->getMessage()); if ($e->hasResponse()) { error_log("OpenAI API error response: " . $e->getResponse()->getBody()->getContents()); } return null; } catch (\Exception $e) { error_log("An error occurred during AI processing: " . $e->getMessage()); return null; } } // 示例調(diào)用 // $aiResponseText = callOpenAIChat("你好,請(qǐng)問今天天氣怎么樣?"); // if ($aiResponseText) { // echo "AI回復(fù): " . $aiResponseText; // } else { // echo "AI處理失敗。"; // }
解析響應(yīng): AI服務(wù)返回的響應(yīng)也是JSON格式的。PHP的json_decode()
函數(shù)可以將JSON字符串轉(zhuǎn)換回PHP數(shù)組或?qū)ο?,這樣你就可以方便地提取AI生成的文本內(nèi)容了。
在這個(gè)過程中,我遇到過一些坑。比如API限速,特別是免費(fèi)或低配額的API,很容易就達(dá)到調(diào)用上限,這時(shí)候你需要實(shí)現(xiàn)一些重試機(jī)制或者隊(duì)列來平滑請(qǐng)求。還有就是錯(cuò)誤處理,API返回的錯(cuò)誤碼和錯(cuò)誤信息多種多樣,你需要仔細(xì)閱讀API文檔,并編寫健壯的代碼來處理各種異常情況,比如認(rèn)證失敗、參數(shù)錯(cuò)誤、服務(wù)不可用等等。保持API密鑰的安全性也至關(guān)重要,絕不能直接硬編碼在代碼里,而是應(yīng)該通過環(huán)境變量或安全的配置管理系統(tǒng)來獲取。
從AI響應(yīng)到用戶可聽的語音輸出,PHP扮演什么角色?
當(dāng)AI智能服務(wù)處理完用戶的問題,并返回了文本形式的答案,下一步就是把這個(gè)文本轉(zhuǎn)換成用戶可以聽懂的語音。這個(gè)環(huán)節(jié)叫做文本轉(zhuǎn)語音(Text-to-Speech, TTS),PHP在這里的角色,仍然是那個(gè)勤勞的“搬運(yùn)工”和“協(xié)調(diào)員”。
選擇TTS服務(wù): 就像STT服務(wù)一樣,TTS也有很多選擇。Google Cloud Text-to-Speech、百度智能語音合成、微軟Azure TTS、Amazon Polly,甚至OpenAI也推出了自己的TTS API。這些服務(wù)各有特色,比如音色、語速、情感表達(dá)等。選擇哪個(gè),往往取決于你的需求和預(yù)算。
PHP調(diào)用TTS API: 流程和前面調(diào)用STT或NLU服務(wù)類似。PHP會(huì)接收到AI生成的文本響應(yīng),然后將其作為請(qǐng)求參數(shù),通過HTTP客戶端(Guzzle)發(fā)送給選定的TTS服務(wù)API。請(qǐng)求中通常會(huì)包含文本內(nèi)容、語言、音色(Voice ID)、語速、音調(diào)等參數(shù)。
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; function textToSpeech(string $text, string $outputFilePath): bool { $client = new Client(); $apiKey = 'YOUR_BAIDU_AI_TTS_API_KEY'; // 假設(shè)使用百度智能語音合成 $apiSecret = 'YOUR_BAIDU_AI_TTS_SECRET_KEY'; // 獲取access_token,百度AI服務(wù)通常需要先獲取token $accessToken = getBaiduAccessToken($apiKey, $apiSecret); if (!$accessToken) { error_log("Failed to get Baidu AI access token."); return false; } try { $response = $client->post("https://tsn.baidu.com/text2audio?tex=" . urlencode($text) . "&lan=zh&cuid=your_device_id&ctp=1&tok=" . $accessToken, [ 'headers' => [ 'Content-Type' => 'audio/mp3', // 百度TTS返回MP3 'Accept' => 'audio/mp3', ], 'sink' => $outputFilePath, // 直接將響應(yīng)流寫入文件 ]); // 檢查響應(yīng)狀態(tài)碼,確保成功 return $response->getStatusCode() === 200; } catch (\GuzzleHttp\Exception\RequestException $e) { error_log("TTS API request failed: " . $e->getMessage()); if ($e->hasResponse()) { error_log("TTS API error response: " . $e->getResponse()->getBody()->getContents()); } return false; } catch (\Exception $e) { error_log("An error occurred during text-to-speech conversion: " . $e->getMessage()); return false; } } // 輔助函數(shù):獲取百度AI的access_token function getBaiduAccessToken(string $apiKey, string $apiSecret): ?string { $client = new Client(); try { $response = $client->post("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={$apiKey}&client_secret={$apiSecret}"); $result = json_decode($response->getBody()->getContents(), true); return $result['access_token'] ?? null; } catch (\Exception $e) { error_log("Failed to get Baidu access token: " . $e->getMessage()); return null; } } // 示例調(diào)用 // $aiResponseText = "您好,很高興為您服務(wù)。"; // $outputAudioFile = '/tmp/ai_response.mp3'; // if (textToSpeech($aiResponseText, $outputAudioFile)) { // echo "語音合成成功,文件保存至: " . $outputAudioFile; // // 在這里可以將文件路徑返回給前端,或者直接將文件內(nèi)容流式傳輸給前端 // } else { // echo "語音合成失敗。"; // }
請(qǐng)注意,不同TTS服務(wù)的API調(diào)用方式差異較大,上面的百度TTS示例僅為演示概念,實(shí)際使用需查閱對(duì)應(yīng)服務(wù)商的最新API文檔。
處理TTS響應(yīng): TTS服務(wù)通常會(huì)直接返回二進(jìn)制的音頻數(shù)據(jù)流(如MP3或WAV格式)。PHP需要將這些數(shù)據(jù)接收下來。你可以選擇將其保存為服務(wù)器上的一個(gè)臨時(shí)文件,然后將這個(gè)文件的URL返回給前端,讓前端的HTML5 <audio>
標(biāo)簽去播放。
或者,如果你想追求更低的延遲和更流暢的用戶體驗(yàn),PHP可以直接將接收到的音頻數(shù)據(jù)流式傳輸回前端。這意味著PHP收到TTS服務(wù)的音頻數(shù)據(jù)后,不先保存,而是立即通過HTTP響應(yīng)頭設(shè)置Content-Type: audio/mp3
(或?qū)?yīng)格式),然后將音頻數(shù)據(jù)直接輸出到客戶端。前端的JavaScript拿到這個(gè)響應(yīng)后,就可以實(shí)時(shí)播放。這種方式對(duì)服務(wù)器的內(nèi)存和磁盤IO壓力較小,但對(duì)網(wǎng)絡(luò)帶寬和前端播放器的處理能力有一定要求。
我個(gè)人在實(shí)踐中,如果響應(yīng)語音較短,且對(duì)實(shí)時(shí)性要求高,會(huì)傾向于流式傳輸;如果語音較長,或者需要進(jìn)行緩存管理,那么保存為臨時(shí)文件再提供URL的方式會(huì)更穩(wěn)妥一些。同時(shí),別忘了對(duì)生成的語音文件進(jìn)行清理,避免服務(wù)器被大量臨時(shí)文件占滿。這通常通過定時(shí)任務(wù)(Cron Job)來清理過期文件。
整個(gè)系統(tǒng)搭建下來,你會(huì)發(fā)現(xiàn)PHP雖然不是處理音頻流和AI模型訓(xùn)練的專家,但它在調(diào)度、協(xié)調(diào)和粘合這些外部服務(wù)方面,做得非常出色。它就像一個(gè)高效的指揮官,確保每一環(huán)都能準(zhǔn)確無誤地銜接起來,最終為用戶呈現(xiàn)一個(gè)完整的語音交互體驗(yàn)。
? ??? PHP? AI ??? ?? ?? PHP ?? ?? ?? ??? ??? ?????.? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

readOnlyPropertiesInphp8.2CanonlyBeassignedOnedOneDonceIntheConstructorAratDeclarationandCannotBemodififificificificifified

2025 ?? Stablecoin ??? ???? ? ?? ??? ??? ??? ????. 1. Binance, ???? ??? ? ??? ?? ?, ?? ??? ??? ?? ???? ? ??; 2. OUYI, ??? ?????? ??? ?? ??? ?? OUYI? Web3 ?? ? Defi? ? ?? ??? ?????. 3. CoinmarketCap, ?? ??? ??? StableCoin ??? ?? ?? ??? ??? ? ? ????. 4. ??? ? ??? ??? ?? Coingecko? ?? ?? ? ???? ?? ??? ???? ?? ??? ??? ????. 5. ?? ?? ??? ??? ???? ?? ??? ??? ? ????? Huobi (HTX); 6. Gate.io, ??? ??? ?? ??? ?? ?? ?????, ????? ???? ?????? ? ?? ?????. 7. TRA

BINANCE : ??, ??? ? ??, ??? ? ????? ? ??? ?? ??; 2. OKX : ??? ??, ???? ?? ? ??? ?? ??; 3. Gate.io : ??? ??, ???? ???, ??? ?? ?? ????; 4. Huobi : ?? ???, ?? ??? ? ??? ?? ??; 5. Kucoin : ???? ?? ??? ?????? ??? ?? ??? ????. 6. ??? : ?? ?? ??, ?? ??? ??? ?? ??? ?????. 7. Bitfinex : ?? ???, ??? API ? ??? ??? ?????. 8. ?? ??? : ??? ?? ??, ??? ????? ? ??? ??? ?? ?? ??.
![[2025 ??] ?? ?? ??? ?? ? ??,? 5? ?? ???? ????!](https://img.php.cn/upload/article/000/000/083/6888925c6d544409.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
2025 ?? ?? ???? Bitcoin Market ? 5 ?? ??? ????. 1. Binance? ?? ??? ?? ??? ?? ???? ?? ?? ?????? ?? ????? ?????. 2. OUYI (OKX), ??? ?? ?? ? ??? ? ??, ??? ?????? ? ?? ??; 3. ??? ??, ???? ??, ??? ??? ?? ?? ??? ? Huobi (HTX); 4. Gate.io (Sesame Open Door), ??? ?? ??? Altcoins? ?? ??? ?????? ??? ?????. 5. ????? ??? ??? ?? ??? ? CoinmarketCap? ?? ?? ???? ???? ???? ?? ?? ?? ??, ?? ?? ???? ?????.

?? ????? ???? Yandex ????? ??????. 2. "OUYI ?? ? ???"? ???? ?? ? ???? ???? ??? ??????. 3. ?? ? ???? ???? ??? ???? ?? ??? ???????? ??????. 4. ???? ?? ?? ?? ???? ??? ?? ??? ??? "? ???? ?? ???? ??"??? ????? ??? ??? ? ?? ??? ??? ???? ?? ??? ????.

?? ?? ????? Battle Royale? ?? ??? ?? ???? ?????. ?? 2023 ? 8 ?, Makerdao ?? ?? ???? ???? ?? $ DAI8%? ??? ?????. ?? ?? Sun Chi? ? 230,000 ??? Steth? ???? Spark? ??? 15% ??? ???? Makerdao? ???? 5%? ????? ?? ?????? ??????. Makerdao? ?? ??? $ DAI? ???? "???"?? ?? ??? ?? Justin Sun? ?? ?????????. 2025 ? 7 ?, Ethe

2025 ?? ?? ?? ???? ?? ??? ?? ?????. 1. Binance? ??? ??, K- ?? ??, NFT ?? ? Defi Staking ??? ?????. 2. OUYI? Web3 ??? "??"??? ???? Defi? NFT ?? ??? ? ?? ??? ?????. 3. Huobi? ??? ?? ??, NFT ?? ?? ? Defi Financial Products? ???? ????. 4. Gate.io?? ?? Defi ? NFT ????? ???? ? ??? "?? ? ??"? NFT ??? ?????. 5. ???? ??? ?? ??? ? CoinmarketCap, Ethereum, NFT ??? ? Defi ???? TVL? ????? ?????. 6. ??? ????? ? Coingecko? ???? ?? ???? ????

Binance App? USDT ? USDC? ?? Stablecoin? ?? ? ???? ? ??? ?? ??? ?????. ?? ?? ??? ?? ??? ?? ?? ?????. 2. OUYI ?? ??? ?? ??? ?? ??? ??? ??? ? ????? ??? ?? ?? ? ?? ??? ??? ?????. 3. Huobi (HTX) ?? ??? ??? ? ??? ??? C2C ??? ?? ??? ??? ??? ??? ?????. 4. Gate.io App?? ??? ??? ???? ??? ?? ? ?? ??? ?? ????? ???? ????? ?????. 5. CoinmarketCap? ? ?? ???? ?? ?? ??? ???? ??? ? ??? ? ??? ??? ???? ??? ??? ?????. 6. Coingecko? ??? ??? ? ?? ?? ??? ?? ?? ? ??? ???? ?????.
