N2TTSの声を選択する
2017/01/30時点で、Android6.0.1(Nexus5)にて、N2TTSの複数のインストール済み音声をプログラム側で指定する方法を記載します。
以下の説明は、どのコードをどこに置くかなどは明示しません。なんとなく、感覚で理解できる方向けの説明になっていますのでご了承ください。TTSの使い方がわからない方は、他のサイトなどで調べておいて、とりあえずGoogleのでしゃべることが確認できる状態になってからみてください。(そのうちまとめたものを用意するかもしれませんが)
まず、N2TTSの音声を指定するための配列を用意しておきます。
// voice variables
private final String all_voices[] = {
"ma001", "ma002", "ma003", "ma004", "ma005",
"mb001", "mb002", "mb003", "mb004", "mb005",
"fa001", "fa002", "fa003", "fa004", "fa005",
"fb001", "fb002", "fb003", "fb004", "fb005"
};
private final String man_voices[] = {
"ma001", "ma002", "ma003", "ma004", "ma005",
"mb001", "mb002", "mb003", "mb004", "mb005"
};
private final String lady_voices[] = {
"fa001", "fa002", "fa003", "fa004", "fa005",
"fb001", "fb002", "fb003", "fb004", "fb005"
};
次に、声を選択する処理を書きます。
以下の例は直接指定、ランダム含めた書き方をしています。
Random rnd = new Random();
if(tts_voice_kind.equals("man random")){
int size = man_voices.length;
int _rand = rnd.nextInt(size);
voice = man_voices[_rand];
}else if(tts_voice_kind.equals("lady random")){
int size = lady_voices.length;
int _rand = rnd.nextInt(size);
voice = lady_voices[_rand];
}else if(tts_voice_kind.equals("random")){
int size = all_voices.length;
int _rand = rnd.nextInt(size);
voice = all_voices[_rand];
}else{
voice = tts_voice_kind;
}
tts_voice_kindは、SharedPreferencesで保存した設定値を格納する変数として、ソースコード内冒頭あたりに定義しています。
次に、TTSの初期化後に音声を指定しています。
public void onInit(int status) {
// TODO 自動生成されたメソッド・スタブ
//LogWrite("onInit");
if(status==TextToSpeech.SUCCESS){
if(voice.equals("default")){
mTts.setLanguage(Locale.JAPANESE);
}else{
Locale locale = new Locale(Locale.JAPAN.getLanguage(),
Locale.JAPAN.getCountry(), voice);
mTts.setLanguage(locale);
}
}
}
また、TTSをnewするとき、第3引数に "jp.kddilabs.n2tts" を指定しておきます。これは、N2TTSがインストールされている環境において、強制的にN2TTSを選択する、という指定になります。補助(アクセシビリティ)の設定にある「Googleを使うかN2TTSを使うか」の設定を無視します。ここは、適時工夫していいところだと思います。