Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个使用Java音频?_Java_Audio_Javasound_Wav - Fatal编程技术网

一个使用Java音频?

一个使用Java音频?,java,audio,javasound,wav,Java,Audio,Javasound,Wav,我正在构建一个语音合成器,除了音频,其他一切都可以工作。我有一个存储为.wav文件的音素列表,我用AudioInputStreams调用它们,但它们不会重复。我不知道会是什么问题,所以任何帮助都将不胜感激。 初始化充满电话的HashMap的代码是 for(File phone : listOfFiles){ String path = phone.getPath(); if(path.startsWith(".")){continue

我正在构建一个语音合成器,除了音频,其他一切都可以工作。我有一个存储为.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();
    }

}
public void speak(字符串[]输入){
AudioInputStream短语=phonemes.get(输入[0]);
音频输入流电话;
int x=输入长度;

对于(int i=1;i要重播某个剪辑,您必须停止它并重新定位它,然后启动它。我认为您无法关闭和重新打开给定的剪辑。但是尝试这样做应该会生成LineUnavailable异常,并且您说您没有异常

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

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


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

什么错误或异常你明白了吗?没有错,他们就是不玩。