【问题标题】:Send Android TextToSpeech to just one stereo channel仅将 Android TextToSpeech 发送到一个立体声通道
【发布时间】:2015-01-12 10:49:09
【问题描述】:

在 Android 上,我只想通过一个声道播放 TextToSpeech 输出(想想肩膀天使)。为此,我目前使用tts.synthesizeToFile(),然后使用 MediaPlayer 播放动态创建的文件。我使用mediaPlayer.setVolume(0.0f, 1.0f) 只通过一个通道播放音频。

我的工作代码如下。

我的问题是:有没有更直接的方式通过单声道播放 TTS 输出?

使用 TextToSpeech 合成文件非常耗时,并且使用 MediaPlayer 播放它使用的资源比绝对必要的要多。我希望它能够响应并在低端设备上工作,因此对 CPU 友好很重要。


MainActivity.java

package com.example.pantts;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.speech.tts.TextToSpeech;
import android.os.Bundle;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Locale;


public class MainActivity extends Activity implements TextToSpeech.OnInitListener {

    private TextToSpeech tts;
    private String toSpeak = "Hello, right ear!";
    private static final String FILE_ID = "file";
    private HashMap<String, String> hashMap = new HashMap<String, String>();

    private String filename;
    private TextToSpeech tts;
    private MediaPlayer mediaPlayer;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        filename = getFilesDir() + "/" + "tts.wav";
        Log.d("LOG", "file: " + filename);
        // /data/data/com.example.pantts/files/tts.wav

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        tts = new TextToSpeech(this, this);
        tts.setOnUtteranceProgressListener(mProgressListener);
    }

    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.UK);
            hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, FILE_ID);

            // Using deprecated call for API 20 and earlier
            tts.synthesizeToFile(toSpeak, hashMap, filename);
            Log.d("LOG", "synthesizeToFile queued");
        }
    }

    private UtteranceProgressListener mProgressListener = 
            new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {
            Log.d("LOG", "synthesizeToFile onStart " + utteranceId);
        }

        @Override
        public void onError(String utteranceId) {
            Log.d("LOG", "synthesizeToFile onError " + utteranceId);
        }

        @Override
        public void onDone(String utteranceId) {
            if (utteranceId.equals(FILE_ID)) { // Thanks to Hoan Nguyen for correcting this
                Log.d("LOG", "synthesizeToFile onDone " + utteranceId);

                try {
                    File ttsFile = new File(filename);
                    FileInputStream inputStream = new FileInputStream(ttsFile);
                    FileDescriptor fileDescriptor = inputStream.getFD();
                    mediaPlayer.reset();
                    mediaPlayer.setDataSource(fileDescriptor);
                    inputStream.close();

                    mediaPlayer.prepare();
                    mediaPlayer.setVolume(0.0f, 1.0f); // right channel only
                    mediaPlayer.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };
}

【问题讨论】:

标签: android asynchronous io callback text-to-speech


【解决方案1】:

合成没有错,错的是比较。应该是

if (utteranceId.equals(FILE_ID))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2022-01-22
    • 2021-04-14
    • 2021-10-16
    相关资源
    最近更新 更多