序文
Android では、TTS の正式名称は Text to Speech です.テキストを音声サービスに変換することで解決する問題を文字通り理解できます.つまり、テキスト情報を入力すると、Android システムがテキストをブロードキャストできます. . 現在、この種のアプリケーション シナリオは主にさまざまな音声アシスタント アプリにあり、多くの携帯電話システム インテグレータには、現在のページのテキスト情報を読み取ることができるテキスト読み上げサービスが組み込まれています。同様に、一部の読書アプリにも関連サービスがあり、WeChatを開いて読むと、現在のページを音声モードで直接再生できます。これは、携帯電話の画面で読むのが不便なシナリオに特に適しています。
Android システムはバージョン 1.6 から TTS をサポートしていますが、残念ながらシステムのデフォルトの TTS エンジンであるPico TTSは中国語をサポートしていません。
多くの関連情報を検索した後、多くのリソースが期限切れであり、APK が見つからず、対応するページが 404 であることがわかりました。より多くのメーカーがオープン プラットフォーム に切り替え、オフライン/無料サービスを提供しなくなっています。
これまでに見つかったオフライン TTS
注: 以下のリンクにアクセスするには、インターネットへのアクセスが必要になる場合があります。
アプリケーション名 | オフラインをサポート | 述べる | ダウンロードリンク |
---|---|---|---|
ITRI TTS | はい | なし | ダウンロード |
シュンフェイ ユウジ | はい | 一度開く必要がありますが、ログインする必要はありません | ダウンロード |
HKUST Xunfei 音声エンジン 3.0 | はい | お勧め | ダウンロード |
Google による音声サービス | いいえ | インターネットを科学的にサーフィンする必要があり、オフラインの場合は最初にボイスパックをダウンロードする必要があります | ダウンロード |
使用
まず、対応する TTS アプリケーションをインストールしてから、設定で対応する音声出力サービスを設定します.
一般的な設定手順は:設定 > アクセシビリティ > テキスト読み上げ (TTS) 出力です.
プログラム呼び出しは、標準の TTS を使用するだけで済みます. SDK のインターフェイス
. TTS の使用を紹介する記事では、次の段落のコードは、以前の HKUST Xunfei または ITRI TTS に影響を与えず、ポップアップ ウィンドウを追加するだけです. もちろん、それも理解できます。これら 2 つのアプリは、標準インターフェイスに従って開発されていません。
//显示应用选择窗.
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
private TextToSpeech mTts;
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
mTts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
プログラムのTTS getAvailableLanguagesおよびgetVoicesでサポートされている言語と音声を出力します。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
Set<Locale> ava = mTts.getAvailableLanguages();
if (ava != null) {
for (Locale l : ava) {
Logger.v(TAG, "supported " + l.toString());
}
} else {
Logger.d(TAG, "no supported language");
}
Set<Voice> voices = mTts.getVoices();
if(voices != null){
for(Voice v : voices){
Logger.d(TAG, "TTS Voice: " + v.toString());
}
}
}
String engine = mTts.getDefaultEngine();
Logger.d(TAG, "TTS Engine = " + engine);
2022-10-18 15:21:22.577 25266-25266 TextToSpeech com.tts.test I Connected to ComponentInfo{tw.pu.tts/tw.pu.tts.UttsService}
2022-10-18 15:21:22.582 25266-26006 TextToSpeech com.tts.test I Set up connection to ComponentInfo{tw.pu.tts/tw.pu.tts.UttsService}
2022-10-18 15:21:22.594 25266-25266 TTS com.tts.test D onInit 0
2022-10-18 15:21:22.650 25266-25266 TTS com.tts.test V supported zh
2022-10-18 15:21:22.650 25266-25266 TTS com.tts.test V supported en
2022-10-18 15:21:22.650 25266-25266 TTS com.tts.test V supported zh__#Hans
2022-10-18 15:21:22.650 25266-25266 TTS com.tts.test V supported zh__#Hant
2022-10-18 15:21:22.690 25266-25266 TTS com.tts.test D TTS Voice: Voice[Name: zh, locale: zh__#Hans, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS com.tts.test D TTS Voice: Voice[Name: en, locale: en, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS com.tts.test D TTS Voice: Voice[Name: zh, locale: zh, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS com.tts.test D TTS Voice: Voice[Name: zh, locale: zh__#Hant, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.698 25266-25266 TTS com.tts.test D TTS Engine = tw.pu.tts
注: TTS の関数はTextToSpeech.OnInitListenerでコールバックする必要があり、ステータスが正常であることを確認してから動作を開始できます。
完全なコードTTS.java
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.speech.tts.TextToSpeech;
import android.speech.tts.Voice;
import java.util.Locale;
import java.util.Set;
public class TTS implements TextToSpeech.OnInitListener {
final String TAG = "TTS";
TextToSpeech mTts;
public TTS(Context context){
mTts = new TextToSpeech(context, this);
}
public TTS(Context context, TextToSpeech.OnInitListener lis){
mTts = new TextToSpeech(context, this);
setOnInitListener(lis);
}
final int DATA_CHECK_CODE = 0x774;
@Deprecated
public TTS(Activity activity){
Intent checkIntent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
activity.startActivityForResult(checkIntent, 0x774);
}
@Deprecated
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
if (requestCode == DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
mTts = new TextToSpeech(activity, this);
} else {
// missing data, install it
Intent installIntent = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
activity.startActivity(installIntent);
}
}
}
public TextToSpeech getTts(){
return mTts;}
private void dump(){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
Set<Locale> ava = mTts.getAvailableLanguages();
if (ava != null) {
for (Locale l : ava) {
Logger.v(TAG, "supported " + l.toString());
}
//mTts.setLanguage(Locale.US);
} else {
Logger.d(TAG, "no supported language");
}
Set<Voice> voices = mTts.getVoices();
if(voices != null){
for(Voice v : voices){
Logger.d(TAG, "TTS Voice: " + v.toString());
}
}
}
String engine = mTts.getDefaultEngine();
Logger.d(TAG, "TTS Engine = " + engine);
}
public void setSpeechSpeed(float speed){
mTts.setSpeechRate(speed);
}
public void setVoiceFreq(float freq){
mTts.setPitch(freq);
}
public void speak(String s){
if(mTts == null){
Logger.e(TAG, "speak failed: TTS not ready");
return;
}
int res = mTts.speak(s, TextToSpeech.QUEUE_ADD, null);
if(res != 0){
Logger.w(TAG, "speak failed: " + res);
}else{
Logger.d(TAG, "speak " + s + " done");
}
}
public void stop(){
mTts.stop();
}
@Override
public void onInit(int status) {
Logger.d(TAG, "onInit " + status);
if(status == 0) {
dump();
mTts.setPitch(1f);
mTts.setSpeechRate(1f);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attr = new AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build();
mTts.setAudioAttributes(attr);
}
}
if(initLis != null)initLis.onInit(status);
}
TextToSpeech.OnInitListener initLis;
public void setOnInitListener(TextToSpeech.OnInitListener initLis){
this.initLis = initLis;
}
}
参考
Android 中国語音声エンジン リソース
Android は独自の TextToSpeech を使用してオフライン音声合成機能を実現しています
Android 向けの 7 つのベスト テキスト読み上げアプリ Android
で提供されている無料のテキスト読み上げ機能 TextToSpeech (Android TTS 音声合成ブロードキャスト) のクイック スタートの使用法)
Android でのテキスト読み上げの概要
添付ファイル:
テキスト読み上げ (TTS) アプリケーション (APK)