繁体   English   中英

Android - TTS 没有声音出来

[英]Android - TTS no voice coming out

我正在尝试为 android 实现一个 TTS 应用程序。 这是我到目前为止编写的代码:

import android.app.Activity;
import android.content.Intent;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Locale;

public class AlarmActivity extends Activity implements OnClickListener, TextToSpeech.OnInitListener {

    private TextToSpeech mTts;
    private static final String TAG = "TextToSpeechDemo";
    private static final int MY_DATA_CHECK_CODE = 1234;
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.alarm);

        Button btnAdd = (Button) findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(this);
        btnAdd.setEnabled(false);

        TextView txt = (TextView) findViewById(R.id.txt);
        txt.setText("OnCreate");

        // Fire off an intent to check if a TTS engine is installed
        Intent checkIntent = new Intent();
        checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
        startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        TextView txt = (TextView) findViewById(R.id.txt);
        if (requestCode == MY_DATA_CHECK_CODE)
        {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
            {
                // success, create the TTS instance
                txt.setText("Done result");
                mTts = new TextToSpeech(this, this);
                mTts.setLanguage(Locale.US);
                Button btnAdd = (Button) findViewById(R.id.btnAdd);
                btnAdd.setEnabled(true);

            }
            else
            {
                txt.setText("Missing");
                // missing data, install it
                Intent installIntent = new Intent();
                installIntent.setAction(
                        TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installIntent);
            }
        }
    }

    @Override
    public void onDestroy()
    {
        // Don't forget to shutdown!
        if (mTts != null)
        {
            mTts.stop();
            mTts.shutdown();
        }
        super.onDestroy();
    }

    @Override
    public void onClick(View v) {

        TextView txt = (TextView) findViewById(R.id.txt);
                txt.setText("Click");

        String myText1 = "Did you sleep well?";
        String myText2 = "I hope so, because it's time to wake up.";
        mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
        mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
    }
    @Override
    public void onInit(int status) {
        TextView txt = (TextView) findViewById(R.id.txt);
        txt.setText("status 0");
        if (status == TextToSpeech.SUCCESS) {
                txt.setText("status 1");
            int result = mTts.setLanguage(Locale.US);
            if (result == TextToSpeech.LANG_MISSING_DATA ||
                result == TextToSpeech.LANG_NOT_SUPPORTED) {
                txt.setText("status 2");
            } else {
                Button btnAdd = (Button) findViewById(R.id.btnAdd);
                btnAdd.setEnabled(true);
                txt.setText("status 3");
            }
            } else {
            txt.setText("status 4");
            Log.e(TAG, "Could not initialize TextToSpeech.");
        }
    }
}

我的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Alarms"
        android:id="@+id/txt" />
    <Button android:id="@+id/btnAdd"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Say" />
</LinearLayout>

在 netbeans ADB 日志中,我可以看到以下内容:

13:08:41.314    163 INFO    ActivityManager Starting activity: Intent { act=android.speech.tts.engine.CHECK_TTS_DATA cmp=com.svox.pico/.CheckVoiceData }
13:08:41.504    163 INFO    ActivityManager Displayed activity org.me.talkingdroid/.MainActivity: 2790 ms (total 2790 ms)
13:08:41.544    163 WARN    ActivityManager Binding with unknown activity: android.os.BinderProxy@46d91ac8
13:08:41.634    264 DEBUG   [ScrollKPI] drawScreenCache takes 222ms, drawThumbnailCache takes 106ms
13:08:43.214    163 VERBOSE KeyInputQueue   Enqueueing:  MotionEvent{470684e0 action=0 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}
13:08:43.214    163 INFO    WindowManager   dispatchPointer MotionEvent{470684e0 action=0 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}
13:08:43.214    163 INFO    WindowManager   Delivering pointer QueuedEvent{470bdcb8 MotionEvent{470684e0 action=0 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}} to Window{46e0c640 org.me.talkingdroid/org.me.talkingdroid.MainActivity paused=false}
13:08:43.264    163 VERBOSE KeyInputQueue   Enqueueing:  MotionEvent{470684e0 action=1 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}
13:08:43.264    163 INFO    WindowManager   dispatchPointer MotionEvent{470684e0 action=1 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}
13:08:43.264    163 INFO    WindowManager   Delivering pointer QueuedEvent{46f34300 MotionEvent{470684e0 action=1 x=310.26947 y=438.86896 pressure=0.15294118 size=0.13333334}} to Window{46e0c640 org.me.talkingdroid/org.me.talkingdroid.MainActivity paused=false}
13:08:43.284    10637   INFO    TTS received:   Did you sleep well?
13:08:43.284    10637   INFO    TTS received:   I hope so, because it's time to wake up.
13:08:46.714    10038   DEBUG   dalvikvm    GC_EXPLICIT freed 417 objects / 26192 bytes in 82ms
13:08:47.994    10637   DEBUG   dalvikvm    Debugger has detached; object registry had 398 entries

很明显,我试图输出的文本是从日志中发送的,但是我听不到手机发出的任何声音。 可能是什么问题?

发生这种情况似乎是因为手机以 USB 调试模式连接到计算机。 一旦禁用,TTS 就可以完美运行!

此线程指的是 SpeechSynthesis 数据安装程序的问题。 我的问题也是来自 TTS 程序的“没有声音” (类似于所示),否则它可以正确执行。 就我而言,这是由于我的平板电脑上没有安装 SpeechSynthesis 数据。 在我的平板电脑上安装它后,我的程序甚至可以在调试模式下运行并连接电缆。

对于像我这样的 TTS 新手,我在下面列出了在 Android 4.0.4 上安装语音合成数据时所做的工作。 它们在其他版本上可能不同,但应该相似。

开始“设置” - 选择: “设置>语言和输入>文本到语音输出”,然后在“首选引擎下,选择“谷歌文本到语音引擎”,然后单击该选项右侧的“设置”符号. 这显示了三个选项:首先选择(1) “语言”,然后选择(2) “Google TTS 设置”并选中“自动更新语音”和“仅使用 Wi-Fi”*,最后选择(3) “安装语音”数据' ; (必须启用 Wi-Fi 才能下载数据)

多亏了 stackoverflow,提出的问题和给出的答复让我能够解决我的问题,这不是代码,而是平板电脑上 TTS 的配置。 我还了解到,问题并不总是代码。

您的代码更像是 android 文档。 我刚刚写了这个演示代码。 我相信如果您在下一行中用resultCode替换requestCode ,它会正常工作。 if (requestCode == MY_DATA_CHECK_CODE)这是我的代码:

public class TTS_demoActivity extends Activity implements OnClickListener,OnInitListener {
private EditText mContent;
private Button mSpeak;
private String mTemp;
private static final int REQ_TTS_STATUS_CHECK = 1;  
private static final String TAG = "TTS Demo";
private TextToSpeech mTts;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mContent = (EditText) findViewById(R.id.etcontent);
    mSpeak = (Button) findViewById(R.id.btnspeak);
    mSpeak.setOnClickListener(this);
    init();
}
/*
 * 初始化方法检测TTS所需要的数据是否存在
 */
private void init() {
    Intent mCheckIntent=new Intent();
    mCheckIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(mCheckIntent, REQ_TTS_STATUS_CHECK);

}
/*
 * 对检测结果进行分类处理
 */

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQ_TTS_STATUS_CHECK)
    {
        switch (resultCode) {
        case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
            mTts = new TextToSpeech(this, this);
            Log.v(TAG, "tts engine is instance");
            break;
        case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
            //文件已经损坏
        case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
            //缺少发音文件
        case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA: 
            //数据文件丢失

            //从新更新TTS数据文件
            Intent mUpdateData=new Intent();
            mUpdateData.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(mUpdateData);

            break;

        case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
            //检测失败应该重新检测
            Log.v(TAG, "TTS engine checked fail");
            break;
        default:
             Log.v(TAG, "Got a failure. TTS apparently not available");  
            break;
        }

    }   

}

@Override
public void onInit(int status) {
    if(status==TextToSpeech.SUCCESS){
        int result=mTts.setLanguage(Locale.US);
        if(result==TextToSpeech.LANG_NOT_SUPPORTED||result==TextToSpeech.LANG_MISSING_DATA)
        {
            Log.v(TAG, "language is not available");

        }else{
            mTts.speak("start complete", TextToSpeech.QUEUE_ADD, null);
            mSpeak.setEnabled(true);
        }

    }

}

@Override
public void onClick(View arg0) {
    mTemp= mContent.getText().toString();
    if(mTemp!=""||mTemp.trim()!=""){
    mTts.speak(mTemp, TextToSpeech.QUEUE_ADD,null);
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if(mTts!=null){
        mTts.shutdown();
    }
}

@Override
protected void onStop() {
    super.onStop();
    if(mTts!=null){
        mTts.stop();
    }
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    this.finish();
}
}

我不得不将我的默认语言更改为电话上的文本到语音支持的语言才能正常工作:

设置->语言和输入->语言。

支持:英语(英国)和英语(美国)。
不支持:英语(IE)。

我在运行 android 设备的 Raspberry pi 3 上遇到了类似的问题,其中 TTS 仅通过 USB 端口播放,直到我在我的 TextToSpeech 对象上运行TextToSpeech.setAudioAttributes(AudioAttributes)并带有AudioAttributes.FLAG_AUDIVILITY_ENFORCED标志,如下面的代码所示:

public class CustomTTS extends TextToSpeech {

    private static final String UTTERANCE_ID =
            "com.example.androidthings.bluetooth.audio.UTTERANCE_ID";

    public CustomTTS(Context context, TextToSpeech.OnInitListener listener){
        super(context, listener);
        setOnUtteranceProgressListener(new MyProgListener());
        try {
            AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder().
                    setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING).
                    setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).
                    setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED);
            setAudioAttributes(audioAttributes.build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM