sphinx4的Microphone

public class Microphone extends 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 AudioFormat finalFormat;private AudioInputStream audioStream;private TargetDataLine audioLine;privateBlockingQueue<Data> audioList(列队用于存储本类所捕捉的所有音频数据包括信号和非信号数据); private Utterance currentUtterance;private boolean doConversion;private volatile boolean recording; private volatile boolean utteranceEndReached = true;private RecordingThread recorder;

以下为Configuration data,配置属性:

private AudioFormat desiredFormat;private boolean closeBetweenUtterances;private boolean keepDataReference;private boolean signed; private boolean bigEndian;private int frameSizeInBytes;private int msecPerRead;

private int selectedChannel;private String selectedMixerIndex;private String stereoToMono;private int sampleRate;private int 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,  boolean isRecording():microphone正在记录返回为真,否则为false。

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

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

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

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

此类的构造方法:           

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的情况下,在。。。。。 

15private double[]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为止。

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

 

 

本文档介绍Sphinx4在Windows下的中文训练过程及注意事项,与本文档配套的是我自己的训练实例bergtrain和用到的软件。 本文档编写日期 2013-04-23 1、为什么要训练? sphinx4目前的版本中仅提供了英文等语音识别库。中文的库是PTM或semi类型的,在java版sphinx中无法使用。 2、Sphinx的训练指哪些内容? 在Sphinx中有语言模型、声学模型等概念,如果你不想了解这些,请参考以下内容: a1、中文每个字的标准发音已经有一个较为全面的文件进行了标注 这个文件就是zh_broadcastnews_utf8.dic(下称这类文件为发音字典),在sphinx网站上可以下载,我们也包含了它。 下面是该文件的片断,它用类似拼音的方式标注了每个字或词的发音。 昌 ch ang 昌北 ch ang b ei 昌必 ch ang b i 昌都 ch ang d u 昌赫 ch ang h e a2、需要告诉sphinx我们经常使用的字、词是哪些,它们出现的频率如何 由于开放式语音识别尚难实现,所以sphinx实际上只能较好的处理相对小的语言集合。 因此,针对特定的领域,告诉sphinx该领域的词汇和各词出现的频率将极大提高识别率。 a3、需要告诉sphinx每个字、词的真正读音 发音字典告诉sphinx每个字的标准读音,但面对的说话人往往不会以标准读音来朗读。 因此sphinx需要学习说话人的“口音”。 如果训练时的读者发音比较标准,则sphinx能“举一反三”,识别其他不那么标准的读者的语音。 推荐的做法是训练一些典型的口音:标准男、女声,童音,最后再考虑特定用户的口音。 3、如何准备训练内容所需的原料? 需要准备两大内容:1)文本语料文件,2)语料录音文件。 文本语料文件给出2.a2中需要的内容,在bergtrain的etc文件下的berginput.txt文件就是一个预料文件。 它以行为单位,给出了150个中文句子。 语料录音文件是根据文本语料文件,朗读它的每行/句话,保存到每一个语音文件即可。 语料文件中的语句应该尽量选择领域相关的,在覆盖领域内名词的前提下,覆盖尽可能多的通用词汇。 4、训练环境及注意事项 本文的训练软硬件如下: 硬件:T60P笔记本,机器自带录音设备;操作系统为Win7 32位。 软件:Sphinx cmuclmtk-0.7-win32.zip pocketsphinx-0.8-win32.zip sphinxbase-0.8-win32.zip sphinxtrain-1.0.8-win32.zip sphinx4-1.0beta6-bin.zip,用于编写java版的识别软件所需的库 脚本执行软件 ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi ActivePython-2.7.2.5-win32-x86.msi 录音和处理软件 audacity-win-2.0.3rc1.zip,可进行录音和声音文件处理(如降噪),免费软件 FairStars.zip,可进行批量录音(V3.5绿色版) 文本编辑软件UltraEdit,UltraEdit-32.rar绿色版 注意: 文件格式 语料文件必须使用UltraEdit进行编辑, 在编辑后,使用 文件-转换-ASCII转UTF-8(UNICODE编辑),指定文件中的中文使用utf8编码。 在保存前,设置格式如下: 换行符:UNIX终束符 - LF 指定文件中的回车/换行符为编码0A的换行符 格式:UTF-8 - 无BOM 每个文件的末尾必须有一个回车! 这个回车将在保存时被替换为编码0A的换行符,训练脚本需要这个符号来确认文件的结束。 录音文件 如果你不希望去编辑训练中的配置文件,则在使用FairStars录音时作如下设定: 进入菜单和对话框 选项-显示录音选项-编码-WMA, 设定:采样率(16000Hz)、通道(单声道)、比特率(16Kbps) 5、训练步骤 下面逐步从零开始进行训练 5.1 软件环境的安装 将本文档所在的文件夹解压或拷贝到d:\,即本文档路径是d:\sphinxtrain\Sphinx中文训练教程.txt 1)点击安装ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi和ActivePython-2.7.2.5-win32-x86.msi; 2)解压Sphinx中除sphinx4-1.0beta6-bin.zip外的压缩文件到d:\sphinxtrain下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值