0

我做了一个可以从我的电脑捕捉声音的小应用程序。系统的简单过程是当我播放音乐文件时,它会捕捉声音,当我播放捕捉到的东西时,它会播放。完全一切正常。现在我想做的是我想打印回放。假设我捕捉到像“嗨,早上好”这样的声音,现在当我按下播放时,它应该必须以文本形式打印录制的内容。捕获和回放编码如下。

private void captureAudio() {
    try {
        final AudioFormat format = getFormat();
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
        line.open(format);

        line.start();
        Runnable runner = new Runnable() {
            int bufferSize = (int) format.getSampleRate() * format.getFrameSize();
            byte buffer[] = new byte[bufferSize];

            public void run() {

                out = new ByteArrayOutputStream();
                running = true;
                try {
                    while (running) {
                        int count = line.read(buffer, 0, buffer.length);
                        if (count > 0) {
                            out.write(buffer, 0, count);
                        }                            
                    }
                    out.close();
                } catch (IOException e) {
                    System.err.println("I/O problems: " + e);
                    System.exit(-1);
                }
            }
        };
        Thread captureThread = new Thread(runner);
        captureThread.start();
    } catch (LineUnavailableException e) {
        System.err.println("Line unavailable: " + e);
        System.exit(-2);
    }
}  


private void playAudio() {
    try {
        byte audio[] = out.toByteArray();

        InputStream input = new ByteArrayInputStream(audio);
        final AudioFormat format = getFormat();
        final AudioInputStream ais = new AudioInputStream(input, format, audio.length / format.getFrameSize());
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        final SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
        line.open(format);
        line.start();
        Runnable runner = new Runnable() {
            int bufferSize = (int) format.getSampleRate() * format.getFrameSize();
            byte buffer[] = new byte[bufferSize];

            public void run() {

                try {
                    int count;
                    while ((count = ais.read(buffer, 0, buffer.length)) != -1) {
                        if (count > 0) {
                            line.write(buffer, 0, (char)count);
                            System.out.print((char)count);

                        }
                    }
                    line.drain();
                    line.close();
                } catch (IOException e) {
                    System.err.println("I/O problems: " + e);
                    System.exit(-3);
                }
            }
        };
        Thread playThread = new Thread(runner);
        playThread.start();
    } catch (LineUnavailableException e) {
        System.err.println("Line unavailable: " + e);
        System.exit(-4);
    }
}  

请有人建议/帮助我克服这一点。
谢谢你。

4

1 回答 1

1

看看CMU 狮身人面像!为了能够将捕获的音频转换为语音,您可以使用 Sphinx api。但是请注意,语音识别的准确性对您没有太大帮助,因为系统仍在开发中。在 android 中,您可以使用来自google的语音识别,它具有相当的准确性。但这仍然不会将您捕获的语音转换为语音具有所需的精度。所以最好有一个固定的歌词文本,以播放音频的速度显示。

希望有帮助!!

于 2013-07-26T10:55:35.827 回答