Xamarin.iOSでゆっくりボイスを喋らせてみた(*'▽')
ごあいさつ
今使っているMacBookProが2010年モデルでメモリが4GBしかありません。
ちなみに来月が誕生日です。
・・・・・・・('ω')・・・・・・・・・
前回の記事に引き続き、今回はXamarin.iOSでゆっくりボイスをしゃべらせてみます。
作ってみる。
開発環境
Mac + XCode8.1 + Xamarin Studio 6.1.2
今回の開発はMacが必須です。
もしMacを持っていない・・・という事であれば
MacinCloudを使うことでプログラムはできますが音が出ないのでゆっくりボイスを聞けません(´・ω・`)
サンプルプログラム
今回作成するプログラムはこちらのリポジトリに保存してあります。
ダウンロード
http://www.a-quest.com/download/index.html
AquesTalk iOS 1.6.2 をダウンロードしてください。
libファイルの中にあるヘッダファイルとライブラリファイルを使用します。
プロジェクト作成
まずはプロジェクトを作成します。
iOSのSingle View Appを使用します。
名前は適当で良いかと思います。
アプリの ソリューションをを作成できましたら次はバインディングライブラリ用のプロジェクトをソリューションに追加します。
iOSのLibraryにあるBindingLibraryを作成してください。
名前は適当で良いです。AquesTaklLibとしました。
そうしたらアプリプロジェクトにてバインディングライブラリを参照追加してください。
これでとりあえずソリューションとプロジェクトの準備が完了です。
Objective Sharpie
これは参考までにということで・・・
iOSライブラリへのP/Invokeを行うC#クラスを作成してくれるツールがObjective Sharpieです。
ヘッダファイル、Frameworkを元に作成することができます。
ただあまり精度が良くありません。複雑でない関数を5,6個という事であればヘッダファイルをみながら自分で関数を書いた方が早いです。
今回もObjectiveSharpieは試してみましたが良い結果は得られなかったため自分でP/Invokeを書きました。
バインディングライブラリ
先ほど作成したバインディングライブラリにaファイルを追加します。
すると
こんな風にLinkWithファイルができていると思います。
このLinkWithファイルを開きLinkWithAtributesにIsCxx=trueとする指定を追加します。
IsCxxフラグはNativeライブラリにC++が使用されている場合に指定します。
次にP/Invokeするクラスを追加します。
ヘッダファイルを参考にこのようなクラスを作成しました。
AquesTalk_Xamarin_Sample/StructsAndEnums.cs at master · yuka1984/AquesTalk_Xamarin_Sample · GitHub
P/Invoke用に関数を書くときのポイントとしては
- 値型は長さに気を付けてそのまんま
- ポインタ型はIntPtrにしておけばOK
って感じです。
アクセスをinternalにしているのは外部からアクセスさせないためです。
なのでラッパークラスを作成します。
AquesTalk_Xamarin_Sample/AquesTalk.cs at master · yuka1984/AquesTalk_Xamarin_Sample · GitHub
ラッパークラスとしてはあまり良いとは言えない手抜きなので参考程度にお願いします。
stringをエンコードしてbyte配列にした上でMarshalでIntPtrにして渡しています。
アプリ
ダウンロードしたzipファイルに付属されているサンプルアプリをベースに作成します。
まずは画面を作ります。
まずはサンプルアプリのmain.storyboardファイルをxamarinプロジェクトの物と入れ替えます。
そのまま入れ替えてしまえばOKです。
そうしたらMain.Storyboardを開きplayボタン、stopボタンをダブルクリックしてViewControllerクラスにクリック時の呼び出し関数を追加します。
サンプルアプリのObjective-Cで書かれたViewController.mファイルを参考にViewControllerクラスを作成します。
AquesTalk_Xamarin_Sample/ViewController.cs at master · yuka1984/AquesTalk_Xamarin_Sample · GitHub
ほぼそのまんまです。
1点ポイントとしては、NsNotificationによるコールバック関数コールはUIスレッドで実行されていないようなのでLabelのTextを変更する際にUIスレッドで処理するようにしないエラーになる。
というくらいです。
それにしてもXamarinがほんとに良いです。
Objective-CであろうとSwiftであろうとJavaであろうとネイティブのコードを参考にほとんど迷いなくC#に移植することができます。
逆にXamarinで作成してあるアプリをNativeに持っていくこともできると思います。あまり意味はないと思いますが・・・
次回はXamarin.Formsでゆっくりボイスを・・・・という事を考えていたのですが実はうまくないのです。
XFってAndroidのAPI15移行に対応しているんですがAquesTalkの評価版はarmeabiしかsoファイルが無いのでエミュレータが用意できないのです。
API15だとarmeabi-v7aになってしまうのです。
なので開発ライセンス買うしかないのです。XFで使えるか評価したかったのですが残念です。
ですので株式会社AQUEST AquestTalkを使用したゆっくりボイスをXamarinで喋らせてみるシリーズは終了です。
AquesTalkの開発ライセンスは
こちらで購入することができます。
ではでは('ω')ノ