2024年1月31日水曜日

Microsoft Azure AI servicesの音声サービスを呼び出してテキスト読み上げを行う

Microsoft Azure AI servicesの音声サービスのREST APIを呼び出して、テキスト読み上げを実行してみます。

こちらの記事「OpenAIのText to speech APIを呼び出して写真の説明を読み上げる」で作成したアプリケーションを、Google Gemini Pro VisionとAzure AI servicesの音声サービスの組み合わせに置き換えます。呼び出しているサービスを入れ替えるだけなので、元記事にあるアプリケーションの動作は変わりません。

Microsoft Azure側の準備を行います。

AzureのPortalより、Azure AI servicesの音声サービスを開き、音声サービスの作成を行います。


サブスクリプションリソース・グループリージョン名前価格レベルFree F0を選択しました)を環境に合わせて指定し、確認と作成をクリックします。


確認画面が表示されるので、作成をクリックします。


デプロイが完了したら、リソースに移動します。


サイド・メニューからキーとエンドポイントを開きます。

Oracle APEXからREST APIを発行する際に使用するので、キー1場所/地域エンドポイントの値をコピーして保管しておきます。


Azure側の準備は以上で完了です。

APEX側でWeb資格証明を作成します。

最初にHTTPヘッダーOcp-Apim-Subscription-Keyの値をAPIキーとしたWeb資格証明を作成します。

名前Azure TTS Resource Key静的IDAZURE_TTS_RESOURCE_KEYとします。認証タイプはHTTPヘッダー、資格証明名はヘッダー名のOcp-Apim-Subscription-Key資格証明シークレットAPIキーキー1の値)を設定します。


リソース・キーだけでも良いのですがトークンでも認証できるように、もうひとつトークンを保持するためのWeb資格証明を作成します。

名前Azure TTS Bearer Token静的IDAZURE_TTS_BEARER_TOKENとします。認証タイプHTTPヘッダー資格証明名Authorizationとします。

資格証明シークレットは後でコードから更新するため、適当な文字列を指定します。


Microsoft Azureの音声サービスを呼び出すパッケージをUTL_AZURE_AI_SERVICESとして作成しています。以下のコードを実行し、パッケージを作成します。音声サービスの音声出力は音声は日本語のみ、NonStreamingのみを対象にしています。

Web資格証明が適切に作成できているか、日本語の音声一覧を取得することにより確認します。

SQLコマンドで以下のスクリプトを実行します。日本語の音声一覧が取得できれば、認証関連の設定が正しいことが確認できています。引数p_regionに渡す値は、環境に合わせて変更します。


APIの呼び出しにはWeb資格証明AZURE_TTS_RESOURCE_KEY(APIキーでの認証)とAZURE_TTS_BEARER_TOKEN(トークンでの認証)のどちらも指定できます。トークンでの認証の場合、取得したトークンの有効期間は10分間です。Microsoftのドキュメントによると、9分間は同じトークンを使用することが推奨されています。
アクセス トークンを使用する方法

このサービスには、アクセス トークンを Authorization: Bearer <TOKEN> ヘッダーとして送信する必要があります。 各アクセス トークンは 10 分間有効です。 新しいトークンはいつでも取得できますが、ネットワークのトラフィックと待機時間を最小限に抑えるために、同じトークンを 9 分間使用することをお勧めします。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/rest-text-to-speech?tabs=streaming

今回は取得したトークンの再利用を実装していないため、APIキーによる認証により音声サービスを呼び出すことにします。

作成済みのAPEXアプリケーションに変更点はありません。

以下のコードで、写真を受け取って音声を返すRESTサービスを作成します。引数p_regioneastusを与えている部分は、環境に合わせて変更します。



アプリケーション定義の置換文字列G_REQUEST_URLの置換値を、新しく作成したPOSTハンドラの完全なURLに置き換えます。


以上で、Google Gemini ProとAzure AI servicesの音声サービスへの置き換えは完了です。

今回の記事の作業を行う本来の目的は、Azure AI servicesのREST APIをサービス・プリンシパルで認証して呼び出すことだったのですが、それはできませんでした。

Azure AI サービスに対する要求の認証
https://learn.microsoft.com/ja-jp/azure/ai-services/authentication
重要
Microsoft Entra 認証は常に、Azure リソースのカスタム サブドメイン名と共に使用される必要があります。 リージョン エンドポイントでは、Microsoft Entra 認証がサポートされていません。
また、カスタム・サブドメインはプライベートエンドポイントのみでサポートされています。

Azure AI サービスのカスタム サブドメイン名

警告
Speech Service では、プライベート エンドポイントのみでカスタム サブドメインが使用されます。 それ以外の場合は、Speech Service および関連付けられている SDK でリージョン エンドポイントを使用してください。
Microsoft Entra IDを使用して認証する方法については、前出の「Azure AI サービスに対する要求の認証」の「Microsoft Entra IDを使用して認証する」のセクションで手順が紹介されています。トークンURLに呼び出しなどは標準的なOAuth2のクライアント資格情報フローに従っているように見えるので、Oracle APEXからもAPIアクセスに必要なトークンは取得できるでしょう。

おまけ


今回作成しているアプリケーションは、PWAとしてインストールできるように設定しています。スマホなどにアプリケーションをインストールすると、アプリケーションを起動するたびにユーザー認証が要求されるため(そしてスマホ上でユーザー名とパスワードを入力するのはかなり面倒)、かなり使いにくいアプリになります。

Oracle APEXでは、パスワード入力を一定期間省略するために、永続認証という機能を提供していますが、インスタンス単位で有効にする必要があります。しかし、インスタンスの設定変更はできない場合があります。

アプリケーションのログイン・ページにあるプロセスLoginの引数p_set_persistent_authの値を常にTrueにすることによって、アプリケーション単位で永続認証を有効にできるようです。

プロセスCookieのユーザー名を設定コメント・アウトします。


レンダリング・ビューのプロセスCookieのユーザー名を取得、ページ・アイテムP9999_REMEMBERP9999_PERSISTENT_AUTHもコメント・アウトします。


以上で、サインインする際に永続認証を強制することができます。

今回の記事は以上になります。

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