sphinx4 icon indicating copy to clipboard operation
sphinx4 copied to clipboard

frontend.feature.LiveCMN does not properly handle `DataStartSignal`s

Open timobaumann opened this issue 7 years ago • 0 comments

In contrast to most other processors, LiveCMN does not forget its cache of internal values when a DataStartSignal comes around. Thus, it will churn out stale data even though a new DataStartSignal would indicate that everything before it is probably irrelevant by now. In combination with endpointing (as in #82), this yields stale null objects that immediately end recognition in the decoder.

The following fixes this:

    public Data getData() throws DataProcessingException {

        Data input, output;

        // Collect initial data for estimation
        if (sum == null) {
            while (initialList.size() < initialCmnWindow) {
                input = getPredecessor().getData();
                if (input instanceof DataStartSignal)
                    initialList.clear();
                initialList.add(input);
                if (input instanceof SpeechEndSignal
                        || input instanceof DataEndSignal)
                    break;
            }
            initMeansSums();
            output = initialList.remove(0);
        } else if (!initialList.isEmpty()) {
            // Return the previously collected data
            output = initialList.remove(0);
        } else {
            // Process normal frame
            output = getPredecessor().getData();
            if (output instanceof DataStartSignal) {
                initialList.clear();
                sum = null;
                initialList.add(output);
                output = getData();
            }
        }

        normalize(output);
        return output;
    }

timobaumann avatar Dec 07 '18 17:12 timobaumann