2012-10-30 1 views
3

키워드 스포팅 시스템을 구축하려고하고 있으며, 내 프로젝트의 기초로 스핑크스 4의 분기 this을 선택합니다.wav에서 cepstrum으로 변환하여 발생하는 Shpinx 4 키워드 스포팅 기능의 정확도가 낮음

wav 파일 (단일 키워드로 70 % 이상)에서 제대로 작동합니다. 하지만 클라이언트에서 서버로 파일을 전송하는 시간을 절약하기 위해 wav 파일을 먼저 클라이언트 측에서 셉 스트 럼으로 변환 한 다음 켐프 트럼을 전송하기로 결정했습니다. 이 작업은 Featurefiledumper에 의해 수행됩니다.

그러나 원래의 KWS 시스템에 셉 스트 럼을로드 할 때 정확도는 끔찍합니다. 나는 클라이언트에 일부 작품을 넣었을 때 정확성에 큰 영향을 미치지 않아야한다고 생각했다. 원래의 KWS 시스템은 각 단어를 적절한 블록으로 분리하여 인식 할 수 있습니다. 스펙트럼을 입력으로 사용하면 시스템에서 모든 단어를 올바르게 나눌 수 없습니다. 나는 그것이 높은 정확도를 얻을 수없는 이유이기도하다고 생각합니다.

파일 전송에 시간을 절약하고 KWS 시스템의 적절한 정확성을 유지하는 방법을 찾고 싶습니다. 구성에서 놓친 것이 있습니까? 아니면 필요를 충족시키는 또 다른 방법이 있습니까? ==============

<config> 

<property name="logLevel" value="WARNING" /> 
<property name="absoluteBeamWidth" value="-1" /> 
<property name="relativeBeamWidth" value="1E-150" /> 
<property name="wordInsertionProbability" value="0.7" /> 
<property name="languageWeight" value="7" /> 

<property name="frontend" value="epFrontEnd" /> 
<property name="recognizer" value="recognizer" /> 
<property name="showCreations" value="false" /> 
<property name="outOfGrammarProbability" value="1E-10"/> 
<property name="phoneInsertionProbability" value="1E-55"/> 
<component name="recognizer" type="edu.cmu.sphinx.recognizer.Recognizer"> 
    <property name="decoder" value="decoder" /> 
</component> 

<component name="decoder" type="edu.cmu.sphinx.decoder.Decoder"> 
    <property name="searchManager" value="searchManager" /> 
</component> 

<component name="searchManager" type="edu.cmu.sphinx.decoder.search.SimpleBreadthFirstSearchManager"> 
    <property name="logMath" value="logMath" /> 
    <property name="linguist" value="FlatLinguist" /> 
    <property name="pruner" value="trivialPruner" /> 
    <property name="scorer" value="threadedScorer" /> 
    <property name="activeListFactory" value="activeList" /> 
</component> 


<component name="activeList" type="edu.cmu.sphinx.decoder.search.PartitionActiveListFactory"> 
    <property name="logMath" value="logMath" /> 
    <property name="absoluteBeamWidth" value="${absoluteBeamWidth}" /> 
    <property name="relativeBeamWidth" value="${relativeBeamWidth}" /> 
</component> 

<component name="trivialPruner" type="edu.cmu.sphinx.decoder.pruner.SimplePruner" /> 

<component name="threadedScorer" type="edu.cmu.sphinx.decoder.scorer.ThreadedAcousticScorer"> 
    <property name="frontend" value="${frontend}" /> 
</component> 

<component name="FlatLinguist" type="edu.cmu.sphinx.linguist.KWSFlatLinguist.KWSFlatLinguist"> 
    <property name="logMath" value="logMath" /> 
    <property name="grammar" value="NoSkipGrammar" /> 
    <property name="acousticModel" value="wsj" />  
    <property name="wordInsertionProbability" value="${wordInsertionProbability}" /> 
    <property name="languageWeight" value="${languageWeight}" /> 
    <property name="unitManager" value="unitManager" /> 
    <property name="addOutOfGrammarBranch" value="true"/> 
    <property name="phoneLoopAcousticModel" value="WSJ"/> 
    <property name="outOfGrammarProbability" value="${outOfGrammarProbability}"/> 
    <property name="phoneInsertionProbability" value="${phoneInsertionProbability}"/> 
    <property name="dumpGStates" value ="true"/>  
</component> 

<component name="NoSkipGrammar" type="edu.cmu.sphinx.linguist.language.grammar.NoSkipGrammar"> 
    <property name="dictionary" value="dictionary" /> 
    <property name="logMath" value="logMath" /> 
    <property name="addSilenceWords" value="false" /> 
</component> 

<component name="dictionary" type="edu.cmu.sphinx.linguist.dictionary.AllWordDictionary"> 
    <property name="dictionaryPath" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz/dict/cmudict.0.6d" /> 
    <property name="fillerPath" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz/noisedict" /> 
    <property name="addSilEndingPronunciation" value="false" /> 
    <property name="wordReplacement" value="&lt;sil&gt;" /> 
    <property name="unitManager" value="unitManager" /> 
</component> 

<component name="wsj" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.TiedStateAcousticModel"> 
    <property name="loader" value="wsjLoader" /> 
    <property name="unitManager" value="unitManager" /> 
</component> 

<component name="wsjLoader" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader"> 
    <property name="logMath" value="logMath" /> 
    <property name="unitManager" value="unitManager" /> 
    <property name="location" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz" /> 
</component> 

<component name="unitManager" type="edu.cmu.sphinx.linguist.acoustic.UnitManager" /> 
<!-- additions start--> 
<component name="WSJ" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.TiedStateAcousticModel"> 
    <property name="loader" value="WSJLOADER" /> 
    <property name="unitManager" value="UNITMANAGER" /> 
</component> 

<component name="WSJLOADER" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader"> 
    <property name="logMath" value="logMath" /> 
    <property name="unitManager" value="UNITMANAGER" /> 
    <property name="location" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz" /> 
</component> 

<component name="UNITMANAGER" type="edu.cmu.sphinx.linguist.acoustic.UnitManager" /> 

<component name="tidigits" 
    type="edu.cmu.sphinx.model.acoustic.TIDIGITS_8gau_13dCep_16k_40mel_130Hz_6800Hz.Model"> 
    <property name="loader" value="sphinx3Loader"/> 
    <property name="unitManager" value="unitManager"/> 
</component> 

<component name="sphinx3Loader" 
      type="edu.cmu.sphinx.model.acoustic.TIDIGITS_8gau_13dCep_16k_40mel_130Hz_6800Hz.ModelLoader"> 
    <property name="logMath" value="logMath"/> 
    <property name="unitManager" value="UNITMANAGER"/> 
</component> 
<!-- additions end --> 

<component name="epFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> 
    <propertylist name="pipeline"> 
     <item>streamCepstrumSource </item> 
     <item>BatchCMN </item> 
     <item>featureExtraction </item> 
    </propertylist> 
</component> 

<component name="audioFileDataSource" type="edu.cmu.sphinx.frontend.util.AudioFileDataSource" /> 

<component name="dataBlocker" type="edu.cmu.sphinx.frontend.DataBlocker" /> 

<component name="speechClassifier" type="edu.cmu.sphinx.frontend.endpoint.SpeechClassifier" /> 

<component name="nonSpeechDataFilter" type="edu.cmu.sphinx.frontend.endpoint.NonSpeechDataFilter" /> 

<component name="speechMarker" type="edu.cmu.sphinx.frontend.endpoint.SpeechMarker" /> 

<component name="preemphasizer" type="edu.cmu.sphinx.frontend.filter.Preemphasizer" /> 

<component name="windower" type="edu.cmu.sphinx.frontend.window.RaisedCosineWindower"> 
</component> 

<component name="fft" type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"> 
</component> 

<component name="melFilterBank" type="edu.cmu.sphinx.frontend.frequencywarp.MelFrequencyFilterBank"> 
</component> 

<component name="dct" type="edu.cmu.sphinx.frontend.transform.DiscreteCosineTransform" /> 

<component name="liveCMN" type="edu.cmu.sphinx.frontend.feature.LiveCMN" /> 

<component name="featureExtraction" type="edu.cmu.sphinx.frontend.feature.DeltasFeatureExtractor" /> 

<component name="BatchCMN" type="edu.cmu.sphinx.frontend.feature.BatchCMN"/> 

<component name="logMath" type="edu.cmu.sphinx.util.LogMath"> 
    <property name="logBase" value="1.0001" /> 
    <property name="useAddTable" value="true" /> 
</component> 

<component name="streamCepstrumSource" type="edu.cmu.sphinx.frontend.util.StreamCepstrumSource"> 
    <property name="sampleRate" value="16000"/> 
    </component> 

</config>  

: 여기

<config> 

<!-- ******************************************************** --> 
<!-- The frontend configuration        --> 
<!-- ******************************************************** --> 

<component name="cepstraFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> 
    <propertylist name="pipeline"> 
     <item>streamDataSource</item> 
     <item>preemphasizer</item> 
     <item>windower</item> 
     <item>fft</item> 
     <item>melFilterBank</item> 
     <item>dct</item> 
    </propertylist> 
</component> 

<component name="preemphasizer" 
      type="edu.cmu.sphinx.frontend.filter.Preemphasizer"/> 

<component name="windower" 
      type="edu.cmu.sphinx.frontend.window.RaisedCosineWindower"> 
</componentcomponent> 

<component name="fft" 
      type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"/> 

<component name="melFilterBank" 
      type="edu.cmu.sphinx.frontend.frequencywarp.MelFrequencyFilterBank"> 
</component> 

<component name="dct" 
      type="edu.cmu.sphinx.frontend.transform.DiscreteCosineTransform"/> 

<component name="streamDataSource" 
      type="edu.cmu.sphinx.frontend.util.StreamDataSource"> 
    <property name="sampleRate" value="16000"/> 
</component> 

</config> 

서버 측 구성이다 다음

클라이언트 측의 구성이며 ========================================================================================================== ==

Nikolay에게 감사드립니다. 이유는 파일을 처리하는 다른 구성 요소 (StreamDataSource 및 AudioFileDataSource)입니다 알아 냈습니다.

하지만 문제는 내 클라이언트가 Android 시스템입니다. javax.sound.sampled 클래스는 지원하지 않습니다. 따라서 클라이언트에서 AudioFileDataSource를 사용하는 것은 불가능합니다. StreamDataSource가 가능한 솔루션입니다. 그러나 왜이 두 구성 요소가 다른 기능 세트로 이어지는 지 잘 모릅니다.

AudioDataSource가 AudioFileDataSource와 동일한 결과를 생성하도록하는 힌트가 있습니까?

답변

1

설정이 잘못되었거나 다른 방법이 있습니까? 필요를 충족시켜 주시겠습니까?

구성이 정확합니다. 아무 것도 놓치지 않았습니다.

대부분 자신이 작성한 전달 함수에서 실수를 범한 것 같습니다. 모든 것이 똑같은지 확인하려면 먼저 데이터를 파일로 전송해야합니다. CepstrumDataSource가 생성 한 값을 덤프하여 예상 범위 내에 있는지 확인할 수도 있습니다. 이를 위해 DataDumper 구성 요소를 사용할 수 있습니다.

+0

귀하의 소중한 조언에 진심으로 감사드립니다. 원래 시스템과 Featurefiledumper에서 생성 된 내용을 확인했습니다. 그들은 다르다. 그리고 Featurefiledumper를 수정하여 클라이언트 측에서 직접 wav 파일을로드합니다. 이제 그들은 같은 결과를 얻을 수 있습니다. – nh3500