2023年3月6日月曜日

rinna株式会社のText to Speech - v2のAPIを使用する

 rinna株式会社が提供しているText to Speech - v2のAPIをOracle APEXのアプリケーションから呼び出して、文章の読み上げを実装してみます。

音声の部分が再生されないため動作が分からないですが、Text to SpeechのボタンをクリックするとrinnaのAPIを呼び出し、文章の読み上げを行います。結果がWAVファイルとして生成されるので、それを取得しデータベースに保存します。オーディオ・コントロールより、データベースに保存したWAVファイルを再生します。

対話モード・レポートのページより、それまでのAPI呼び出しの履歴である文章とWAVにアクセスできます。ボイスIDやスタイルの影響について確認できます。

rinna株式会社の開発者向けサイトよりアカウント登録を行い、Rinna IDを取得します。取得したRinna IDのProfileから、APIの認証に使用するキー(Primary keyまたはSecondary key)の値を確認します。適用されているプランについては、Plansのタブから確認できます。2023年3月6日現在、Freeのプロダクトで月間1,000リクエストまで無料でAPIの呼び出しができるようです。

提供されているAPIのTerms of UseおよびFAQなどは、利用者ご自身にて確認していだくようお願いします。FAQには、APIは現在、試験運用中で検証を除く業務用利用は禁止しております、と記載されています。

作成するOracle APEXのアプリケーションは、指定可能な各種のパラメータを設定してText To SpeechのAPIを呼び出します。生成されたWAVファイルを取得し、データベースにBLOBとして保存したのち再生します。

最初に、読み上げの元になる文章と音声データを保存する表を作成します。

クイックSQLの以下のモデルを使って、表RINNA_TEXT_TO_SPEECHESを作成します。列SIDTIDSPEEDVOLUMEはText to SpeechのAPI呼び出し時に与えるパラメータです。これ以外にMP3またはWAVのどちらかのフォーマットを指定できますが、今回のアプリケーションはWAVで固定します。
# prefix: rinna
# auditcols: true
text_to_speeches
    text clob
    speech blob
    sid number
    tid number
    speed number
    volume number
SQLの生成SQLスクリプトを保存レビューおよび実行を順次クリックします。表の作成までを実施し、アプリケーションの作成は行いません。


データベースの列SPEECHに保存されたWAVデータを再生するために、RESTサービス作成します。

SQLワークショップRESTfulサービスを開きます。


モジュールを作成します。

モジュール名rinnaベース・パス/rinna/とします。公開ONにします。


テンプレートを作成します。

URLテンプレートspeechとします。


ハンドラを作成します。

メソッドGETソース・タイプMedia Resourceを選択します。ソースとして以下のSQLを記述します。

select 'audio/wav', speech from rinna_text_to_speeches where id = :id


完全なURLに引数idを与えることにより、列SPEECHに保存されたWAVデータが取り出されます。今回はAlways FreeのAutonomous Database上でアプリケーションを実装しているため、以下のようなURLになります。

https://ホスト名/ords/ワークスペース名/rinna/speech?id=表RINNA_TEXT_TO_SPEECHESのID値

rinna APIの認証に使用するWeb資格証明を作成します。

ワークスペース・ユーティリティWeb資格証明を開きます。


rinna APIはHTTPヘッダーOcp-Apim-Subscription-KeyPrimary key(またはSecondary key)を与えることで認証されます。

名前rinna Developer key静的識別子としてRINNA_DEVELOPER_KEYを設定します。静的識別子はPL/SQLコード中に埋め込みます。異なる静的識別子にした場合は、PL/SQLのコードも変更する必要があります。

認証タイプHTTPヘッダー資格証明名としてOcp-Apim-Subscription-Key、資格証明シークレットとしてrinna IDのProfileから確認できるPrimary keyを設定します。


以上で準備ができました。これからAPEXのアプリケーションを作成します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前Text to Speechとします。

対話モード・レポートのページを追加します。ページの追加をクリックします。


対話モード・レポートを選択します。


ページ名Speechesとします。表またはビューとしてRINNA_TEXT_TO_SPEECHESを選択します。フォームは不要なので、フォームを含めるチェックしません

ページの追加をクリックします。


アプリケーションの作成をクリックします。


アプリケーションが作成されます。

最初に共有コンポーネントとして、スタイルIDを指定するためのLOVを作成します。

共有コンポーネントを開きます。


他のコンポーネントLOVを開きます。


作成済みのLOVが一覧されます。作成をクリックします。


LOVの作成最初からを選択します。

へ進みます。


作成するLOVの名前LOV_SYTLEとします。タイプStaticを選択します。

へ進みます。


LOV表示値戻り値を設定します。スタイルIDの定義より、'1:talk' or '2:happy' or '3:sad' or '5:angry' or '6:fear' or '7:surprised'戻り値:表示値のペアとして設定します。

LOVの作成をクリックします。


共有LOVとしてLOV_STYLEが作成されました。


ホーム・ページにText to Speech APIの呼び出しを実装します。

ホーム・ページのページ・ナビゲーション削除します。


ボイスIDを指定するページ・アイテムP1_SIDを作成します。

識別名前P1_SIDタイプ数値フィールドラベルボイスIDとします。設定最小値27最大値47を設定します。検証必須の値ONにします。デフォルトタイプ静的値を選択し、静的値として27を設定します。


スタイルIDを指定するページ・アイテムP1_TIDを作成します。

識別名前P1_TIDタイプ選択リストラベルスタイルとします。レイアウト新規行の開始OFFとして、ページ・アイテムP1_SIDの右隣に配置します。検証必須の値ONとします。LOVタイプ共有コンポーネントを選択し、LOVとして先ほど作成したLOV_SYTLEを選択します。デフォルトタイプ静的静的値1を指定し、ニュートラルな話し方であるtalkをデフォルトにします。


話速を指定するページ・アイテムP1_SPEEDを作成します。

識別名前P1_SPEEDタイプ数値フィールドラベル話速とします。設定最小値0.1最大値10.0仮想キーボードNumericを選択します。新規行の開始OFFにして、ページ・アイテムP1_TIDの右隣に配置します。

検証必須の値ONデフォルトタイプ静的静的値として1.0を指定します。


音量を指定するページ・アイテムP1_VOLUMEを作成します。

識別名前P1_VOLUMEラベル音量とします。それ以外はP1_SPEEDと同じ設定を行います。


読み上げるテキストを入力するページ・アイテムP1_TEXTを作成します。

識別名前P1_TEXTタイプとしてテキスト領域を選択します。検証必須の値ONにします。


Text to Speechを実行するボタンを作成します。

識別ボタン名TEXT_TO_SPEECHラベルText to Speech動作アクションとして、デフォルトのページの送信を選択します。


APIを呼び出して取得した音声は、表RINNA_TEXT_TO_SPEECHESに保存されます。保存されている行の主キーの値を保存するページ・アイテムP1_IDを作成します。

識別名前P1_IDタイプとして非表示を選択します。


WAVデータの再生を行うオーディオ・コントロールを表示します。

リージョンを作成し、識別タイトル読み上げとします。タイプとして静的コンテンツを選択し、ソースHTMLコードとして以下を記述します。WAVデータを取り出すORDS RESTサービスを呼び出します。/ords/apexdevの部分は環境に合わせて変更します。

<audio controls src="/ords/apexdev/rinna/speech?id=&P1_ID."></audio>

外観テンプレートBlank with Attributesを選択します。サーバー側の条件タイプとしてアイテムはNULLではないを選択し、アイテムP1_IDを指定します。


ボタンTEXT_TO_SPEECHをクリックしたときに実行されるプロセスを作成します。

作成したプロセスの識別名前Text to Speechとします。タイプコードを実行です。ソースPL/SQLコードとして、以下を記述します。


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


Text to SpeechのAPI呼び出しについては、以上で実装完了です。

Text to Speechの実行履歴を一覧するレポートより、保存されている音声を再生できるようにします。

IDタイププレーン・テキストに変更し、列の書式HTML式として以下を記述します。/ords/apexdevの部分は環境に合わせて変更します。

<audio controls src="/ords/apexdev/rinna/speech?id=#ID#"></audio>

TIDを選択し、識別タイププレーン・テキスト(LOVに基づく)に変更します。LOVとしてLOV_STYLEを選択します。


以上でアプリケーションは完成です。

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

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