From cefcff2a614d6c3129613b5291d0c50cb2f9ad69 Mon Sep 17 00:00:00 2001 From: niksedk Date: Tue, 4 Oct 2022 19:41:37 +0200 Subject: [PATCH] Improve audio-to-text F2 log view --- src/ui/Forms/AudioToText/VoskAudioToText.cs | 7 +- .../VoskAudioToTextSelectedLines.cs | 12 +++- .../Forms/AudioToText/WhisperAudioToText.cs | 72 ++++++++----------- ...hisperAudioToTextSelectedLines.Designer.cs | 40 +++++------ .../WhisperAudioToTextSelectedLines.cs | 42 +++++++++-- src/ui/Forms/Main.cs | 2 +- 6 files changed, 103 insertions(+), 72 deletions(-) diff --git a/src/ui/Forms/AudioToText/VoskAudioToText.cs b/src/ui/Forms/AudioToText/VoskAudioToText.cs index d17a31550..6e82e52df 100644 --- a/src/ui/Forms/AudioToText/VoskAudioToText.cs +++ b/src/ui/Forms/AudioToText/VoskAudioToText.cs @@ -166,9 +166,12 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText progressBar1.Maximum = 100; progressBar1.Value = 0; progressBar1.Visible = true; - progressBar1.BringToFront(); progressBar1.Refresh(); progressBar1.Top = labelProgress.Bottom + 3; + if (!textBoxLog.Visible) + { + progressBar1.BringToFront(); + } } private void GenerateBatch() @@ -423,7 +426,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText labelProgress.Text = string.Format(LanguageSettings.Current.AddWaveform.ExtractingMinutes, (int)(seconds / 60), (int)(seconds % 60)); } - Refresh(); + Invalidate(); if (_cancel) { process.Kill(); diff --git a/src/ui/Forms/AudioToText/VoskAudioToTextSelectedLines.cs b/src/ui/Forms/AudioToText/VoskAudioToTextSelectedLines.cs index 23db7649b..09582cb80 100644 --- a/src/ui/Forms/AudioToText/VoskAudioToTextSelectedLines.cs +++ b/src/ui/Forms/AudioToText/VoskAudioToTextSelectedLines.cs @@ -84,9 +84,12 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText progressBar1.Maximum = 100; progressBar1.Value = 0; progressBar1.Visible = true; - progressBar1.BringToFront(); progressBar1.Refresh(); progressBar1.Top = labelProgress.Bottom + 3; + if (!textBoxLog.Visible) + { + progressBar1.BringToFront(); + } } private void GenerateBatch() @@ -116,7 +119,12 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText if (_cancel) { TaskbarList.SetProgressState(_parentForm.Handle, TaskbarButtonProgressFlags.NoProgress); - DialogResult = DialogResult.Cancel; + if (!textBoxLog.Visible) + { + DialogResult = DialogResult.Cancel; + progressBar1.Hide(); + } + return; } diff --git a/src/ui/Forms/AudioToText/WhisperAudioToText.cs b/src/ui/Forms/AudioToText/WhisperAudioToText.cs index b938eaa51..7c5b7b7fc 100644 --- a/src/ui/Forms/AudioToText/WhisperAudioToText.cs +++ b/src/ui/Forms/AudioToText/WhisperAudioToText.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; @@ -28,6 +29,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText private readonly Regex _timeRegex = new Regex(@"^\[\d\d:\d\d[\.,]\d\d\d --> \d\d:\d\d[\.,]\d\d\d\]", RegexOptions.Compiled); private List _resultList; private string _languageCode; + private ConcurrentBag _outputText = new ConcurrentBag(); public Subtitle TranscribedSubtitle { get; private set; } @@ -64,14 +66,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText comboBoxLanguages.Items.Clear(); comboBoxLanguages.Items.AddRange(WhisperLanguage.Languages.ToArray()); var lang = WhisperLanguage.Languages.FirstOrDefault(p => p.Code == Configuration.Settings.Tools.WhisperLanguageCode); - if (lang != null) - { - comboBoxLanguages.Text = lang.ToString(); - } - else - { - comboBoxLanguages.Text = "English"; - } + comboBoxLanguages.Text = lang != null ? lang.ToString() : "English"; FillModels(comboBoxModels, string.Empty); @@ -143,8 +138,10 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText return; } + timer1.Start(); GenerateBatch(); TaskbarList.SetProgressState(_parentForm.Handle, TaskbarButtonProgressFlags.NoProgress); + timer1.Stop(); return; } @@ -155,10 +152,11 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText comboBoxLanguages.Enabled = false; comboBoxModels.Enabled = false; var waveFileName = GenerateWavFile(_videoFileName, _audioTrackNumber); - textBoxLog.AppendText("Wav file name: " + waveFileName); - textBoxLog.AppendText(Environment.NewLine); + _outputText.Add("Wav file name: " + waveFileName); progressBar1.Style = ProgressBarStyle.Blocks; + timer1.Start(); var transcript = TranscribeViaWhisper(waveFileName); + timer1.Stop(); if (_cancel && (transcript == null || transcript.Count == 0 || MessageBox.Show(LanguageSettings.Current.AudioToText.KeepPartialTranscription, Text, MessageBoxButtons.YesNoCancel) != DialogResult.Yes)) { DialogResult = DialogResult.Cancel; @@ -178,9 +176,12 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText progressBar1.Maximum = 100; progressBar1.Value = 0; progressBar1.Visible = true; - progressBar1.BringToFront(); progressBar1.Refresh(); progressBar1.Top = labelProgress.Bottom + 3; + if (!textBoxLog.Visible) + { + progressBar1.BringToFront(); + } } private void GenerateBatch() @@ -189,7 +190,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText _batchFileNumber = 0; var errors = new StringBuilder(); var errorCount = 0; - textBoxLog.AppendText("Batch mode" + Environment.NewLine); + _outputText.Add("Batch mode"); foreach (ListViewItem lvi in listViewInputFiles.Items) { _batchFileNumber++; @@ -210,7 +211,8 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText continue; } - textBoxLog.AppendText("Wav file name: " + waveFileName + Environment.NewLine); + _outputText.Add(string.Empty); + _outputText.Add("Wav file name: " + waveFileName); progressBar1.Style = ProgressBarStyle.Blocks; var transcript = TranscribeViaWhisper(waveFileName); if (_cancel) @@ -266,7 +268,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText } File.WriteAllText(fileName, text, Encoding.UTF8); - textBoxLog.AppendText("Subtitle written to : " + fileName + Environment.NewLine); + _outputText.Add("Subtitle written to : " + fileName); } internal static string GetLanguage(string name) @@ -317,7 +319,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText Application.DoEvents(); System.Threading.Thread.Sleep(100); - Refresh(); + Invalidate(); if (_cancel) { process.Kill(); @@ -341,6 +343,8 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText return; } + _outputText.Add(outLine.Data.Trim() + Environment.NewLine); + foreach (var line in outLine.Data.SplitToLines()) { if (_timeRegex.IsMatch(line)) @@ -409,7 +413,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText labelProgress.Text = string.Format(LanguageSettings.Current.AddWaveform.ExtractingMinutes, (int)(seconds / 60), (int)(seconds % 60)); } - Refresh(); + Invalidate(); if (_cancel) { process.Kill(); @@ -518,8 +522,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText var parameters = $"--model {model} --language \"{language}\" --fp16 False \"{waveFileName}\""; var process = new Process { StartInfo = new ProcessStartInfo("whisper", parameters) { WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true } }; - textBoxLog.AppendText("Calling whisper with : whisper " + parameters + Environment.NewLine); - + _outputText.Add("Calling whisper with : whisper " + parameters); if (dataReceivedHandler != null) { @@ -586,6 +589,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText } else { + UpdateLog(); textBoxLog.Visible = true; textBoxLog.BringToFront(); } @@ -609,34 +613,20 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText UiUtil.OpenFolder(WhisperModel.ModelFolder); } - private void timer1_Tick(object sender, EventArgs e) + private void UpdateLog() { - //if (_bytesWavRead <= 0 || _bytesWavTotal <= 0) - //{ - // return; - //} + if (_outputText.IsEmpty) + { + return; + } - //var durationMs = (DateTime.UtcNow.Ticks - _startTicks) / 10_000; - //var msPerFrame = (float)durationMs / _bytesWavRead; - //var estimatedTotalMs = msPerFrame * _bytesWavTotal; - //var estimatedLeft = ToProgressTime(estimatedTotalMs - durationMs); - //labelTime.Text = estimatedLeft; + textBoxLog.AppendText(string.Join(Environment.NewLine, _outputText)); + _outputText = new ConcurrentBag(); } - public static string ToProgressTime(float estimatedTotalMs) + private void timer1_Tick(object sender, EventArgs e) { - var timeCode = new TimeCode(estimatedTotalMs); - if (timeCode.TotalSeconds < 60) - { - return string.Format(LanguageSettings.Current.GenerateVideoWithBurnedInSubs.TimeRemainingSeconds, (int)Math.Round(timeCode.TotalSeconds)); - } - - if (timeCode.TotalSeconds / 60 > 5) - { - return string.Format(LanguageSettings.Current.GenerateVideoWithBurnedInSubs.TimeRemainingMinutes, (int)Math.Round(timeCode.TotalSeconds / 60)); - } - - return string.Format(LanguageSettings.Current.GenerateVideoWithBurnedInSubs.TimeRemainingMinutesAndSeconds, timeCode.Minutes + timeCode.Hours * 60, timeCode.Seconds); + UpdateLog(); } private void buttonDownload_Click(object sender, EventArgs e) diff --git a/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.Designer.cs b/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.Designer.cs index ed51ec6ba..5d07fe980 100644 --- a/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.Designer.cs +++ b/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.Designer.cs @@ -36,6 +36,8 @@ this.textBoxLog = new System.Windows.Forms.TextBox(); this.labelInfo = new System.Windows.Forms.Label(); this.groupBoxModels = new System.Windows.Forms.GroupBox(); + this.labelChooseLanguage = new System.Windows.Forms.Label(); + this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); this.buttonDownload = new System.Windows.Forms.Button(); this.linkLabelOpenModelsFolder = new System.Windows.Forms.LinkLabel(); this.labelModel = new System.Windows.Forms.Label(); @@ -47,8 +49,6 @@ this.groupBoxInputFiles = new System.Windows.Forms.GroupBox(); this.listViewInputFiles = new System.Windows.Forms.ListView(); this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.labelChooseLanguage = new System.Windows.Forms.Label(); - this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); this.groupBoxModels.SuspendLayout(); this.groupBoxInputFiles.SuspendLayout(); this.SuspendLayout(); @@ -136,6 +136,24 @@ this.groupBoxModels.TabStop = false; this.groupBoxModels.Text = "Models"; // + // labelChooseLanguage + // + this.labelChooseLanguage.AutoSize = true; + this.labelChooseLanguage.Location = new System.Drawing.Point(3, 37); + this.labelChooseLanguage.Name = "labelChooseLanguage"; + this.labelChooseLanguage.Size = new System.Drawing.Size(90, 13); + this.labelChooseLanguage.TabIndex = 6; + this.labelChooseLanguage.Text = "Choose language"; + // + // comboBoxLanguages + // + this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguages.FormattingEnabled = true; + this.comboBoxLanguages.Location = new System.Drawing.Point(6, 53); + this.comboBoxLanguages.Name = "comboBoxLanguages"; + this.comboBoxLanguages.Size = new System.Drawing.Size(194, 21); + this.comboBoxLanguages.TabIndex = 7; + // // buttonDownload // this.buttonDownload.ImeMode = System.Windows.Forms.ImeMode.NoControl; @@ -247,24 +265,6 @@ this.columnHeaderFileName.Text = "File name"; this.columnHeaderFileName.Width = 455; // - // labelChooseLanguage - // - this.labelChooseLanguage.AutoSize = true; - this.labelChooseLanguage.Location = new System.Drawing.Point(3, 37); - this.labelChooseLanguage.Name = "labelChooseLanguage"; - this.labelChooseLanguage.Size = new System.Drawing.Size(90, 13); - this.labelChooseLanguage.TabIndex = 6; - this.labelChooseLanguage.Text = "Choose language"; - // - // comboBoxLanguages - // - this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguages.FormattingEnabled = true; - this.comboBoxLanguages.Location = new System.Drawing.Point(6, 53); - this.comboBoxLanguages.Name = "comboBoxLanguages"; - this.comboBoxLanguages.Size = new System.Drawing.Size(194, 21); - this.comboBoxLanguages.TabIndex = 7; - // // WhisperAudioToTextSelectedLines // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.cs b/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.cs index 76924ad6c..07ef34341 100644 --- a/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.cs +++ b/src/ui/Forms/AudioToText/WhisperAudioToTextSelectedLines.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -21,6 +22,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText private readonly Regex _timeRegex = new Regex(@"^\[\d\d:\d\d[\.,]\d\d\d --> \d\d:\d\d[\.,]\d\d\d\]", RegexOptions.Compiled); private List _resultList; private string _languageCode; + private ConcurrentBag _outputText = new ConcurrentBag(); public Subtitle TranscribedSubtitle { get; private set; } @@ -96,9 +98,12 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText progressBar1.Maximum = 100; progressBar1.Value = 0; progressBar1.Visible = true; - progressBar1.BringToFront(); progressBar1.Refresh(); progressBar1.Top = labelProgress.Bottom + 3; + if (!textBoxLog.Visible) + { + progressBar1.BringToFront(); + } } private void GenerateBatch() @@ -112,7 +117,8 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText { ParagraphMaxChars = Configuration.Settings.General.SubtitleLineMaximumLength * 2, }; - textBoxLog.AppendText("Batch mode" + Environment.NewLine); + _outputText.Add("Batch mode"); + timer1.Start(); foreach (ListViewItem lvi in listViewInputFiles.Items) { _batchFileNumber++; @@ -126,7 +132,8 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText comboBoxLanguages.Enabled = false; var waveFileName = videoFileName; - textBoxLog.AppendText("Wav file name: " + waveFileName + Environment.NewLine); + _outputText.Add(string.Empty); + _outputText.Add("Wav file name: " + waveFileName); progressBar1.Style = ProgressBarStyle.Blocks; var transcript = TranscribeViaWhisper(waveFileName); if (_cancel) @@ -142,9 +149,11 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText TaskbarList.SetProgressValue(_parentForm.Handle, _batchFileNumber, listViewInputFiles.Items.Count); } + timer1.Stop(); progressBar1.Value = 100; labelTime.Text = string.Empty; PostFix(postProcessor); + DialogResult = DialogResult.OK; } @@ -183,13 +192,19 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText Application.DoEvents(); System.Threading.Thread.Sleep(100); - Refresh(); + Invalidate(); if (_cancel) { process.Kill(); progressBar1.Visible = false; buttonCancel.Visible = false; - DialogResult = DialogResult.Cancel; + + if (!textBoxLog.Visible) + { + DialogResult = DialogResult.Cancel; + progressBar1.Hide(); + } + return null; } } @@ -207,6 +222,8 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText return; } + _outputText.Add(outLine.Data.Trim() + Environment.NewLine); + foreach (var line in outLine.Data.SplitToLines()) { if (_timeRegex.IsMatch(line)) @@ -316,7 +333,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText var parameters = $"--model {model} --language \"{language}\" --fp16 False \"{waveFileName}\""; var process = new Process { StartInfo = new ProcessStartInfo("whisper", parameters) { WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true } }; - textBoxLog.AppendText("Calling whisper with : whisper " + parameters + Environment.NewLine); + _outputText.Add("Calling whisper with : whisper " + parameters); if (dataReceivedHandler != null) @@ -369,6 +386,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText } else { + UpdateLog(); textBoxLog.Visible = true; textBoxLog.BringToFront(); } @@ -387,6 +405,17 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText } } + private void UpdateLog() + { + if (_outputText.IsEmpty) + { + return; + } + + textBoxLog.AppendText(string.Join(Environment.NewLine, _outputText) + Environment.NewLine); + _outputText = new ConcurrentBag(); + } + private void linkLabelOpenModelFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { UiUtil.OpenFolder(WhisperModel.ModelFolder); @@ -394,6 +423,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText private void timer1_Tick(object sender, EventArgs e) { + UpdateLog(); } public static string ToProgressTime(float estimatedTotalMs) diff --git a/src/ui/Forms/Main.cs b/src/ui/Forms/Main.cs index edf24d791..631b7e1f6 100644 --- a/src/ui/Forms/Main.cs +++ b/src/ui/Forms/Main.cs @@ -8788,7 +8788,7 @@ namespace Nikse.SubtitleEdit.Forms UiUtil.FixFonts(audioToTextVosk); audio.DropDownItems.Insert(0, audioClip); - if (!WhisperHelper.IsWhisperInstalled()) + if (WhisperHelper.IsWhisperInstalled()) { audio.DropDownItems.Insert(0, audioToTextWhisper); }