前言
前々、編集者に搜狗インプットの音声機能を評価するテストタスクが与えられました。評価タスクは、主に評価資料の選択と整理、ハードウェアの調査と購入、評価ツールの開発、評価の実行と結果の整理に分けられました。編集者は評価ツールのサーバーサイド開発を担当しました。主にWebSocket技術を使用しました。今回は簡単に共有します。
評価プロセス
音声評価プロセスでは、Web端がスピーカーに接続して音声の再生機能を実現し、モバイルクライアントが音声を受け取って処理します。このプロセスでは、Web端とクライアント間の正確な通信がプロセスのスムーズで効率的な実行を保証する重要な要素です。
評価プロセスでは、音声を1つずつ再生し、各音声が再生されるたびに、Web端が各モバイルクライアントの状態(音声処理が完了したか、次の音声を受け取る準備ができているかなど)を知る必要があります。これにより、次の音声をいつ再生するか決定します。同様に、クライアントもWeb端の再生状態(いつ開始し、いつ終了するかなど)をリアルタイムで受け取る必要があります。評価プロセス全体では、Web端とクライアント間の頻繁な通信が必要です。したがって、効率性和質を保証する適切な通信技術を選ぶ必要があります。
通信技術
通信技術を選ぶ前に、いくつかの基本概念を理解しましょう:
短连接:各HTTPリクエストでTCP接続が確立されます。管理は簡単ですが、1回の完全なTCP接続には3回のハンドシェークと4回のハンドシェークが必要です。頻繁なリクエストでは、TCPの確立と終了操作上多くの時間がかかります。
長接続:HTTP1.1以降はデフォルトで長接続が確立されます。クライアントがリクエストを発行し、サーバーが受け取ります。双方が接続を確立します。サーバーが応答を返すまで接続が保持されます。クライアントがリクエストを送信する際には、同じ接続を使用します。クライアントまたはサーバーが会話を終了したと判断すると、どちらかが接続を切断します。これはデータベース接続などリアルタイム性の高いシナリオに適しています。
今回の評価プロセスでは、クライアントとサーバー間の通信が頻繁で、リアルタイム性も要求されるため、最初から長接続方式を検討しました。しかし、HTTPプロトコルは一般的にクライアントから開始され、サーバーは直接プッシュできません。これにより、サーバーに継続的な変更があれば、クライアントが知ることが麻烦です。評価プロセスでは、クライアントがリアルタイムで自身の状態情報をサーバーに送信し、サーバーも主に自身の現在の状態を知らせる情報をクライアントに送信します。このような完全な双方向通信プロトコルは、WebSocketプロトコルです。
WebSocket:完全な双方向通信プロトコルで、最初のTCPリンクが確立されると、その後のデータはクライアントとサーバーが積極的に送信できます。リクエストヘッダーを送信する必要がなく、この接続はクライアントまたはサーバーのどちらかが積極的に接続を閉じるまで持続します。HTTP長接続とは異なり、WebSocketは接続を閉じるタイミングをより柔軟に制御できます。HTTPプロトコルのKeep-Aliveが終了すると、サーバーはすぐに接続を閉じます。
WebSocket実装
WebSocketはカスタムプロトコルを使用し、未暗号化接続はhttp://ではなくws://で、デフォルトポートは80です。暗号化接続はhttps://ではなくwss://で、デフォルトポートは443です。例:
ws://example.com/wsapi
wss://wsapi.example.com/
典型的なWebSocketハンドシェークリクエストは次のようになります。
クライアントリクエスト
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
サーバー応答
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/
- Connection はUpgradeに設定される必要があります。これはクライアントが接続をアップグレードしたいことを示します。
- Upgrade フィールドはWebsocketに設定される必要があり、Websocketプロトコルにアップグレードしたいことを示します。
- Sec-WebSocket-Keyはランダムな文字列で、サーバーはこれらを使用してSHA-1のメッセージダイジェストを構築します。 「Sec-WebSocket-Key」に特殊な文字列「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」を追加し、SHA-1ダイジェストを計算し、結果をBASE-64エンコーディングして「Sec-WebSocket-Accept」ヘッダーの値としてクライアントに返します。これにより、通常のHTTPリクエストが誤ってWebsocketプロトコルと見なされることを避けることができます。
WebSocketプロトコルは本質的にTCPに基づくプロトコルです。基本的なwebsocket通信を実装する方法も非常に簡単で、任意のプログラミング言語で実装できます。その言語が基本的なBerkeley socketsを実現できる限りです。今回の評価では、編集者はPythonをWeb端開発言語として使用しました。また、PythonにはWebSocketの実装が多くの適用可能なライブラリで包装されています。これにより開発プロセスの難易性が大幅に低下しました。
クライアント
WebSocketはwsまたはwssの統一リソース識別子を使用します。また、jsはwsプロトコルをサポートしています。したがって、WebSocketを使用する場合、フロントエンドの使用は一般的に比較的標準的です。
var s = new WebSocket("ws://%s/<id>");//websocket接続を作成
s.onopen = function() {}
s.onmessage = function(e) {}//メッセージを監听
s.onerror = function(e) {}//エラーを監听
s.onclose = function(e) {}//接続を閉じる
s.send(value);//メッセージを送信
サーバー
Pythonでは、よく使われる通信フレームワークはFlaskです。このフレームワークでは、gevent-websocketライブラリを例として、以下がサーバー側の実装コードです。コードはサーバーがクライアントから送信されたメッセージ(message = wsock.receive())を受け取って、同样のメッセージをクライアントに送信(wsock.send(message))する简单な実装です。
from flask import Flask
from gevent-websocket import WebSocketError
from gevent.pywsgi import WSGIServer
from gevent-websocket.handler import WebSocketHandler
app = Flask(__name__)
users = dict()
@app.route('/websocket/<uid>')
def handle_websocket(id):
wsock = request.environ.get('wsgi.websocket')
users[id] = wsock
if not wsock:
abort(400, 'Expected WebSocket request.')
while True:
try:
message = wsock.receive() # クライアントから送信されたメッセージを受け取る
except WebSocketError:
break
if message:
for uid in users:
try:
users[uid].send(message) # クライアントに情報をプッシュ
except WebSocketError:
print u'ユーザーはすでに接続を切断しました'
# クライアントが切断した場合は、その切断されたwebsocketを削除する
users.pop(id)
if __name__ == '__main__':
server = WSGIServer(("0.0.0.0", 8000), app, handler_class=WebSocketHandler)
server.serve_forever()
aiスピーキング
ドルフィンAIは言語学習アプリケーションのためのプロフェッショナルな発音評価API(pronunciation assessment api)ソリューションを提供します。音素、単語、文章、チャプター、発音矯正、単語矯正、クイズ、フリーダイアログ、多肢選択問題など幅広く提供しています。当社の発音評価製品(pronunciation assessment)は、英語と中国語、クラウドAPI、オンプレミス、オフラインデバイスの展開をサポートしています。当社の発音評価API(pronunciation assessment api)は、正確性、流暢性、完全性、リズムの次元をカバーする豊富な評価指標を提供し、音素、単語、文の異なるレベルの評価スコアも提供します。また、音素、単語、文の異なるレベルでの評価スコアも提供します。数千万人のユーザーに安定した効率的で安全なサービスを提供しています。ドルフィンAIの発音評価製品(pronunciation assessment)を試してみませんか?