SpeechMarker API 與端點檢測

  • 本類的屬性:</span>  
  • <span style="font-size:32px;">public class SpeechMarker extends BaseDataProcessor
    經過本類處理後的數據流中含數的爲:SPEECH_START信號, SPEECH_END信號, DoubleData(包含語音和非語音),DataStartSignal信號和DataEndSignal信號。屬於語音的DoubleData位於SPEECH_START信號和 SPEECH_END信號之間。
    把SPEECH_START和SPEECH_END信號插入從前一個數據處理器得到的數據流中,從中我們可以得到什麼時候是utterance的開始,什麼時候是utterance的結束。在SPEECH_START和SPEECH_END信號之間的是utterance的開始到utterance的結束時間,這正是我們所要真正識別的部分。
    把在SpeechClassifier中得到的被標記爲語音和非語音SpeechClassifiedData對象流,規劃出其中被認爲是語音的區域。這是通過插入SPEECH_START和SPEECH_END信號入流中來實現。   
    插入兩信號的算法如下:
      這個算法經常處於兩種狀態中的一種狀態中,兩種狀態爲:’in-speech’和’out-of-speech’.如果處於’out-of-speech’,它將會讀取音頻數據直到讀取的音頻數據爲語音爲止。如果我們讀到了多個’startspeech’在連續語音中,我們認爲語音已經開始了,插入一個SPEECH_START在語音首次開始前的’speechLeader’時刻。算法的狀態轉換到’in-speech’。
    現在讓我們當算法在’in-speech’狀態的情況。如果它讀到的一個音頻(doubledata)是語音,它被調度來輸出。如果音頻是非語音,一直讀取到’endSilence’在連續非語音中。在這一點上我們認爲語音已經結束了。一個’SPEECH_END’信號被插入在首次的非語音音頻後的’speechTrailer’時刻。算法返回到’out-of-speech’狀態。如果在中間有任何語音音頻被碰到,重新開始所有的估計(解釋)狀態。
    當被延遲處理的語音音頻低於最小的數量。這將有助於分割用可見的延遲低速語音和高速語音,當延遲是最小時。
    本類的屬性:</span>



    <span style="font-size:32px;">@S4Integer(defaultValue = 200)
    public static final String PROP_START_SPEECH = "startSpeech";被任爲是utterance開始的最小的語言時間總數(即最少多少連續幀語音)。以ms(毫秒)爲單位,默認爲200ms。即語音時間多少毫秒可以認爲是utterance的開始。
    private int startSpeechTime;與上相同的意思。
    @S4Integer(defaultValue = 500)
    public static final String PROP_END_SILENCE = "endSilence";被認爲是utterance結束的靜音的時間總數(最少多少連續幀非語音)。即靜音多少毫秒,可以認爲是utterance的結束。以毫秒爲單位。
    private int endSilenceTime;與一個PROP_END_SILENCE有着相同的意思。
    @S4Integer(defaultValue = 50)
    public static final String PROP_SPEECH_LEADER = "speechLeader"; startSpeech前的可有的非語音的數量 。默認爲50
    private int speechLeader;與PROP_SPEECH_LEADER在意思上一樣。
    @S4Integer(defaultValue = 30)
    public static final String PROP_SPEECH_LEADER_FRAMES = "speechLeaderFrames";要想插入speechstartsignal信號,在緩存中最少需有的音頻幀數。默認爲30.
    private int speechLeaderFrames;與PROP_SPEECH_LEADER_FRAMES一樣。
    @S4Integer(defaultValue = 50)
    public static final String PROP_SPEECH_TRAILER = "speechTrailer";語音結束後,可認爲最大可能的非語音的總時間。默認爲50ms
    private int speechTrailer;與PROP_SPEECH_TRAILER一樣。
    @S4Double(defaultValue = 15.0)
    public static final String PROP_END_SILENCE_DECAY = "endSilenceDecay";本屬性減少了獨到語音後的結束靜音,這允許標記器用小的停頓來自適應快的語音。默認爲15.0. 用在countSpeechFrame()方法中。來調整endSilence值。
    private double endSilenceDecay;與PROP_END_SILENCE_DECAY一樣。
    private List<Data> outputQueue;  // Audio objects are added to the end輸出列表。
    private boolean inSpeech;是否在語音中
    private int frameCount;幀數
     private int initialEndSilenceTime;</span>
    

    <span style="font-size:32px;">本類的構造方法:
    public SpeechMarker();空的構造方法。僅用於構建對象,不會對任何屬性進行初始化。
    public SpeechMarker(int startSpeechTime, int endSilenceTime, int speechLeader, int speechLeaderFrames, int speechTrailer, double endSilenceDecay);非空構造方法。初始化了相應的屬性。
    本類的方法:
    public void newProperties(PropertySheet ps);只對屬性進行操作,其操作與構造方法一樣。用於在後的對象,後改變屬性值。
    public void initialize();初始化SpeechMarker設置了前處理器,inSpeech = false;
    frameCount = 0;this.outputQueue = new ArrayList<Data>();,
    private void reset();重置SpeechMarker(語音標記器)到初始狀態。inSpeech = false;frameCount = 0;this.outputQueue = new ArrayList<Data>();
    private Data readData();從獲得前一處理的輸出。即獲得SpeechClassifiedData數據(分類後的數據)。
    private void sendToQueue(Data audio);把獲得的SpeechClassifiedData數據添加入outputQueue列表中。
    public int getAudioTime(SpeechClassifiedData audio);獲得一個SpeechClassifiedData存儲的採樣數的相應時間,即獲得存儲的這些採樣數所需的時間,也爲採樣時間。音頻時間,以毫秒爲單位。
    private boolean handleFirstSpeech(SpeechClassifiedData audio);需要考慮的情況如下:以開始讀入的SpeechClassifiedData爲語音爲前提,
     1,開始讀入的SpeechClassifiedData所包含的音頻時間小於可以認爲是utterance開始的連續語音的情況:
             A,接下來的全部爲連續語音的情況。
             B,接下來的不都是連續語音的情況:即有非語音的情況。
             C,接下來沒有足夠的音頻的情況。即沒有startSpeechTime- speechTime時間的音頻。                 
    本方法的目的是看輸入的語音SpeechClassifiedData,及其後連續的可以認爲是語音開始的時間內的SpeechClassifiedData是否都爲語音,都爲則返回爲真,否則返回爲false,並把讀取的所有SpeechClassifiedData都放入本類的輸出列表中。首先輸入的SpeechClassifiedData爲語音,並獲得其語音的時間。和確定的認爲是utterance開始的時間比較,如果小於則繼續從輸入讀取SpeechClassifiedData,並檢它,爲null就返回,否則得話,放入輸出列表中,並判斷其是否是語音,不是的話返回,是的話語音時間加此SpeechClassifiedData的語音時間。循環以上處理過程,直到連續語音時間等於設定的開始語音時間。將返回爲真。
      private void addSpeechStart();本方法的目的是添加SPEECH_START信號,需要考慮的情況如下:以檢測到了utterance開始爲前提:採用回溯的方法。
    1,  可以認爲是utterance開始的前startSpeechTime後的時間段中包含的情況:
    A,  包含DataStartSignal信號的情況,
    B,  包含SpeechEndSignal的情況,
    C,  包含speechLeader個非語音的情況。
    D,  包含語音的情況。
    SPEECH_START信號插入在DataStartSignal或SpeechEndSignal或最終回溯到的那個SpeechClassifiedData數據的前面。爲了把SPEECH_START加入到outputQueue輸出列表中,從當前位置開始回溯。根據設置的speechLeader和startSpeechTime來決定回溯。用在回溯期間的非語音的總時長和speechLeader比較,用。用在回溯期間的語音的總時長和startSpeechTime比較。addSpeechStart()方法是在獲得可認爲是utterance開始的連續的語音後調用的。speechLeader爲可以認爲是utterance開始的連續語音段前可的非語音時間段。需要考慮的情況有:</span>
    

      
    <span style="font-size:32px;">private boolean readEndFrames(SpeechClassifiedData audio);主要用來插入SpeechEndSignal信號。對於一個非語音中我們試圖都更多的非語音幀,直到我們可以認爲utterance結束爲止。輸入audio爲非語音幀,如果語音真正結束返回爲真,否則爲false。返回爲真的話,會在輸出列表相應的地方插入SpeechEndSignal信號。如果讀取了endsignaltime的話,還會往下讀取最大的可能讀取爲speechtrailer。需考慮的情況有:
    1,  輸入的非語音後有連續endsignaltime-1的非語音的情況;
    A,  在隨後有連續的speechtrailer非語音的情況,
    B,  在隨後沒有連續的speechtrailer非語音的情況
            a,其中有語音幀的情況。
            B,有dataendsignal信號的情況。
    2,  輸入的非語音後沒有連續endsignaltime-1的非語音的情況;
    A,  有dataendsignal信號的情況
    B,  其中有語音幀的情況</span>
    



    1. <span style=“font-size:32px;”>public boolean inSpeech();返回是否在語音中的布爾值。  
    2. public Data getData();返回Data對象,如果在outputQueue輸出列表中沒有數據則返回爲null。本方法分兩步處理:  
    3. 1從前一處理器的讀取數據,進行處理(加入SPEECH_END信號和SPEECH_START信號入音頻信號流中),並把處理後的數據存入outputQueue輸出列表中。  
    4. 2,從outputQueue輸出列表中讀取數據輸出,(一般是到下一處理器)。  
    5. 對於第一步,的處理情況爲:以outputQueue輸出列表的長度小於speechLeaderFrames(緩存列表中所能存儲的最大幀數)爲前提,    
    6. 1,  輸入不爲null的情況(即從前一處理器得到的數據不爲null);  
    7. A,  不在語音中的情況;即utterance沒有開始的情況,  
    8. a,得到的data爲SpeechClassifiedData的情況  
    9. b, 得到的data爲DataStartSignal的情況  
    10.       B, 在語音中的情況,即utterance已經開始的情況,  
    11. a,得到的data爲SpeechClassifiedData的情況  
    12. b, 得到的data爲DataStartSignal的情況  
    13. c, 得到的data爲DataEndSignal的情況  
    14.  2,輸入爲null的情況。  
    15. 對於第二步就是從列表中讀取數據,當讀到的是SpeechClassifiedData時,取其中doubledata輸出。即其doubledata屬性。  
    16. private void startCountingFrames();把frameCount = 0;  
    17. endSilenceTime = initialEndSilenceTime;  
    18. private void countSpeechFrame();作用計算語音幀總數,主要是調整了多少個連續非語音中可認爲utterance結束的值,private void countSpeechFrame() {  
    19.         frameCount++;  
    20.         int minTime = speechLeader + speechTrailer;  
    21.     endSilenceTime = (int) (initialEndSilenceTime -   
    22.          ((float)initialEndSilenceTime - minTime) / endSilenceDecay *   
    23.     (frameCount / 100.0));  
    24.         if (endSilenceTime <= minTime)  
    25.             endSilenceTime = minTime;  
    26.     }  
    27. </span>  

    轉:http://blog.csdn.net/taiyb/article/details/46367893

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章