こちらの記事で、SwiftでAquesTalkまたはAquesTalk2フレームワークを使う方法を書きましたが、今回はObjective-Cで使う方法です。
AquesTalkフレームワーク自体はSwiftで書かれているので、幾つかの点を注意すればObject-Cからも簡単に呼び出せます。
Objective-CからAquesTalk.frameworkを呼び出すときのポイント
- EMBEDDED_CONTENT_CONTAINS_SWIFTをYesに
- 変数上(NSData型)に音声データを生成するsyntheメソッドが使えない
導入方法
フレームワークの追加とヘッダのimportの他に、オプションの設定が必要です。
1. フレームワークをプロジェクトに追加
AquesTalk iOSをダウンロードして、このzipファイルを展開しておきます。
ダウンロードしたパッケージ内のAquesTalk.frameworkを、
プロジェクトSetting画面>Generalタブ>Embedded Binariesに追加します。
この時、Copy items if neededをチェックし、フレームワークをプロジェクトにコピーする方が簡単です。
2. import
使用するクラスの先頭でAquesTalkフレームワークをimportします。
# import "ViewController.h"
# import <AquesTalk/AquesTalk-Swift.h>
3. Build Settingの変更
ターゲットSetting画面>Build Settingsにて
EMBEDDED_CONTENT_CONTAINS_SWIFT
をYesに変更します。
これをしていないと実行時にdyld: Library not loaded: @rpath/libswiftCore.dylib
というエラーで落ちます。
ちなみに、この設定はSwiftの標準ライブラリをアプリバンドルにコピーするオプション設定です。
4. playメソッドをコール
あとは、任意の場所にplayメソッドを記述するだけです。
引数の文字列には、漢字の文字列を記述できません。
かな表記の読み記号とアクセントなどで記述した音声記号列を指定します。
- (IBAction)obplayButton:(id)sender {
[AquesTalk play:@"ゆっくりしていってね" speed:100 notification: nil];
}
その他の機能
1. 話速を変える
引数speedに50から200までの値を指定して話す速度を変更できます。値を小さくすると遅くなります。デフォルトは100で省略できます。
[AquesTalk play:@"ゆっく'り/はっせーしま'す" speed:50 notification: nil];
2. 発声を止める
メソッドstopの呼び出しで、発声の途中で終了することができます。
[AquesTalk stop];
3. 発声の終了タイミングを知る
引数notificationにNSNotificationを指定すると、発声終了のタイミングでそのNotificationが発生します。これにより、発声終了時に何か処理を行うことができます。
次のコードは、発声開始時にラベルを"Playing..."にし、発声終了後"Done"にする例です。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Notificationの登録 発声終了を検知しなければ不要 メソッド名やnameは任意で
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(daDone:)
name: @"AquesTalkDaDoneNotify"
object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:YES];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (IBAction)play:(id)sender {
//終了通知イベントの作成 name部分はNSNotificationCenterに設定した値に合わせる
NSNotification *notifi = [NSNotification notificationWithName:@"AquesTalkDaDoneNotify" object:self userInfo:nil];
onPlayLabel.text = @"Playing...";
[AquesTalk play:@"ゆっくりしていってね" speed:100 notification: notifi];
}
- (void)daDone:(NSNotification*)notification
{
onPlayLabel.text = @"Done";
}
4. その他
他には、発声中の有無を返すisPlay
メソッドがあります。
また、Swiftで使える、音声再生せずにNSDataにwavフォーマットのデータを返すsynthe
メソッドは使えません。これは、inoutを使った参照渡しの関数がObjective-Cから呼び出せないという現在の仕様によるものです。
Links
AquesTalk iOS 評価版ダウンロード
評価版は、ナ行、マ行がヌになる制限があります。個人が非営利で使う場合など、アクエストの個人利用の規定に従えば登録料のみで製品版のライブラリが入手できます。詳細はライセンスのページを参照。
音声記号列仕様書
playメソッドで読み上げる文字列(音声記号列)の書き方はここに規定されています。