/// <summary> /// Zeros power in the silence frames. /// </summary> /// <param name="alignmentFile"> /// The alignment file. /// </param> /// <param name="secondsPerFrame"> /// The seconds per frame. /// </param> /// <exception cref="ArgumentException">ArgumentException. /// </exception> /// <exception cref="InvalidDataException">InvalidDataException. /// </exception> public void ZeroSilence(string alignmentFile, float secondsPerFrame) { if (!File.Exists(alignmentFile)) { throw new FileNotFoundException(Helper.NeutralFormat("Alignment file \"{0}\" not found", alignmentFile)); } // Loads alginment file. SegmentFile segmentFile = new SegmentFile(); segmentFile.Load(alignmentFile); // Gets the last segmentation. WaveSegment last = segmentFile.WaveSegments[segmentFile.WaveSegments.Count - 1]; // Gets the silence frame and end frame. if ((int)(last.StartTime / secondsPerFrame) > _data.Count) { throw new InvalidDataException( Helper.NeutralFormat( "The start frame {0} of last phone [{1}] is larger than power length {2} in file \"{3}\", remove this sentence from training set.", (int)(last.StartTime / secondsPerFrame), last.Label, _data.Count, _fileName)); } List<int> silenceFrames = new List<int>(); for (int i = 0; i < segmentFile.WaveSegments.Count; ++i) { if (segmentFile.WaveSegments[i].IsSilenceFeature) { silenceFrames.Add((int)(segmentFile.WaveSegments[i].StartTime / secondsPerFrame)); if (i < segmentFile.WaveSegments.Count - 1) { silenceFrames.Add((int)(segmentFile.WaveSegments[i + 1].StartTime / secondsPerFrame)); } else { silenceFrames.Add(_data.Count); } } } // Zeros the power data at silence frames. for (int i = 0; i < silenceFrames.Count; i += 2) { for (int j = silenceFrames[i]; j < silenceFrames[i + 1]; ++j) { _data[j] = 0.0f; } } }
/// <summary> /// Convert the label info sentence into a segment file. /// </summary> /// <returns>SegmentFile.</returns> public SegmentFile ToSegmentFile() { SegmentFile segmentFile = new SegmentFile(); foreach (LabelInfo lableInfo in _listLabelInfo) { WaveSegment segment = new WaveSegment(); segment.Label = lableInfo.Label; segment.StartTime = LabelInfo.ConvertToSecond(lableInfo.Start); segment.EndTime = LabelInfo.ConvertToSecond(lableInfo.End); segmentFile.WaveSegments.Add(segment); } segmentFile.UpdateNonSilenceWaveSegments(); return segmentFile; }