sphinx4的Microphone

来源:互联网 发布:sql数据库管理工具 编辑:程序博客网 时间:2024/05/20 07:53

public class Microphoneextends BaseDataProcessor



本类的作用是,捕捉原始的语音信号,并对语音信号进行数字化处理,以便转换成数字信号。是front-end的第一输入可选输入信号处理单元之一。会把所有得到的数据放入列队缓存中。数据是以在前面为开始信号中间为doubledata数据后为结束信号的形式存储的。即此形式为一基本单元,可有多个单元。本类其实对数据进行了分块,这是通过依次读取多少秒的数据来完成的。

注释翻译:本类从系统的音频输入系统中捕捉音频数据。把这些音频数据转换成Data类对象。通过调用startRecording方法,一个新的线程被创建用来捕捉音频数据。调用stopRecording方法,将会停止捕捉音频数据。调用getData方法,将会以Date对象的形式返回捕捉的音频数据。Microphone会尽量获得在配置中设置的格式的音频设备,但是如果此格式的音频设备不能被获得,那么它会获得一个采样率更高的音频设备,此设备的其它格式参数(通道,字节顺序,sample size, sign)会保持一样。如果在不能获得此设备的话,Microphone会标记一个错误,并且startRecording返回为false。

本类的属性

1, 用来通过annotation获得默认设置的字符串属性:

@S4Integer(defaultValue = 16000)

public static final String PROP_SAMPLE_RATE =“sampleRate”;采样速率默认为16000。即每毫秒16个采样点。

@S4Boolean(defaultValue = true)

 public final static String PROP_CLOSE_BETWEEN_UTTERANCES =“closeBetweenUtterances”;用来确定在两utterances之间,Microphone是否会释放音频设备。在linux系统中由于关闭和重新启动音频不能能够很好的工作,因此其默认值为false,其它系统一般为true。

@S4Integer(defaultValue = 10)

public final static String PROP_MSEC_PER_READ =“msecPerRead”;用来确定每次从Java Sound audio device读取多少毫秒的音频数据。默认为10毫秒

@S4Integer(defaultValue = 16)

public static final String PROP_BITS_PER_SAMPLE =“bitsPerSample”;用来确定每个采样点用多少位来表示。默认为16位。

@S4Integer(defaultValue = 1)

public static final String PROP_CHANNELS =“channels”;用来确定多少个通道,默认为一个。

@S4Boolean(defaultValue = true)

public static final String PROP_BIG_ENDIAN =“bigEndian”;用来确定系统的的字节顺序。默认为大字节顺序。

@S4Boolean(defaultValue = true)

public static final String PROP_SIGNED =“signed”;用来确定采样量化后得到的是有符号数,还是无符号数。默认为每个采样点用有符号数表示。

@S4Boolean(defaultValue = false)

public final static StringPROP_KEEP_LAST_AUDIO =“keepLastAudio”;用来确定是否保存(持)一个utterance的音频数据直到下一utterance被记录为止。

@S4String(defaultValue = “average”, range = {“average”,“selectChannel”})

public final static String PROP_STEREO_TO_MONO =“stereoToMono”;用来确定怎样从立体声(通道)转到单声道(通道)。可能的值为“average”,即对来自每个通道的采样的平均值,若为“selectChannel”即仅从你选择的那个通道选取音频,这需确定selectChannel属性来确定你选择的通道。

 

S4Integer(defaultValue = 0)

public final static String PROP_SELECT_CHANNEL =“selectChannel”;即选择通道,如果音频为立体声你需确定要使用的通道。默认为0值。

@S4String(defaultValue = “default”)

public final static String PROP_SELECT_MIXER =“selectMixer”;用来确定混频器。可以为default即让AudioSystem(音频系统)决定。为“last”即选择AudioSystem支持的最后的那个混频器。

@S4Integer(defaultValue = 6400)

public final static String PROP_BUFFER_SIZE =“bufferSize”;用来确定用于存储记录的音频采样数据的缓存的长度。默认为200ms。如果解码线程对结果(result)能够很快的处理,则小的值能够减少帧的丢失。为字节的大小,默认为6400个字节,

2,  其余属性:

private AudioFormatfinalFormat;private AudioInputStreamaudioStream;private TargetDataLineaudioLine;privateBlockingQueue<Data>audioList(列队用于存储本类所捕捉的所有音频数据包括信号和非信号数据);private Utterance currentUtterance;private boolean doConversion;privatevolatile booleanrecording; privatevolatile booleanutteranceEndReached = true;private RecordingThreadrecorder;

以下为Configuration data,配置属性:

private AudioFormatdesiredFormat;privateboolean closeBetweenUtterances;privateboolean keepDataReference;privateboolean signed;private booleanbigEndian;privateint frameSizeInBytes;privateint msecPerRead;

private int selectedChannel;private StringselectedMixerIndex;private StringstereoToMono;privateint sampleRate;privateint audioBufferSize;

本类的构造方法:

public Microphone():空的构造方法什么也不做。

public Microphone(int sampleRate,int bitsPerSample, int channels,

boolean bigEndian,boolean signed, boolean closeBetweenUtterances,int msecPerRead, boolean keepLastAudio,StringstereoToMono,int selectedChannel, String selectedMixerIndex,int audioBufferSize) :非空构造方法,对类及其的属性进行了必要的初始化。

本类的方法:

1, voidnewProperties(PropertySheet ps):当需要对属性重新(设置)配置时调用。

2,  void initialize():进行java声音采集的相关准备工作的处理。如:AudioFormat,DataLine.Info,audioList =newLinkedBlockingQueue<Data>()(用来存储Data数据),AudioSystem。

3,  Mixer getSelectedMixer():从系统获得想要的混频器(即设定的)。

4, TargetDataLine getAudioLine():从系统或的想要TargetDataLine,并为其设置监听。

5,  boolean open():本方法设置了目标线路的格式,缓存大小(默认为6400字节即200ms),得到了目标线路的音频输入流,得到了每次读取多少秒(默认为10ms)的音频数据,得到了帧的大小以字节为单位,默认为320个字节。

6,  AudioFormat getAudioFormat():获得最终的microphone记录的音频格式,可能与在配置的格式不相同(即采样率可能变大)。

7,  Utterance getUtterance():或当前的Utterance。什么是Utterance?

8,  booleanisRecording():microphone正在记录返回为真,否则为false。

9,  synchronizedboolean startRecording():本方法起作用需:目标线路是开启的,

microphone没有在记录语音。utteranceEndReached设置为false,新建了一个用来记录语音的recorder线程,并调用了线程的start方法开始记录输入语音。并设置标志recordingtrue。本方法是线程安全的。

10,synchronized void stopRecording():通过调用recorder的stopRecording来停止记录音频,然后把recorder设置为null,recording标志设置了false  。

11,class RecordingThreadextends Thread  :定义了一个内部线程类,此类用来记录音频   。此类有四个属性为:booleandone; volatile boolean started;   longtotalSamplesRead;,longtotalSamplesRead;

此类的构造方法:           

RecordingThread(String name)    :给本新线程类命名,为name。

此类的方法:

 void start();本方法设置started标志位false。然后调用了Threadstart方法,在调用了waitForStart的方法。将会真正的启动一个线程。即会运行run方法。

 void stopRecording();停止线程,本方法停止记录,并且当所有的数据在音频线路中都被读取本方法才会返回。本方法首先调用audioLine.stop();,后lock.wait();会一直等待直到线程锁lock的被通知才会返回。

  public void run();本法会记录输入的自然语音音频,并放入缓存中。开始总的赌气的采样数为0,根据是否保存一个utterance的音频数据,直到下一个utterance的被记录为止,如果要的话,会创建一个当前的utterance对象。在线路start()开始前,往microphone的缓存列队中audioList存入来一个DataStartSignal的信号。在线路的start()开始后,会连续的从线路中读取数据,以DoubleData对象的形式存入microphone的缓存列队之中,直到从线路中没有可读取的音频数据为止。读取完后,会往microphone的缓存列队中存入一个DataEndSignal信号。也会调用了线路的flush(),方法把线路刷新缓存的中的内容,其内容全部丢弃。如果closeBetweenUtterances为真,则会显示关闭线路输出流和线路。

private synchronized void waitForStart():如started为假(即还没有从线路输出流中读取数据),则waitForStart方法会一直等待,直到其为真。

                                                                                                                      

12, void clear():清除microphone缓存列队中的所有音频数据即audioList.clear()。

13,Data getData():本方法会打印获得Data的所需时间,本方法获得的Data为一个utterance。本方法从列队中读取其头部,如果列队为空的话会一直等待下去直到有可用的为止,并且如果utteranceEndReached为假,它会一直从列队中读取一个Data,放入output中,最后读取的data为DataEndSignal,放入Date中。本方法会打印出获得最后data所需的时间。

14,private DatareadData(Utterance utterance):从utterance中读取数据。如keepDataReference为真,会把10ms采样音频数据放入一个utterance中。不管怎样,本方法会一次把一帧的采样数据放入一个DoubleData中,即一个DoubleData会存储了一般为10ms的采样后的语音信号,即为一帧短时平稳的语音信号。实际的存储的数量可以小于一帧的数量,但是其必须能过被一帧的数量所整除。在本法中会设置startedtrue,如果需要会进行音频数据会进行适当的格式变换,如: 在(bigEndian)情况下,在通道数大于1的情况下,在。。。。。 

15privatedouble[]convertStereoToMono(double[] samples,int channels):本方法,本方法把立体声转换为单声道声。要确保samples的长度是channels的整数倍n。当stereoToMono.equals(”average”):返回的数据的长度了n,即为samples于channes的整除数,当average时,返回数组中的第一个数位为在sample中第一个channel个长度的值的和来除以channels,返回数组的第二个数以此类推即可的,直到第n个为止。对于stereoToMono.equals(”selectChannel”);当selectChannel时,找到samples第一个n中的所选的Channel。把此所选的Channel的对应值,放入输出数组中的第一个数的位置,把selectChannel中的所选的第个Channel的位置加n后,把对应的值放入输出的第二个数的位置。以此类推直到n为止。

16publicboolean hasMoreData():返回为!(utteranceEndReached &&audioList.isEmpty());。达到一个utterance没有结束,并且microphone的缓存列表中有数据则返回为true。

 

 

转自:http://blog.csdn.net/taiyb/article/details/39588281

原创粉丝点击