5

さまざまな言語でテキストを読み取るアプリを実装しようとしています。驚いたことに、メソッドisLanguageAvailable(Locale loc)を使用すると、まだダウンロードされていない Google TTS リストの言語に対してtrueが返されます。speak()メソッドを呼び出したときにも再生されます。私は、これはオンラインの声であるために起こると結論付けました。

ドキュメントには、Voice オブジェクトに対してメソッドgetFeatures()を使用して、音声がオンラインかどうかを知ることができることが示されています。ただし、Voiceクラスは API >= 21 で実装されています。API < 21 では、 TextToSpeechクラスに加えてgetFeatures(Locale loc)メソッドがあり、さまざまな機能の説明を含む文字列配列を返すことになっています。さまざまなエンジンとロケールでこの最後の方法を試しましたが、通常は空の配列が得られます。おそらく、これは TTS 開発者が入力できるかどうかにかかわらず追加情報です...

では、tts-locale が API < 21 のオンライン ロケールであるかどうかをどのように知ることができますか?

4

1 に答える 1

3

Google Text to Speech エンジンは、ユーザーが追加の「オフライン」ダウンロードをインストールしていない場合、ネットワークで合成された音声を使用できるという点で独特です。

通常、これを要求するには、次のものを含めます。

put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, String.valueOf(shouldNetwork()));

彼らのネットワークで合成された音声は、以前は著しく高品質でしたが、最近では改善されてあまり目立たなくなりました.

Text to Speech エンジンが API < 21 に提供した情報は絶望的で、一般的に間違っていましたisLanguageAvailable(Locale loc)。新しい API はこれを解決しようとするため、API < 21 では、信頼できる詳細情報を取得するのに苦労します。要素をクエリする方法については、この質問に対する私の回答をご覧ください。

これを書いている時点では、新しい API を使用しても、エンジンは誤った情報を提供しています。

例として、IVONA では、クエリを実行すると次のgetVoices()ような値が返されます。

Voice[Name: en-US, locale: en_US, quality: 300, latency: 300, requiresNetwork: false, features: [embeddedTts]] 

しかし、それは省略しています:

Voice[Name: en-US, locale: en_US, quality: 300, latency: 300, requiresNetwork: false, features: [embeddedTts, **notInstalled**]] 

したがって、あなたのコードは、このエンジンが動作することを前提としていますが、動作しません.... 私の未回答のバグ レポートに加えて、非常に苛立たしいことです。

上記のすべてが述べたように、現在、エンジンとの対話を初めて試みたときに単純な通知にフォールバックする必要がある場合があります。クリックすると、アプリの FAQ につながります - FAQ では、エンジンがインストールとダウンロードを確認してください.......

すべてがうまく機能する簡単なコード スニペットを投稿できなかったのは残念です。

于 2016-06-08T08:58:04.937 に答える