Androidオフライン音声読み上げ機能 - TTS(Text To Speech)

序文

     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)

おすすめ

転載: blog.csdn.net/ansondroider/article/details/127387315