java - 在java中计算实时音频

标签 java audio voice frequency javasound

我在计算麦克风音频输入的语音输入频率时遇到问题。谁能帮我解决这个问题?

我应该从麦克风获取音频输入并计算其频率。

这是我的代码,只是为了展示我是如何做到的;以及是否有人可以识别错误的实现。

package STLMA;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


/**
 *
 * @author CATE GABRIELLE
 */

import java.io.*;
import javax.sound.sampled.*;

public class SpeechDetection {
boolean stopCapture = false;
ByteArrayOutputStream byteArrayOutputStream;
TargetDataLine targetDataLine; // This is the object that acquires data from
                               // the microphone and delivers it to the program

// the declaration of three instance variables used to create a SourceDataLine
// object that feeds data to the speakers on playback
AudioFormat audioFormat;    
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;    

double voiceFreq = 0;    

FileOutputStream fout;
AudioFileFormat.Type fileType;
public static String closestSpeaker;

public SpeechDetection(){
    captureAudio();
}       

private void captureAudio(){
    try{
        audioFormat = getAudioFormat();
        DataLine.Info dataLineInfo = new   
         DataLine.Info(TargetDataLine.class,audioFormat);
        // object that describes the data line that we need to handle the acquisition 
        // of the audio data from the microphone. The first parameter makes the audio 
        // data readable
        targetDataLine = (TargetDataLine)AudioSystem.getLine(dataLineInfo);
         //  object to handle data acquisition 
        targetDataLine.open(audioFormat);                 
           //from the microphone that matches 
        targetDataLine.start();                            
         // the information encapsulated in the DataLine.Info object  
        Thread captureThread = new Thread(new CaptureThread());
        captureThread.start();
    } catch (Exception e) {
    System.out.println(e);
    System.exit(0);
    }
}    

private AudioFormat getAudioFormat(){
    float sampleRate = 8000.0F; // The number of samples that will be acquired 
    //8000,11025,16000,22050,44100  each second for each channel of audio data.
    int sampleSizeInBits = 16; //The number of bits that will be used to 
    //8,16                        describe the value of each audio sample.
    int channels = 1;           // Two channels for stereo, and one channel for mono.
    //1,2
    boolean signed = true;      // Whether the description of each audio sample 
    //true,false        
     //consists of both positive and negative values, or positive values only.          
    boolean bigEndian = false;
    //true,false
    return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);        
}

//Inner class to capture data from microphone
class CaptureThread extends Thread {
    byte tempBuffer[] = new byte[8000];  
    // byte buffer variable to contain the raw audio data
    int countzero;                      
     // counter variable to count the number of zero's               
    short convert[] = new short[tempBuffer.length]; 
    // short variable that is appropriate to 

    // collect the audio input for porcessing

    //        public void start(){
    //            Thread voices = new Thread(this);
    //            voices.start();
    //        }

    @Override
    public void run(){               
   // a continuous thread to process the continuous audio input
        byteArrayOutputStream = new ByteArrayOutputStream(); // the object to write the 

    // raw audio input to the byte buffer variable
        stopCapture = false;
        try{
            while(!stopCapture){                    
                int cnt = targetDataLine.read(tempBuffer,0,tempBuffer.length); 
            // reads the raw audio input 

             // and returns the number of bytes actually read
                byteArrayOutputStream.write(tempBuffer, 0, cnt); 
            // writing the number of bytes read to the 
                                                                 // container                 
                try{ 
                    countzero = 0; 

                    for(int i=0; i < tempBuffer.length; i++){  
                // the loop that stores the whole audio data                                        
                        convert[i] = tempBuffer[i];    
                // to the convert variable which is a short data type,
                        if(convert[i] == 0){countzero++;}     
                 // then counts the number of zero's 
                    }
                    voiceFreq = (countzero/2)+1;               
                // calculates the number of frequency and 
                                    // stores to the voiceFreq variable
                    if(voiceFreq>=80 && voiceFreq<=350)
                        System.out.println("Voice"+voiceFreq);
                    else
                       System.out.println("Unvoice"+voiceFreq);
                }catch(StringIndexOutOfBoundsException e)  
                {System.out.println(e.getMessage());}                                                                                    
                    Thread.sleep(0);                                        
            }
        byteArrayOutputStream.close();
        }catch (Exception e) {
            System.out.println(e);
            System.exit(0);
        }
    }
}           

public static void main(String [] args){
    SpeechDetection voiceDetector1 = new SpeechDetection();        
    //        voiceDetector1.setSize(300,100);
    //        voiceDetector1.setDefaultCloseOperation(EXIT_ON_CLOSE);
    //        voiceDetector1.setVisible(true);
}



}

顺便说一句,“voiceFreq”代表语音频率。 我的目标是了解输入是语音还是噪音。 我希望有人能帮助我解决我的问题。谢谢你,新年快乐。

最佳答案

我认为,为了检测某物是潜在的声音还是噪音,人们会想对一段数据进行 FFT,看看频率分量是否在“正常声音”的某个范围内。

也许见 Reliable and fast FFT in Java一些 FFT 信息。

关于java - 在java中计算实时音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8712650/

相关文章:

android - 通过蓝牙流复制后损坏的音频文件

audio - 有没有可以从音频文件(mp3)创建波形图像的库?

java - Eclipse RCP - 使用片段提供翻译

java - Spring - 根据限定符值动态注入(inject)

java - SpringBoot - BeanDefinitionOverrideException : Invalid bean definition

javascript - Jplayer 音频在 Firefox、Opera 和 IE 中不工作,但在 Chrome 中工作

android - 使用Android语音识别时保存音频文件

c - 为什么下面的代码中有段错误

sockets - 将来自 Hololens 的麦克风语音输入发送到 PC

java - 声明一个弱引用数组?