TTS Pro for Android/iOS

どうもゴン氏です。
英語物語のために、読み上げエンジンをもっと高度に使えるようにしたい今日このごろ、
いっそアセットストア用にも作って、売上に貢献しちゃおうと思います。

まずは既存のアセットのインターフェースを確認しときましょう。

StopSpeech()
SpeechAdd(string text)
SpeechAdd(string text,float volume,float rate,float pitch)
SpeechFlush(string text,float volume,float rate,float pitch)
SpeechFlush(string text)
Initialize(string local = UnitedStates,string enginePkg = null)
//以下Androidのみ
OpenTTSSetting()
Stop() 

GetEnginePkgArray() 
GetEngineNameArray() 
SetEngineByPackageName(string pkg) 
GetDefaultEngineName() 

次に、追加したい機能を考えます。
元々、読み上げスピードと多言語設定できるようにしたいなと考えてたので、いまのでもできるじゃないかと思いつつ、

もう一度Android・iOS双方のTTS機能をおさらいしてみます。

Androidのリファレンス
https://developer.android.com/reference/android/speech/tts/TextToSpeech.html

開いただけで、うげぇってなりますね。頑張って読みます。

読み進めた感じ、
エンジン毎に言語と声を設定できるようだ。
その他はpitchとrateとvolumeくらい。
あとは、初期化時のコールバックと終了時のshutdownの必要
発話状況に関するリスナー
QUEUE ModeのADDか QUEUE
stop.
ぐらいかな。抑えるべきは。
Androidはapi levelによって使えるものが変わってくるので注意が必要ですね。
特に21(5系)から使えるものがあり、
まだ、4系ユーザは割といるので、要注意です。

他にもカスタマイズの機能や無音の機能があるが、
iOSにもあったら考えてみよう。

iOSのリファレンス
https://developer.apple.com/reference/avfoundation/avspeechsynthesizer

Androidと違ってpauseが簡単にできるのはいいですね。
Voiceがありますが、これは、Androidの言語にあたるもので、
声とは違いそうですね。

う〜ん。Androidの声の仕様は残念ながら切りですね。

ということで、
まずはインターフェースを考えます。初級中級上級
【basic 】
Speak(string text)・・・話す
Stop()
Init()

【Advanced】
Pause()
Resume()
SpeakAdd(string text)・・・話す
Speak(string text, float volume, float rate, float pitch)
SpeakAdd(string text, float volume, float rate, float pitch)
SetVolume(float volume)
SetRate(float rate)
SetPitch(float pitch)

【expert】
string[] GetAvailableLanguage()
SetLanguage(string language)
Init(string language)
GetDefaultLanguage()
GetLanguage()

//for android
string[] GetAvailableEnginePkg()
string[] GetAvailableEngineName()
SetEngine(string pkg)
GetEngine()
Init(string pkg)
Init(string pkg , string language)
bool HasEngine()
GetDefaultEngine
GetVoices()
GetVoice()
SetVoice(string Voice)

な感じかな。

構造としては、複数の設定を持てるようにしたいので、
Monovihaviorを継承するクラスを作って、Monovihaviorが設定データを保存する感じにしようかな。shutdownの都合もあるし。
Androidの場合、Engine初期化時にどうしてもラグが発生してしまうので、
ネイティブコード側にMap<pkg,TTS> みたいなインスタンスを保持できる場所をつくて、Engine毎に使いまわす感じにしようかな。

よし。だいたいの設計はできた。
どうせ、後から、一杯不都合が見つかるが、まずは突き進もう。