/// <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);
     }));
 }
Beispiel #3
0
        /// <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);
            }
        }