/// <summary> /// Writes the right margin if possible. /// </summary> /// <param name="waveFile">The given wave file where the current candidate belongs to.</param> /// <param name="candidate">The current candidate.</param> /// <param name="candidateInfo">The candidate information of the current candidate.</param> private void WriteRightMargin(WaveFile waveFile, UnitCandidate candidate, WaveCandidateInfo candidateInfo) { if (_ccMarginLength + _fsMarginLength > 0) { int rightMarginLength = (_ccMarginLength / 2) + _fsMarginLength; int waveSampleOffsetInSentence = (int)((candidate.StartTimeInSecond * waveFile.Format.SamplesPerSecond) + 0.5f); int waveSampleLength = (int)(((candidate.EndTimeInSecond - candidate.StartTimeInSecond) * waveFile.Format.SamplesPerSecond) + 0.5f); // Right margin section. if (candidate.Index == candidate.Sentence.Candidates.Count - 1) { // It means the candidate is the last one, there is no next candidate. So, writes some zero as margin. WriteZeroMargin(rightMarginLength); } else if (candidate.Sentence.Candidates[candidate.Index + 1].Id == UnitCandidate.InvalidId) { // There is a next candidate and it isn't in the inventory. So, writes the next candidate as margin. int offset = (int)(waveSampleOffsetInSentence + waveSampleLength); int count = (waveFile.GetSoundData().Length / (waveFile.Format.BitsPerSample / 8)) - offset; if (count < rightMarginLength) { WriteIntoInventory(ConvertsWaveDataFormat(waveFile, offset, count)); WriteZeroMargin(rightMarginLength - count); } else { WriteIntoInventory(ConvertsWaveDataFormat(waveFile, offset, rightMarginLength)); } } } }
/// <summary> /// Writes the left margin if possible. /// </summary> /// <param name="waveFile">The given wave file where the current candidate belongs to.</param> /// <param name="candidate">The current candidate.</param> /// <param name="candidateInfo">The candidate information of the current candidate.</param> private void WriteLeftMargin(WaveFile waveFile, UnitCandidate candidate, WaveCandidateInfo candidateInfo) { if (_ccMarginLength + _fsMarginLength > 0) { int leftMarginLength = _ccMarginLength + _fsMarginLength; int waveSampleOffsetInSentence = (int)((candidate.StartTimeInSecond * waveFile.Format.SamplesPerSecond) + 0.5f); // Left margin section. if (candidate.Index == 0) { // It means the candidate is the first one, there is no previous candidate. So, writes some zero as margin. WriteZeroMargin(leftMarginLength); } else if (candidate.Sentence.Candidates[candidate.Index - 1].Id == UnitCandidate.InvalidId) { // There is a previous candidate and it isn't in the inventory. So, writes the previous candidate as margin. int offset = (int)(waveSampleOffsetInSentence - leftMarginLength); int count = leftMarginLength; if (offset < 0) { // The margin is longer than the previous candidate, uses zero to fill them. WriteZeroMargin(-offset); count += offset; offset = 0; } WriteIntoInventory(ConvertsWaveDataFormat(waveFile, offset, count)); } } }