/// <summary> /// Plays the audio in the given media and logs the audio transcription if available. /// </summary> /// <param name="sender"></param> /// <param name="mediaSegmentContent"></param> static void OnMediaSegmentProcessed(object sender, MediaSegmentContent mediaSegmentContent) { if (mediaSegmentContent.Transcription.NBest != null && mediaSegmentContent.Transcription.NBest.Count > 0) { Log(mediaSegmentContent.Transcription.NBest[0].Display); } else { Log(mediaSegmentContent.TranscriptionResult); } using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) { waveOut.Init(mediaSegmentContent.Audio.BlockAlignReductionStream); waveOut.Play(); while (waveOut.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(100); } } mediaSegmentContent.Dispose(); }
/// <summary> /// Adds the processed media segment into the buffer. /// </summary> /// <param name="sender"></param> /// <param name="mediaSegmentContent">The processed media segment.</param> private void OnHlsMediaSegmentProcessed(object sender, MediaSegmentContent mediaSegmentContent) { Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { _mediaSegmentBuffer.Add(mediaSegmentContent); })); }
/// <summary> /// Adds the given media into the buffer. /// </summary> /// <param name="mediaSegmentContent">The media to add.</param> public void Add(MediaSegmentContent mediaSegmentContent) { FileWriter.WriteBytesToFile( mediaSegmentContent.FullContent, string.Format(MediaSegmentContentFilename, _mediaSegmentContentList.Count)); _mediaSegmentContentList.Add(mediaSegmentContent); System.Diagnostics.Debug.WriteLine($"Media segment number {_mediaSegmentContentList.Count} added to buffer"); BufferChanged?.Invoke(this, _mediaSegmentContentList.Count); }
public bool PlayFirst(out MediaSegmentContent mediaSegmentContent, out Uri localTsFileUri) { if (_mediaSegmentContentList.Count > CurrentIndex) { CurrentIndex = 0; mediaSegmentContent = _mediaSegmentContentList[CurrentIndex]; string filename = string.Format(MediaSegmentContentFilename, CurrentIndex); string filePath = Path.Combine(Directory.GetCurrentDirectory(), filename); localTsFileUri = new Uri(filePath); return(true); } mediaSegmentContent = null; localTsFileUri = null; return(false); }
/// <summary> /// Configures the subtitles for the given media segment. /// </summary> /// <param name="mediaSegmentContent"></param> private void ConfigureSubtitlesForNextSegment(MediaSegmentContent mediaSegmentContent) { if (_subtitleTimer != null) { _subtitleTimer.Dispose(); _subtitleTimer = null; } _subtitles.Clear(); _subtitleDurationsInMilliseconds.Clear(); _subtitleIndex = 0; Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { subtitleTextBlock.Text = string.Empty; })); if (mediaSegmentContent.Transcription != null && mediaSegmentContent.Transcription.NBest.Count > 0 && !string.IsNullOrWhiteSpace(mediaSegmentContent.Transcription.NBest[0].Display)) { if (mediaSegmentContent.Transcription.NBest[0].Confidence > 0.5f) { string transcription = mediaSegmentContent.Transcription.NBest[0].Display; string[] words = transcription.Split(' '); string subtitle = string.Empty; for (int i = 0; i < words.Length; ++i) { subtitle += $"{words[i]} "; if (subtitle.Length >= MaxSingleSubtitleLengthInCharacters || i == words.Length - 1) { _subtitles.Add(subtitle.Trim()); subtitle = string.Empty; } } // Transcription.Duration is measured in "ticks" int transcriptionDurationInMilliseconds = mediaSegmentContent.Transcription.Duration / 10000; foreach (string subtitleElement in _subtitles) { double ratio = (double)subtitleElement.Length / (double)transcription.Length; _subtitleDurationsInMilliseconds.Add((int)(transcriptionDurationInMilliseconds * ratio)); } } else { System.Diagnostics.Debug.WriteLine($"No enough confidence in respect to transcription of this segment: {mediaSegmentContent.Transcription.NBest[0].Confidence}"); } } if (_subtitleDurationsInMilliseconds.Count > 0) { System.Diagnostics.Debug.WriteLine($"Resolved {_subtitleDurationsInMilliseconds.Count} subtitle segment(s) for the current media segment"); SubtitleTimerCallback(null); } }