2016-05-11

iOSのSafariとUIWebViewでspeechSynthesis.getVoices()が空っぽ

JavaScriptで、speechSynthesis.getVoices() とやれば、テキストを音声読み上げするときに設定するvoiceのリストが返ってくるはずなんだけど、iOSだと空っぽのemptyリストが返ってきてしまう。実際には、音声読み上げ可能なはずなのに、空っぽ。iOSのバージョン9.2でしかチェックしていない。

さあ困った。どうする?

予想としては、Objective-Cのコードで  [AVSpeechSynthesisVoice speechVoices]; とやったときに取得できるvoiceは利用可能なのでないかと思う。

実際に試してみる。やっぱりそうみたい。利用可能なのはこんな感じ。(ここから転載

LocaleLanguage/Country
ar-SAArabic (Saudi Arabia)
en-ZAEnglish (South Africa)
th-THThai (Thailand)
nl-BEDutch (Belgium)
en-AUEnglish (Australia)
de-DEGerman (Germany)
en-USEnglish (United States)
pt-BRPortuguese (Brazil)
pl-PLPolish (Poland)
en-IEEnglish (Ireland)
el-GRGreek (Greece)
id-IDIndonesian (Indonesia)
sv-SESwedish (Sweden)
tr-TRTurkish (Turkey)
pt-PTPortuguese (Portugal)
ja-JPJapanese (Japan)
ko-KRKorean (Korea)
hu-HUHungarian (Hungary)
cs-CZCzech (Czech Republic)
da-DKDanish (Denmark)
es-MXSpanish (Mexico)
fr-CAFrench (Canada)
nl-NLDutch (Netherlands)
fi-FIFinnish (Finland)
es-ESSpanish (Spain)
it-ITItalian (Italy)
ro-RORomanian (Romania)
no-NONorwegian(Norway)
zh-HKChinese (Hong Kong)
zh-TWChinese (Taiwan)
sk-SKSlovak (Slovakia)
zh-CNChinese (China)
ru-RURussian (Russia)
en-GBEnglish (United Kingdom)
fr-FRFrench (France)
hi-INHindi (India)

var msg = new SpeechSynthesisUtterance("てきすと");
msg.lang = "ja-JP";
speechSynthesis.speak(msg);

のように地域コードつきでlangを指定する。言語コードだけ指定して、msg.lang = "ja"; とやるのではダメみたい。

2016-05-04

HTML5のバリデーションチェックを使うのやめた

翻訳コンニャクで、HTML5のバリデーション(checkValidityなど)を利用してみたのだが、ブラウザごとの挙動にばらつきがありすぎて使いにくい。これから書き直して、サーバーサイドのチェックだけにする予定。

特に、Safariの挙動が制御しにくい。checkValidityは動くし、validationMessageも設定されているのだが、それにもかかわらずポップアップでエラー表示が行われない。Safariのためにゴチャゴチャ処理を書くとわけわからないことになりそう。

Safariは、executeCommandも動かないし、最近のIEよりも扱いにくい。