プログラミングガイド

AITalk®5 SDK 製品を利用して音声合成を行う方法を説明します。 以降「AITalk®5 SDK 製品」は「SDK」と記します。

ここでは機能ごとの説明ではなく、SDK を利用するプログラムの開発を始めるためのガイドを提供します。 機能の細かな説明については ライブラリリファレンス を参照してください。 実装例は同梱のサンプルプログラムを参照してください。

C 言語インターフェース

SDK は、C 言語インターフェースで機能を提供します。 名前の衝突を避けるため、以下の規則でシンボル名 (関数名や型名など) を決定しています。

  1. すべてのシンボルは接頭辞 AITalk_ を持ちます。

  2. AITalk_ 接頭辞の次にライブラリ接頭辞を追加します。

    例えば、「音声合成ライブラリ」に属するシンボルは接頭辞 AITalk_Core_ を持ちます。

  3. クラスのメンバー関数として提供している機能は、さらにクラス名を接頭辞に追加します。

    例えば、音声合成には Tts クラスを用いますが、メンバー関数は接頭辞 AITalk_Core_Tts_ を持ちます。

  4. コンストラクタは new() ・リソースの破棄関数は delete() の名前で提供します。 コンストラクタ・リソース破棄関数は最終的に AITalk_Core_Tts_new()AITalk_Core_Tts_delete() となります。

外部ライブラリ (TensorFlow など) のシンボルはこの限りではありません。

このドキュメントでは、クラスのメンバー関数を C++ 形式で表記します。 例えば、Tts クラスの putKeyValue() 関数は AITalk_Core_Tts_putKeyValue() として提供しますが、ここでは Tts::putKeyValue() と表記することがあります。

注釈

列挙型・共用体は型ですが、シンボルがライブラリに埋め込まれないため、上記規則に準拠しません。

音声合成を行う最低限の流れ

SDK を用いて音声合成を行う最低限の流れです。

SDK の利用には初期化・ライセンス認証が必要です。 ライセンスファイルとライセンスコードを指定して、ライセンス認証を行ってください。

音声合成を行うには Tts クラスを利用します。 Tts クラスのインスタンス (以下 Tts インスタンス) を作成してください。 作成した Tts インスタンスに言語辞書・音声辞書を読み込むと、音声合成を行うことができます。 音声辞書の読み込みには、対応した音声辞書ライセンスファイルを事前に Tts インスタンスに読み込む必要があります。

音声合成を開始する際に、テキストとコールバック関数を Tts インスタンスに渡します。 テキストから音声合成された合成結果が、コールバック関数で渡されます。

ライブラリは音声合成中にいくつかのイベントをコールバック関数から通知します。 音声合成によって結果を得るには、バッファ要求イベント (BufReq) とバッファ終了イベント (BufDone) を適切に実装する必要があります。

BufReq は、ライブラリが音声合成結果を返すためのバッファを求めていることを通知するイベントです。 ユーザープログラムはコールバック関数の引数に適切に受け取り用のバッファを指定する必要があります。

BufDone は、ライブラリが音声合成処理 1 単位を終えて結果を渡すために通知するイベントです。 BufReq で指定した受け取り用バッファに音声データが格納されています。 (コールバック関数の引数として、バッファと音声データの長さも返します。) BufDone のあとにライブラリがそのバッファを参照することはありません。

音声合成した結果の音声データがすべてユーザーに通知されるまで、 BufReqBufDone が繰り返し通知されます。

!include ./style.uml

actor       "User"         as user
box "SDK"
  participant "Tts" as tts
  participant "初期化/認証\nモジュール" as license
end box

== 初期化/認証 ==
user -> license: 初期化
return
user -> license: ライセンス認証
return
== SDK の利用 ==

create tts
user -> tts: Tts インスタンスを作成する
return
user -> tts: 言語辞書・音声辞書ライセンス・  \n音声辞書を読み込む
return

user -> tts: 音声合成を開始する
activate tts
loop 音声合成が終わって音声データの\nコールバックが終わるまで
  user <- tts:  バッファの要求
  user --> tts: バッファを指定する
  user <- tts:  音声データをコールバック
  user -> user: 音声データを処理する
  user --> tts
end
return
deactivate tts

user -> tts: Tts インスタンスを削除する
return
destroy tts

== 終了処理 ==
user -> license: ライセンス無効化
return
user -> license: 終了処理
return

メンバー変数の操作について補足

Tts インスタンスのメンバー変数を操作するには、列挙値といくつかの関数群を利用します。 例えば、言語辞書を読み込むには Tts::putKeyValue() に以下を指定します。

  • 列挙値

  • キー

  • 言語辞書のパス

Tts インスタンスのメンバー変数には、キーを持つものと持たないものがあります。 キー持つメンバー変数は、キーごとに値を区別することで複数の値を設定できます。 具体的には、言語辞書・音声辞書などはキーを持ち、文字エンコーディング設定などはキーを持ちません。 キーを持たないメンバー変数の操作で、キーを指定しても無視されます。

Tts::hasKey() などの Key で終わる関数は、キーなしのメンバー変数をサポートしていません。 キーなしのメンバー変数を指定するとエラーを返します。

TtsParameter クラスも同様の操作関数を用いて扱います。

関数・メンバー変数の詳細は ライブラリリファレンス を参照してください。

マーカー

入力したテキストと合成した音声の位置を対応付けるため、ライブラリは位置情報を出力します。 この位置情報をマーカーと呼びます。 マーカーは音声データと同様にコールバック関数で渡されます。 コールバックにより通知されるタイミングを、マーカー通知モード を指定して設定できます。 マーカー通知モードはマーカーの種類ごとに設定できます。

マーカー機能を利用するには、 BufReq でライブラリにマーカー用のバッファを指定してください。 マーカー用バッファが指定されていない場合は、通知モードによらずマーカーは通知されません。

マーカー種別

マーカーは以下の 4 種類です。

ブックマークマーカー

入力テキストのブックマークタグ挿入位置を通知するマーカー。 タグの記載方法の詳細は AI 中間言語 を参照してください。

リップシンクマーカー

合成結果の音素情報を通知するマーカー。 詳細は リップシンクデータ を参照してください。

アクセント句マーカー

各アクセント句の先頭のオーディオサンプル位置を通知するマーカー。 どのアクセント句かを識別するために、入力テキスト先頭からのアクセント句の通し番号を含みます。

フレーズマーカー

各フレーズの先頭のオーディオサンプル位置を通知するマーカー。 どのフレーズかを識別するために、入力テキスト先頭からのフレーズの通し番号を含みます。

マーカー通知モード

マーカーの通知モードは以下の 3 種類です。

無効

通知しません。

バッファ出力

BufDone の際に、音声データとともに通知します。 音声データの出力と同様、 BufDone のあとにライブラリがそのバッファを参照することはありません。

バッファ出力とマーカー通知イベント

マーカーを通知できるようになったらすぐマーカー通知イベントで通知します。 ライブラリは BufDone の後にバッファが無効になったと判断するため、 BufDone にもマーカー情報は含まれます。

並列処理

SDK は並列処理をサポートしています。

並列にテキスト処理・音声合成処理を行うには、複数の Tts インスタンスを作成してください。 1 つの Tts インスタンスでは並列処理を行うことはできません。

複数の Tts インスタンスを扱うため、ライブラリに同一の状態 (言語辞書・音声辞書・設定) のインスタンスを複製する機能・状態をコピーする機能を用意しています。 Tts インスタンスはデータ競合が発生しないよう内部で適切に排他制御を行います。

複数の Tts インスタンスに同一の言語辞書・音声辞書を読み込む際には注意が必要です。 前提として Tts インスタンスには、キーとファイルパスを指定して言語辞書・音声辞書を読み込みます。 キーに対してそれぞれの辞書のパスが紐付きます。 1 複数の Tts インスタンスでは、異なる Tts インスタンス間でキーが同一の場合、ライブラリ内部で同じメモリ領域を参照します。 キーが異なる場合は同一のパスでも異なるメモリ領域に言語辞書・音声辞書が読み込まれます。 インスタンスの複製機能・コピー機能を使うと、新しい Tts インスタンスでも同一のキー・同一のパスで言語辞書・音声辞書を読み込むことができます。

警告

キーで言語辞書・音声辞書が共有されるため、異なる Tts インスタンスであっても、同名のキーに異なるパスを指定して読み込むとエラーになります。

1

辞書の種類が異なる場合は同名のキーが利用できます。

注釈

AITalk 4.1 では、並列にテキスト処理を行えませんでした。 AITalk 5 はテキスト処理・音声合成処理をマルチスレッドで並列処理できます。

!include ./style.uml

actor       "User"          as user
participant "Thread 1" as user_1
participant "Thread 2" as user_2
box "SDK"
  participant "Tts 1" as tts_1
  participant "Tts 2" as tts_2
end box

note right of user
  初期化/ライセンス認証処理は省略します
end note

create tts_1
user -> tts_1: Tts インスタンス ("Tts 1") を作成する
return
user -> tts_1: 言語辞書・音声辞書ライセンス・音声辞書を読み込む
return

user  ->  tts_1: "Tts 1" からコピーして Tts インスタンス ("Tts 2") を作成する
create tts_2
tts_1 ->  tts_2
tts_1 <-- tts_2
user  <-- tts_1

create user_1
user -> user_1: "Tts 1" 用のスレッドを作成
create user_2
user -> user_2: "Tts 2" 用のスレッドを作成

user_1 -> tts_1: "Tts 1" で音声合成を開始する        
activate tts_1
user_2 -> tts_2: "Tts 2" で音声合成を開始する
activate tts_2

user -> user_1: スレッド終了を待機

group 順不同
  user_1 <- tts_1: 合成結果のコールバック
  user_2 <- tts_2: 合成結果のコールバック
end

user_1 <-- tts_1
deactivate tts_1
user_2 <-- tts_2
deactivate tts_2


user <-- user_1: スレッド終了
destroy user_1

user -> user_2: スレッド終了を待機
user <-- user_2: スレッド終了
destroy user_2

user -> tts_1: "Tts 1" の削除
return
destroy tts_1

user -> tts_2: "Tts 2" の削除
return
destroy tts_2