2023年2月27日月曜日

OCI Languageサービスを使用して翻訳を行う

 オラクルのOCI Languageに無料枠があったので、APEXでOCI Languageの翻訳サービスを呼び出すアプリケーションを作ってみました。


OCIでのAPIユーザーの作成手順およびAPEXでのWeb資格証明の作成手順については、以前に書いた記事を参考にしています。

APEXからOCIオブジェクト・ストレージを操作する(1) - APIユーザーの作成
APEXからOCIオブジェクト・ストレージを操作する(4) - Web資格証明の作成

上記の手順に追加して、APIキーを持つユーザーにOCI Languageサービスの呼び出しを許可するため、ポリシーを作成します。

APIユーザーが含まれているグループAPEXObjectManagersである場合、ポリシー・ステートメントは以下になります。

allow group APEXObjectManagers to use ai-service-language-family in tenancy


APEX側の作業として、アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。

作成したアプリケーションのホーム・ページページ・デザイナで開き、ページ・アイテムボタンを作成します。

翻訳する文字列の言語を指定するページ・アイテムP1_SOURCE_LANGを作成します。タイプテキスト・フィールドラベルSource Langとします。ISO 639-1のコードを指定します。タイプ選択リストにすると、指定が容易になるでしょう。


翻訳する文字列を指定するページ・アイテムP1_SOURCE_TEXTを作成します。タイプテキスト領域ラベルSource Textとします。


同様に翻訳先の言語を指定するページ・アイテムP1_TARGET_LANGを作成します。


翻訳結果を保持するページ・アイテムP1_TARGET_TEXTを作成します。


最後に送信ボタンを作成します。

識別ボタン名SUBMITラベルSubmit動作アクションはデフォルトのページの送信のままとします。


左ペインでプロセス・ビューを開き、ボタンSUBMITを押した時に実行するプロセスTranslateを作成します。

ソースPL/SQLコードとして以下を記述します。

declare
/* OCI Languageの翻訳処理のエンドポイント */
C_ENDPOINT constant varchar2(120) := 'https://language.aiservice.us-ashburn-1.oci.oraclecloud.com/20221001/actions/batchLanguageTranslation';
l_request json_object_t;
l_request_clob clob;
l_response json_object_t;
l_response_clob clob;
l_documents json_array_t;
l_document json_object_t;
begin
/* 翻訳を依頼するメッセージを作成する。 */
l_request := json_object_t();
l_document := json_object_t();
l_document.put('key', '1');
l_document.put('text', :P1_SOURCE_TEXT);
l_document.put('languageCode',:P1_SOURCE_LANG);
l_documents := json_array_t();
l_documents.append(l_document);
l_request.put('documents',l_documents);
l_request.put('targetLanguageCode',:P1_TARGET_LANG);
l_request_clob := l_request.to_clob();
/* 翻訳リクエストの発行 */
apex_web_service.clear_request_headers();
apex_web_service.set_request_headers('Content-Type','application/json');
l_response_clob := apex_web_service.make_rest_request(
p_url => C_ENDPOINT
,p_http_method => 'POST'
,p_body => l_request_clob
,p_credential_static_id => 'OCI_API_ACCESS'
);
/* 応答のすべてをJSON形式で確認する。 */
-- :P1_TARGET_TEXT := l_response_clob;
/* 翻訳された文章だけを確認する。 */
l_response := json_object_t(l_response_clob);
l_documents := l_response.get_array('documents');
/* 送信したkeyは1だけなので、翻訳された文章も1つだけ */
l_document := json_object_t(l_documents.get(0));
:P1_TARGET_TEXT := l_document.get_string('translatedText');
end;

サーバー側の条件ボタン押下時SUBMITを選択します。


以上でアプリケーションは完成です。実行すると記事の先頭のGIF動画のように動作します。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/oci-language-translate.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。