java 也能直接操作硬件?(不通过*.c, *.cpp 等)
卡内基梅隆的 sphinx 是用java写的语音识别程序。语音识别程序一般要和硬件有交互, 但sphinx包中却见不到*.c,*.cpp,*.dll,*.jni等格式文件. java 也能直接操作硬件? 这是怎么回事呢?
卡内基梅隆的 sphinx 是用java写的语音识别程序。语音识别程序一般要和硬件有交互, 但sphinx包中却见不到*.c,*.cpp,*.dll,*.jni等格式文件. java 也能直接操作硬件? 这是怎么回事呢?
而Java可没提供让你直接调用驱动的方法。这个实现最终还是得去调用本地方法。如GUI,IO等等,这些的最底层,都是调用本地函数的。楼主所说的语音识别,不就是从声音的输入设备读取数据吗,Java的标准库就提供了一些方法。如下面一个程序,即时录音并输出。import java.io.*;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.TargetDataLine;
public class RecordAndPlay {
volatile int divider;
public RecordAndPlay(){
Play();
}
public static void main(String[] args) {
new RecordAndPlay();
}
//播放音频文件
public void Play() { try {
AudioFormat audioFormat =
// new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100F,
// 8, 1, 1, 44100F, false);
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,
44100F, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class,
audioFormat);
TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
SourceDataLine sourceDataLine;
info = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
sourceDataLine.open(audioFormat);
targetDataLine.start();
sourceDataLine.start();
FloatControl fc=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
double value=0.2;
float dB = (float)(Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);
fc.setValue(dB);
int nByte = 0;
final int bufSize=1024;
byte[] buffer = new byte[bufSize];
while (nByte != -1) {
//System.in.read();
nByte = targetDataLine.read(buffer, 0, bufSize);
sourceDataLine.write(buffer, 0, nByte);
}
sourceDataLine.stop(); } catch (Exception e) {
e.printStackTrace();
}
}
}
1)你的意思是:
Java的标准库就提供了一些方法, 这些标准库不光只是Java写的, 还有许多本地方法(C/C++实现的).import java.io.*;
import javax.sound.sampled.AudioSystem;等库中,应包含许多本地方法(C/C++实现的).2) 看样子,编译生成这些包import java.io.*, 还很费事.
android上的应用也是java写的.import android.speech.xxxx;
android.speech包源码中有以下:----------------------------------------------------------------------------
System.loadLibrary("srec_jni"); //究竟是dll还是so, 由系统判断. // AudioRecord JNI interface
// //对调用的方法做本地声明
private static native int AudioRecordNew(int sampleRate, int fifoDepth);
private static native int AudioRecordStart(int audioRecord);
----------------------------------------------------------------------------
请问,srec_jni 在系统什么目录(地方)可以找到?