眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Xamarin.iOSでゆっくりボイスを喋らせてみた(*'▽')

ごあいさつ

今使っているMacBookProが2010年モデルでメモリが4GBしかありません。

ちなみに来月が誕生日です。

・・・・・・・('ω')・・・・・・・・・

tamafuyou.hatenablog.com

前回の記事に引き続き、今回はXamarin.iOSでゆっくりボイスをしゃべらせてみます。

作ってみる。

開発環境

Mac + XCode8.1 + Xamarin Studio 6.1.2

今回の開発はMacが必須です。

もしMacを持っていない・・・という事であれば

www.nuits.jp

MacinCloudを使うことでプログラムはできますが音が出ないのでゆっくりボイスを聞けません(´・ω・`)

サンプルプログラム

github.com

今回作成するプログラムはこちらのリポジトリに保存してあります。

ダウンロード

http://www.a-quest.com/download/index.html

AquesTalk iOS 1.6.2 をダウンロードしてください。

f:id:tamafuyou:20161125174803p:plain

libファイルの中にあるヘッダファイルとライブラリファイルを使用します。

プロジェクト作成

まずはプロジェクトを作成します。

f:id:tamafuyou:20161125180114p:plain

iOSのSingle View Appを使用します。

f:id:tamafuyou:20161125180939p:plain

名前は適当で良いかと思います。

アプリの ソリューションをを作成できましたら次はバインディングライブラリ用のプロジェクトをソリューションに追加します。

f:id:tamafuyou:20161125181250p:plain

iOSのLibraryにあるBindingLibraryを作成してください。

名前は適当で良いです。AquesTaklLibとしました。

f:id:tamafuyou:20161125182720p:plain

そうしたらアプリプロジェクトにてバインディングライブラリを参照追加してください。

これでとりあえずソリューションとプロジェクトの準備が完了です。

Objective Sharpie

これは参考までにということで・・・

developer.xamarin.com

iOSライブラリへのP/Invokeを行うC#クラスを作成してくれるツールがObjective Sharpieです。

ヘッダファイル、Frameworkを元に作成することができます。

ただあまり精度が良くありません。複雑でない関数を5,6個という事であればヘッダファイルをみながら自分で関数を書いた方が早いです。

今回もObjectiveSharpieは試してみましたが良い結果は得られなかったため自分でP/Invokeを書きました。

バインディングライブラリ

先ほど作成したバインディングライブラリにaファイルを追加します。

すると

f:id:tamafuyou:20161125185607p:plain

こんな風に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の開発ライセンスは

使用ライセンス - AQUEST オンラインストア

こちらで購入することができます。

ではでは('ω')ノ