【问题标题】:How to make TextToSpeech speak faster?如何让 TextToSpeech 说得更快?
【发布时间】:2015-11-14 08:13:28
【问题描述】:

我正在使用TextToSpeech 开发节拍器应用程序。我还创建了一个Metronome 类来处理所有这些东西(这是完整的代码。但我会告诉你稍后关注哪里):

public class Metronome {
    private static final int DEFAULT_BPM = 115;
    private Timer timer;
    private int tempo;
    private int maxBeats;
    private int currentBeat;
    private BeatDivider inBeat;
    private BeatType beatType;

    private TextToSpeech tts;

    public void setMaxBeats(int maxBeats) {
        this.maxBeats = maxBeats;
    }

    public void setTempo (int tempo) {
        timer.setInterval (getMillisecondsFromBpm (tempo, beatType));
        this.tempo = tempo;
    }

    public void setBeatType (BeatType type) {
        beatType = type;
        setTempo (tempo);
    }

    public int getMaxBeats() {
        return maxBeats;
    }

    public BeatDivider getInBeat() {
        return inBeat;
    }

    public int getTempo () {
        return tempo;
    }

    public void reset () {
        if (!timer.isPaused ())
            throw new IllegalStateException ("Timer cannot be running when reset");

        inBeat = BeatDivider.ON_BEAT;
        currentBeat = 1;
    }

    public void start () {
        timer.startTimer ();
    }

    public void stop () {
        timer.stopTimer ();
        reset ();
    }

    public boolean isRunning () {
        return !timer.isPaused ();
    }

    public Metronome (Context c) {
        timer = new Timer (new Runnable () {
            @Override
            public void run() {
                beep ();
                increment ();
            }
        }, getMillisecondsFromBpm (DEFAULT_BPM, BeatType.QUARTER), false);
        tts = new TextToSpeech (c, new TextToSpeech.OnInitListener () {
            @Override
            public void onInit(int status) {

            }
        });
        tts.setSpeechRate (2);
        setBeatType (BeatType.QUARTER);
        setMaxBeats (4);
        setTempo (DEFAULT_BPM);
    }

    private int getMillisecondsFromBpm (int bpm, BeatType type) {
        int ms = (int)Math.pow (bpm / 60.0, -1) * 1000;

        switch (type) {
            case QUARTER:
                return ms;
            case EIGHTH:
                return ms / 2;
            case SIXTEENTH:
                return ms / 4;
        }

        return ms;
    }

    private void increment () {
        if (beatType == BeatType.QUARTER) {
            incrementBeat ();
        } else if (beatType == BeatType.EIGHTH) {
            incrementEighth ();
        } else if (beatType == BeatType.SIXTEENTH) {
            incrementSixteenth ();
        }
    }

    private void incrementSixteenth() {
        switch (inBeat) {
            case E:
                inBeat = BeatDivider.AND;
                break;
            case A:
                inBeat = BeatDivider.ON_BEAT;
                incrementBeat ();
                break;
            case ON_BEAT:
                inBeat = BeatDivider.E;
                break;
            case AND:
                inBeat = BeatDivider.A;
        }
    }

    private void incrementEighth() {
        switch (inBeat) {
            case E:
            case ON_BEAT:
                inBeat = BeatDivider.AND;
                break;
            case A:
            case AND:
                inBeat = BeatDivider.ON_BEAT;
                incrementBeat ();
                break;
        }
    }

    private void incrementBeat() {
        inBeat = BeatDivider.ON_BEAT;
        if (currentBeat < maxBeats) {
            currentBeat++;
        } else {
            currentBeat = 1;
        }
    }

    private void beep () {
        tts.speak (getBeatString (), TextToSpeech.QUEUE_FLUSH, null);
    }

    private String getBeatString () {
        switch (inBeat) {
            case ON_BEAT:
                default:
                return Integer.toString (currentBeat);
            case E:
                return "e";
            case AND:
                return "and";
            case A:
                return "Ah";
        }
    }

    public enum BeatDivider {
        ON_BEAT,
        E,
        AND,
        A
    }

    public enum BeatType {
        QUARTER,
        EIGHTH,
        SIXTEENTH
    }
}

解释:

Timer 类只是按照它所说的去做。这是我的自定义实现。那里应该没有问题。这个想法是,用户可以设置速度(tempo)、拍号(maxBeats)和音符类型(BeatType)。对于四分音符,它像 1 2 3 4,对于八分音符,它像 1 和 2 以及 3 和 4 等等。 TextToSpeech 会说出这些话。

问题:

当我将 bpm 增加到 80 或 90 时,tts 不会说话!不知何故,当我降低 bpm 时,它就像 1 3 1 3 1 3。原因是它说得太慢了。

我尝试解决它:

因为我觉得它说话慢,所以我把语速调到了4。但是同样的事情又发生了!然后我尝试使用QUEUE_ADD 而不是QUEUE_FLUSH。当我将 bpm 从 60 增加到 150 时,tts 仍然以初始速度说话!然后我试着按了停止键,但是之后tts还是一直在说啊啊啊啊啊直到我finish()活动!

我真的很想知道如何解决这个问题。我想减少演讲之间的时间是我需要做的。但是怎么做?或者如果我用“哔”声替换tts并使用MediaPlayer,会出现这种情况吗?

【问题讨论】:

    标签: java android queue text-to-speech


    【解决方案1】:

    你可以通过 tts.setPitch(1) 改变速度;和 tts.setSpeechRate(2);

    【讨论】:

    • 我试图这样做,但它只会增加说单词的速度,而不是演讲之间的间隔。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2022-12-01
    • 2011-10-23
    • 2016-09-09
    • 2018-02-11
    • 1970-01-01
    • 2010-11-06
    • 2023-03-26
    相关资源
    最近更新 更多