- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最后你会看到错误信息!!
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
导入 Math3 以使用 fft。
import org.apache.commons.math3.complex.Complex;
import org.apache.commons.math3.transform.DftNormalization;
import org.apache.commons.math3.transform.FastFourierTransformer;
import org.apache.commons.math3.transform.TransformType;
public class AudioInput {
TargetDataLine microphone;
final int audioFrames= 8196; //power ^ 2
final float sampleRate= 8000.0f;
final int bitsPerRecord= 16;
final int channels= 1;
final boolean bigEndian = true;
final boolean signed= true;
byte byteData[]; // length=audioFrames * 2
double doubleData[]; // length=audioFrames only reals needed for apache lib.
AudioFormat format;
FastFourierTransformer transformer;
public AudioInput () {
byteData= new byte[audioFrames * 2]; //two bytes per audio frame, 16 bits
//doubleData= new double[audioFrames * 2]; // real & imaginary
doubleData= new double[audioFrames]; // only real for apache
transformer = new FastFourierTransformer(DftNormalization.STANDARD);
System.out.print("Microphone initialization\n");
format = new AudioFormat(sampleRate, bitsPerRecord, channels, signed, bigEndian);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object
if (!AudioSystem.isLineSupported(info)) {
System.err.print("isLineSupported failed");
System.exit(1);
}
try {
microphone = (TargetDataLine) AudioSystem.getLine(info);
microphone.open(format);
System.out.print("Microphone opened with format: "+format.toString()+"\n");
microphone.start();
}catch(Exception ex){
System.out.println("Microphone failed: "+ex.getMessage());
System.exit(1);
}
}
public int readPcm(){
int numBytesRead=
microphone.read(byteData, 0, byteData.length);
if(numBytesRead!=byteData.length){
System.out.println("Warning: read less bytes than buffer size");
System.exit(1);
}
return numBytesRead;
}
public void byteToDouble(){
ByteBuffer buf= ByteBuffer.wrap(byteData);
buf.order(ByteOrder.BIG_ENDIAN);
int i=0;
while(buf.remaining()>2){
short s = buf.getShort();
doubleData[ i ] = (new Short(s)).doubleValue();
++i;
}
//System.out.println("Parsed "+i+" doubles from "+byteData.length+" bytes");
}
public void findFrequency(){
double frequency;
Complex[] cmplx= transformer.transform(doubleData, TransformType.FORWARD);
double real;
double im;
double mag[] = new double[cmplx.length];
for(int i = 0; i < cmplx.length; i++){
real = cmplx[i].getReal();
im = cmplx[i].getImaginary();
mag[i] = Math.sqrt((real * real) + (im*im));
}
double peak = -1.0;
int index=-1;
for(int i = 0; i < cmplx.length; i++){
if(peak < mag[i]){
index=i;
peak= mag[i];
}
}
frequency = (sampleRate * index) / audioFrames;
System.out.print("Index: "+index+", Frequency: "+frequency+"\n");
}
/* * 打印第一个频率档以了解我们拥有的分辨率 */
public void printFreqs(){
for (int i=0; i<audioFrames/4; i++){
System.out.println("bin "+i+", freq: "+(sampleRate*i)/audioFrames);
}
}
public static void main(String[] args) {
AudioInput ai= new AudioInput();
int turns=10000;
while(turns-- > 0){
ai.readPcm();
ai.byteToDouble();
ai.findFrequency();
}
//ai.printFreqs();
}
}
以下是控制台中包含错误消息的内容:
麦克风初始化麦克风打开格式:PCM_SIGNED 8000.0 Hz,16 位,单声道,2 字节/帧,big-endian
Exception in thread "main" org.apache.commons.math3.exception.MathIllegalArgumentException: 8.196 is not a power of 2, consider padding for fix
at org.apache.commons.math3.transform.FastFourierTransformer.transformInPlace(FastFourierTransformer.java:229)
at org.apache.commons.math3.transform.FastFourierTransformer.transform(FastFourierTransformer.java:375)
at AudioInput.findFrequency(AudioInput.java:88)
at AudioInput.main(AudioInput.java:126)
最佳答案
8196 不是 2 的幂。尝试将变量 audioFrames
更改为 final int audioFrames= 8192;
。 FFT 算法只能处理大小为 2 的幂的数组(2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, ...)
关于java - 我的应用程序 "find frequency of audio input from microphone"总是崩溃。但为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666623/
WebAudio 允许通过 navigator.getUserMedia() 访问麦克风。调用此方法时,浏览器会显示一个重新编码标志(Chrome 和 Edge 中的红点),表明麦克风正在使用中。这工
首先,我正在做一个小项目来查看一些声音的频谱。 我用麦克风做了这个: alt text http://img25.imageshack.us/img25/4271/spectrumanalyzerfo
我是开发用于飞行模拟的应用程序的团队的一部分。这些应用程序之一也正在MacOS上运行,并且需要访问麦克风才能与在线虚拟空中交通管制进行通信。 从MacOS 10.14开始,麦克风访问不再起作用。过去,
在 macbook air 64 位上运行以下代码,在 python 2.7 和 python 3.4 上测试代码 import speech_recognition as sr r = sr.Rec
是否可以访问 watch 麦克风并处理实时音频流以获得特定信息(分贝级别和当前频率)?我知道可以使用 swift presentAudioRecorderController 在 watch 上录制音
我目前正在使用 MediaRecorder用于在应用程序内录制音频的 API。 有没有办法从多个输入设备(比如两个麦克风)进行录音? 我可以使用 mediaDevices.enumerateDevic
我正在使用 Sinch javascript SDK 构建一个浏览器到浏览器的视频通话应用程序。当在 chrome 中调用 call.hangup(); 结束视频通话时(至少),红色相机图标仍然可见,
我知道 AVAudioRecorder 类,但我想知道如何(使用 Monotouch)捕获麦克风输入,以便将其流式传输到远程服务器。 AVAudioRecorder 类允许您将流保存到本地文件。有没有
使用 Java,我正在尝试从默认麦克风录制声音并显示当前音量和静音状态(在操作系统级别设置,如果可能的话对检查字节不感兴趣)。到目前为止,我可以使用以下代码获取 TargetDataLine 并记录到
所以我想知道从默认麦克风读取数据并输出到默认扬声器的最短(就有效线路而言)开放 AL 代码是什么? 我在 Visual Studio 2008 下的 windows 7 上开发 最佳答案 一个古老的问
我的主要目标是拥有一个程序,它允许我在 Windows 下使用“滚动锁定”键将我的麦克风静音/取消静音。由于键盘上的滚动锁定灯,这将给我一个很好的指示器,指示麦克风是否静音。 如何获取有关麦克风状态的
我想用 Phaser 3 做一个音频输入可视化器,我想把麦克风输入到着色器,但我找不到让它工作的方法。 我对着色器有基本的了解,我可以处理图像纹理,但我真的不知道如何提供声音。我检查了一个用 thre
为了使用 Protractor 进行测试,我需要在没有麦克风的计算机上模拟来自麦克风的音频输入。 通过使用“--use-fake-device-for-media-stream”标志,Chrome可以
在 Android Studio 中,我创建了一个模拟器......avdmanager create avd --force --name testAvd --abi google_apis_pla
我有一个基于 Wowza 的 webcam.fla 示例的网络摄像头流应用程序。该应用程序将音频和视频从 Flash 传输到 Wowza 服务器,并在其中进行转码等。 我们正在尝试添加一项功能,允许将
我认为 Java Sound API 存在性能(延迟)问题。 音频监视器 下面的代码确实对我有用。它正确地打开麦克风,并通过我的扬声器实时输出音频输入(即监听)。但我担心的是播放速度......从我对
我正在学习 html5,想尝试在扬声器上播放我在麦克风上所说的内容。于是我写了如下js代码: navigator.getUserMedia = navigator.getUserMedia ||nav
我在 iOS 上使用 flex 移动应用程序时遇到问题。这是一个带有 red5 服务器的视频聊天应用程序。 视频效果不错,但声音回声很大!我尝试使用 getEnhancedMicrophone() 但
以下是我正在使用的权限 我的 list 中没有麦克风权限,那为什么 playstore 在安装应用程序时要求“麦克风”权限 最佳答案 虽然 dmitriyzaitsev 的回答是
我有一个 super 简单的网页,它使用 Web Speech API这样我就可以更轻松地与我妈妈(她是聋子)交流。 Google 的语音识别速度足够快,我可以与她实时交谈(她会读取虚拟现实结果)。
我是一名优秀的程序员,十分优秀!