java - 一个使用Java音频?

标签 java audio javasound wav

我正在构建一个语音合成器,除了音频之外,一切正常。我有一个存储为 .wav 文件的音素列表,我使用 AudioInputStreams 调用它们,但它们不会重复。我不知道可能是什么问题,所以任何帮助将不胜感激。 初始化一个充满手机的HashMap的代码是

       for(File phone : listOfFiles){
            String path = phone.getPath();
            if(path.startsWith(".")){continue;}
            path = path.replace(".wav", "").replace("phones/", "");
            AudioInputStream clip1 = AudioSystem.getAudioInputStream(phone);
            phonemes.put(path,clip1);
        }

组合并输出声音的代码是

public void speak(String[] input){
    AudioInputStream phrase = phonemes.get(input[0]);
    AudioInputStream phone;
    int x = input.length;
    for(int i=1; i<input.length; i++){
        phone = phonemes.get(input[i]);
        phrase = new AudioInputStream(new SequenceInputStream(phrase, phone), phrase.getFormat(), phrase.getFrameLength() + phone.getFrameLength());
    }
    try {
        Clip clip = AudioSystem.getClip();
        clip.open(phrase);
        clip.start();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

最佳答案

要重播剪辑,您必须停止它并重新定位它,然后启动它。我认为您无法关闭并重新打开给定的剪辑。但是尝试这样做应该会生成 LineUnavailable 异常,而您说没有异常。

为了排除故障,我首先验证是否可以播放 .wav 文件,然后再将它们放入哈希表中。有时,意外的格式(例如,24 位或 32 位编码,或大端而非小端)可能会导致 .wav 文件无法播放。

如果您尝试将一系列剪辑或音频数据连接到单个剪辑中,这也可能会出现问题。我认为 AudioInputStream 期望来自 .wav 文件的一组“ header ”数据,但 SequenceInputStream 实际上可能发送多个“ header ”,每个源文件一个。我以前从未见过这样的串联尝试。

您可能需要为每个音素的原始音频创建自己的数据存储,然后从中构建组合音素,而不是直接从 .wav 文件。不是加载到剪辑,而是将原始 PCM 从 AudioInputStream 加载到字节数组中。要输出原始音频字节,您可以使用 SourceDataLine。

关于java - 一个使用Java音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110658/

相关文章:

连接剪辑时音频漂移

iphone - 音频本地化

java - 在java中播放和查找音频文件

java - 如何使用 Java Sound 缓冲和播放 OGG 文件中的声音数据

java - 只能第一次从 TargetDataLine 记录

java - Spring Batch 输出到绝对文件路径

actionscript-3 - 使用链接从库中加载音频文件时出错

java - 如何在Java中进行HTTP认证?

java - 将 Property<Predicate<MyObject>> 绑定(bind)到 ListView(使用 SelectionMode.MULTIPLE)

java - 重新注入(inject) Spring Autowired 依赖项