java - 在声音阵列中随机播放单词对

标签 java audio

我的目标是播放“这是测试”这句话的双音(成对),这是WAV音频文件。到目前为止,我已经成功生成了一个随机的短语序列,例如“Test is this a”,但是我需要使它仅成对出现,因此“This is” ...“Is a”。 ,每个字之间的暂停时间为100毫秒,每对之间的暂停时间为400毫秒。到目前为止,这就是我所拥有的...

public void playDoublets(int numDoublets) throws InterruptedException {
    ArrayList<Sound> list = new ArrayList();
    for (int i =0; i < numWords; i++){
        list.add(new Sound(myWordArray[i]));
    }
    Collections.shuffle(list);
    for (int i = 0; i < numWords; i++){
        list.get(i).blockingPlay();
        Thread.sleep(400);
    }
}

numDoublets是程序播放多少对,但是我不知道在上面的代码中将在哪里实现。到目前为止,所有这些代码仅输出所有4个单词,而不是成对打印。

最佳答案

您应该在要播放的声音列表中明确表示一个暂停。使用界面可以同时处理正常声音和暂停。

import java.util.*;

public class DoubletPlayer {
    private static final int PAUSE_BETWEEN_WORDS = 100;
    private static final int PAUSE_BETWEEN_DOUBLETS = 400;

    public static void main(String... args) {
        DoubletPlayer player = new DoubletPlayer();
        player.playDoublets(2);
    }

    interface Playable {
        void play();
    }

    class Sound implements Playable {
        private String word;

        public Sound(String word) {
            this.word = word;
        }

        @Override
        public void play() {
            System.out.println("sound played: " + word);
        }
    }

    class Pause implements Playable {
        private int millis;

        public Pause(int millis) {
            this.millis = millis;
        }

        @Override
        public void play() {
            System.out.println("pause of " + millis + "ms");
        }
    }

    private List<Sound> sounds = new ArrayList<>();
    private int currentSound = 0;

    public DoubletPlayer() {
        sounds.add(new Sound("This"));
        sounds.add(new Sound("is"));
        sounds.add(new Sound("a"));
        sounds.add(new Sound("test"));

        Collections.shuffle(sounds);
    }

    public void playDoublets(int numDoublets) {
        List<Playable> doublets = generateDoublets(numDoublets);
        playAll(doublets);
        reset();
    }

    private List<Playable> generateDoublets(int numDoublets) {
        List<Playable> result = new ArrayList<>();
        for (int i = 0; i < numDoublets; i++) {
            addDoubletTo(result);
        }
        return result;
    }

    private void addDoubletTo(List<Playable> result) {
        result.add(getNextSound());
        result.add(new Pause(PAUSE_BETWEEN_WORDS));
        result.add(getNextSound());
        result.add(new Pause(PAUSE_BETWEEN_DOUBLETS));
    }

    private Playable getNextSound() {
        return sounds.get(currentSound++);
    }

    private void playAll(List<Playable> result) {
        for (Playable playable : result) {
            playable.play();
        }
    }

    private void reset() {
        currentSound = 0;
    }
}

关于java - 在声音阵列中随机播放单词对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39823657/

相关文章:

audio - ffmpeg - 制作干净的 WAV 文件

java - 如何使用 Vaadin 创建交互式图形?

java - 使用 JPQL 通过 UCanAccess 驱动程序查询 MS-Access 数据库

java - 调用函数: two times or storing the result in a variable?哪个更好

Java swing 如何启用 JScrollPane 的拖动/导出​​选项

javascript - 带有jQuery的音频html5播放下一首轨道

java - 自定义 View ... 覆盖 onTouchEvent 但不覆盖 performClick

java - 通过 SourceDataLine.write 播放声音 - 如何使用具有 double 值的 byte[]-Buffer

actionscript-3 - AS3和麦克风类

java - 如何使用 Java 在 wav 文件的末尾消除静音?