Merge branch 'SubtitleEdit:main' into main

This commit is contained in:
May Kittens Devour Your Soul 2024-04-21 19:40:06 +02:00 committed by GitHub
commit cbd0ce0b16
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 1865 additions and 254 deletions

View File

@ -2,8 +2,8 @@
4.0.6 (xth May 2024) BETA 4.0.6 (xth May 2024) BETA
* NEW: * NEW:
* Add "Text To Speech" - thx darnn * Add "Text To Speech" - thx darnn/cvrle77/msjsc001
* Add burn-in batch mode - thx Leon * Add burn-in batch mode - thx Leon/David
* IMPROVED: * IMPROVED:
* Update Portuguese translation - thx hugok79 * Update Portuguese translation - thx hugok79
* Update Bulgarian translation - thx Калин * Update Bulgarian translation - thx Калин

View File

@ -191,6 +191,7 @@ namespace Nikse.SubtitleEdit.Core.Common
public int AutoTranslateDelaySeconds { get; set; } public int AutoTranslateDelaySeconds { get; set; }
public string GeminiProApiKey { get; set; } public string GeminiProApiKey { get; set; }
public string TextToSpeechEngine { get; set; } public string TextToSpeechEngine { get; set; }
public string TextToSpeechLastVoice { get; set; }
public string TextToSpeechElevenLabsApiKey { get; set; } public string TextToSpeechElevenLabsApiKey { get; set; }
public bool DisableVidoInfoViaLabel { get; set; } public bool DisableVidoInfoViaLabel { get; set; }
public bool ListViewSyntaxColorDurationSmall { get; set; } public bool ListViewSyntaxColorDurationSmall { get; set; }
@ -480,6 +481,9 @@ namespace Nikse.SubtitleEdit.Core.Common
public string GenVideoEmbedOutputSuffix { get; set; } public string GenVideoEmbedOutputSuffix { get; set; }
public string GenVideoEmbedOutputReplace { get; set; } public string GenVideoEmbedOutputReplace { get; set; }
public bool GenVideoDeleteInputVideoFile { get; set; } public bool GenVideoDeleteInputVideoFile { get; set; }
public bool GenVideoUseOutputFolder { get; set; }
public string GenVideoOutputFolder { get; set; }
public string GenVideoOutputFileSuffix { get; set; }
public bool VoskPostProcessing { get; set; } public bool VoskPostProcessing { get; set; }
public string VoskModel { get; set; } public string VoskModel { get; set; }
@ -733,6 +737,7 @@ namespace Nikse.SubtitleEdit.Core.Common
GenVideoNonAssaTextColor = Color.White; GenVideoNonAssaTextColor = Color.White;
GenVideoEmbedOutputSuffix = "embed"; GenVideoEmbedOutputSuffix = "embed";
GenVideoEmbedOutputReplace = "embed" + Environment.NewLine + "SoftSub" + Environment.NewLine + "SoftSubbed"; GenVideoEmbedOutputReplace = "embed" + Environment.NewLine + "SoftSub" + Environment.NewLine + "SoftSubbed";
GenVideoOutputFileSuffix = "_new";
VoskPostProcessing = true; VoskPostProcessing = true;
WhisperChoice = Configuration.IsRunningOnWindows ? AudioToText.WhisperChoice.PurfviewFasterWhisper : AudioToText.WhisperChoice.OpenAi; WhisperChoice = Configuration.IsRunningOnWindows ? AudioToText.WhisperChoice.PurfviewFasterWhisper : AudioToText.WhisperChoice.OpenAi;
WhisperDeleteTempFiles = true; WhisperDeleteTempFiles = true;
@ -5464,6 +5469,12 @@ $HorzAlign = Center
settings.Tools.TextToSpeechEngine = subNode.InnerText; settings.Tools.TextToSpeechEngine = subNode.InnerText;
} }
subNode = node.SelectSingleNode("TextToSpeechLastVoice");
if (subNode != null)
{
settings.Tools.TextToSpeechLastVoice = subNode.InnerText;
}
subNode = node.SelectSingleNode("TextToSpeechElevenLabsApiKey"); subNode = node.SelectSingleNode("TextToSpeechElevenLabsApiKey");
if (subNode != null) if (subNode != null)
{ {
@ -7176,6 +7187,24 @@ $HorzAlign = Center
settings.Tools.GenVideoDeleteInputVideoFile = Convert.ToBoolean(subNode.InnerText, CultureInfo.InvariantCulture); settings.Tools.GenVideoDeleteInputVideoFile = Convert.ToBoolean(subNode.InnerText, CultureInfo.InvariantCulture);
} }
subNode = node.SelectSingleNode("GenVideoUseOutputFolder");
if (subNode != null)
{
settings.Tools.GenVideoUseOutputFolder = Convert.ToBoolean(subNode.InnerText, CultureInfo.InvariantCulture);
}
subNode = node.SelectSingleNode("GenVideoOutputFolder");
if (subNode != null)
{
settings.Tools.GenVideoOutputFolder = subNode.InnerText;
}
subNode = node.SelectSingleNode("GenVideoOutputFileSuffix");
if (subNode != null)
{
settings.Tools.GenVideoOutputFileSuffix = subNode.InnerText;
}
subNode = node.SelectSingleNode("VoskPostProcessing"); subNode = node.SelectSingleNode("VoskPostProcessing");
if (subNode != null) if (subNode != null)
@ -11992,6 +12021,7 @@ $HorzAlign = Center
textWriter.WriteElementString("AutoTranslateDelaySeconds", settings.Tools.AutoTranslateDelaySeconds.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("AutoTranslateDelaySeconds", settings.Tools.AutoTranslateDelaySeconds.ToString(CultureInfo.InvariantCulture));
textWriter.WriteElementString("GeminiProApiKey", settings.Tools.GeminiProApiKey); textWriter.WriteElementString("GeminiProApiKey", settings.Tools.GeminiProApiKey);
textWriter.WriteElementString("TextToSpeechEngine", settings.Tools.TextToSpeechEngine); textWriter.WriteElementString("TextToSpeechEngine", settings.Tools.TextToSpeechEngine);
textWriter.WriteElementString("TextToSpeechLastVoice", settings.Tools.TextToSpeechLastVoice);
textWriter.WriteElementString("TextToSpeechElevenLabsApiKey", settings.Tools.TextToSpeechElevenLabsApiKey); textWriter.WriteElementString("TextToSpeechElevenLabsApiKey", settings.Tools.TextToSpeechElevenLabsApiKey);
textWriter.WriteElementString("DisableVidoInfoViaLabel", settings.Tools.DisableVidoInfoViaLabel.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("DisableVidoInfoViaLabel", settings.Tools.DisableVidoInfoViaLabel.ToString(CultureInfo.InvariantCulture));
textWriter.WriteElementString("ListViewSyntaxColorDurationSmall", settings.Tools.ListViewSyntaxColorDurationSmall.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("ListViewSyntaxColorDurationSmall", settings.Tools.ListViewSyntaxColorDurationSmall.ToString(CultureInfo.InvariantCulture));
@ -12275,6 +12305,9 @@ $HorzAlign = Center
textWriter.WriteElementString("GenVideoEmbedOutputSuffix", settings.Tools.GenVideoEmbedOutputSuffix); textWriter.WriteElementString("GenVideoEmbedOutputSuffix", settings.Tools.GenVideoEmbedOutputSuffix);
textWriter.WriteElementString("GenVideoEmbedOutputReplace", settings.Tools.GenVideoEmbedOutputReplace); textWriter.WriteElementString("GenVideoEmbedOutputReplace", settings.Tools.GenVideoEmbedOutputReplace);
textWriter.WriteElementString("GenVideoDeleteInputVideoFile", settings.Tools.GenVideoDeleteInputVideoFile.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("GenVideoDeleteInputVideoFile", settings.Tools.GenVideoDeleteInputVideoFile.ToString(CultureInfo.InvariantCulture));
textWriter.WriteElementString("GenVideoUseOutputFolder", settings.Tools.GenVideoUseOutputFolder.ToString(CultureInfo.InvariantCulture));
textWriter.WriteElementString("GenVideoOutputFileSuffix", settings.Tools.GenVideoOutputFolder);
textWriter.WriteElementString("GenVideoOutputFileSuffix", settings.Tools.GenVideoOutputFileSuffix);
textWriter.WriteElementString("VoskPostProcessing", settings.Tools.VoskPostProcessing.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("VoskPostProcessing", settings.Tools.VoskPostProcessing.ToString(CultureInfo.InvariantCulture));
textWriter.WriteElementString("VoskModel", settings.Tools.VoskModel); textWriter.WriteElementString("VoskModel", settings.Tools.VoskModel);
textWriter.WriteElementString("WhisperChoice", settings.Tools.WhisperChoice); textWriter.WriteElementString("WhisperChoice", settings.Tools.WhisperChoice);

View File

@ -37,20 +37,7 @@ namespace Nikse.SubtitleEdit.Forms
this.buttonCancel = new System.Windows.Forms.Button(); this.buttonCancel = new System.Windows.Forms.Button();
this.timer1 = new System.Windows.Forms.Timer(this.components); this.timer1 = new System.Windows.Forms.Timer(this.components);
this.groupBoxSettings = new System.Windows.Forms.GroupBox(); this.groupBoxSettings = new System.Windows.Forms.GroupBox();
this.listViewBatch = new System.Windows.Forms.ListView(); this.buttonOutputFileSettings = new System.Windows.Forms.Button();
this.columnHeaderVideoFile = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderResolution = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderSubtitleFile = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStripBatch = new System.Windows.Forms.ContextMenuStrip(this.components);
this.addFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.pickSubtitleFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeSubtitleFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.buttonClear = new System.Windows.Forms.Button(); this.buttonClear = new System.Windows.Forms.Button();
this.panelForeColor = new System.Windows.Forms.Panel(); this.panelForeColor = new System.Windows.Forms.Panel();
this.buttonRemoveFile = new System.Windows.Forms.Button(); this.buttonRemoveFile = new System.Windows.Forms.Button();
@ -109,9 +96,24 @@ namespace Nikse.SubtitleEdit.Forms
this.labelFileName = new Nikse.SubtitleEdit.Controls.NikseLabel(); this.labelFileName = new Nikse.SubtitleEdit.Controls.NikseLabel();
this.numericUpDownFontSize = new Nikse.SubtitleEdit.Controls.NikseUpDown(); this.numericUpDownFontSize = new Nikse.SubtitleEdit.Controls.NikseUpDown();
this.labelFontSize = new Nikse.SubtitleEdit.Controls.NikseLabel(); this.labelFontSize = new Nikse.SubtitleEdit.Controls.NikseLabel();
this.listViewBatch = new System.Windows.Forms.ListView();
this.columnHeaderVideoFile = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderResolution = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderSubtitleFile = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStripBatch = new System.Windows.Forms.ContextMenuStrip(this.components);
this.addFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.pickSubtitleFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeSubtitleFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.buttonPreview = new System.Windows.Forms.Button(); this.buttonPreview = new System.Windows.Forms.Button();
this.linkLabelHelp = new System.Windows.Forms.LinkLabel(); this.linkLabelHelp = new System.Windows.Forms.LinkLabel();
this.contextMenuStripRes = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStripRes = new System.Windows.Forms.ContextMenuStrip(this.components);
this.useSourceResolutionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.x2160ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.x2160ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.uHD3840x2160ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.uHD3840x2160ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.k2048x1080ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.k2048x1080ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -134,10 +136,10 @@ namespace Nikse.SubtitleEdit.Forms
this.textBoxLog = new Nikse.SubtitleEdit.Controls.NikseTextBox(); this.textBoxLog = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.contextMenuStripGenerate.SuspendLayout(); this.contextMenuStripGenerate.SuspendLayout();
this.groupBoxSettings.SuspendLayout(); this.groupBoxSettings.SuspendLayout();
this.contextMenuStripBatch.SuspendLayout();
this.groupBoxCut.SuspendLayout(); this.groupBoxCut.SuspendLayout();
this.groupBoxVideo.SuspendLayout(); this.groupBoxVideo.SuspendLayout();
this.groupBoxAudio.SuspendLayout(); this.groupBoxAudio.SuspendLayout();
this.contextMenuStripBatch.SuspendLayout();
this.contextMenuStripRes.SuspendLayout(); this.contextMenuStripRes.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -201,6 +203,7 @@ namespace Nikse.SubtitleEdit.Forms
this.groupBoxSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.groupBoxSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxSettings.Controls.Add(this.buttonOutputFileSettings);
this.groupBoxSettings.Controls.Add(this.buttonClear); this.groupBoxSettings.Controls.Add(this.buttonClear);
this.groupBoxSettings.Controls.Add(this.panelForeColor); this.groupBoxSettings.Controls.Add(this.panelForeColor);
this.groupBoxSettings.Controls.Add(this.buttonRemoveFile); this.groupBoxSettings.Controls.Add(this.buttonRemoveFile);
@ -233,114 +236,16 @@ namespace Nikse.SubtitleEdit.Forms
this.groupBoxSettings.TabStop = false; this.groupBoxSettings.TabStop = false;
this.groupBoxSettings.Text = "Settings"; this.groupBoxSettings.Text = "Settings";
// //
// listViewBatch // buttonOutputFileSettings
// //
this.listViewBatch.AllowDrop = true; this.buttonOutputFileSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.listViewBatch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.buttonOutputFileSettings.Location = new System.Drawing.Point(245, 513);
| System.Windows.Forms.AnchorStyles.Left) this.buttonOutputFileSettings.Name = "buttonOutputFileSettings";
| System.Windows.Forms.AnchorStyles.Right))); this.buttonOutputFileSettings.Size = new System.Drawing.Size(167, 23);
this.listViewBatch.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.buttonOutputFileSettings.TabIndex = 148;
this.columnHeaderVideoFile, this.buttonOutputFileSettings.Text = "Output file/folder...";
this.columnHeaderResolution, this.buttonOutputFileSettings.UseVisualStyleBackColor = true;
this.columnHeaderSize, this.buttonOutputFileSettings.Click += new System.EventHandler(this.buttonOutputFileSettings_Click);
this.columnHeaderSubtitleFile,
this.columnHeaderStatus});
this.listViewBatch.ContextMenuStrip = this.contextMenuStripBatch;
this.listViewBatch.FullRowSelect = true;
this.listViewBatch.HideSelection = false;
this.listViewBatch.Location = new System.Drawing.Point(6, 316);
this.listViewBatch.Name = "listViewBatch";
this.listViewBatch.Size = new System.Drawing.Size(852, 191);
this.listViewBatch.TabIndex = 3;
this.listViewBatch.UseCompatibleStateImageBehavior = false;
this.listViewBatch.View = System.Windows.Forms.View.Details;
this.listViewBatch.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewBatch_DragDrop);
this.listViewBatch.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewBatch_DragEnter);
this.listViewBatch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewBatch_KeyDown);
//
// columnHeaderVideoFile
//
this.columnHeaderVideoFile.Text = "Video file";
this.columnHeaderVideoFile.Width = 420;
//
// columnHeaderResolution
//
this.columnHeaderResolution.Text = "Resolution";
this.columnHeaderResolution.Width = 80;
//
// columnHeaderSize
//
this.columnHeaderSize.Text = "Size";
this.columnHeaderSize.Width = 80;
//
// columnHeaderSubtitleFile
//
this.columnHeaderSubtitleFile.Text = "Subtitle file";
this.columnHeaderSubtitleFile.Width = 180;
//
// columnHeaderStatus
//
this.columnHeaderStatus.Text = "Status";
this.columnHeaderStatus.Width = 80;
//
// contextMenuStripBatch
//
this.contextMenuStripBatch.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addFilesToolStripMenuItem,
this.toolStripSeparator2,
this.pickSubtitleFileToolStripMenuItem,
this.removeSubtitleFileToolStripMenuItem,
this.toolStripSeparator1,
this.deleteToolStripMenuItem,
this.clearToolStripMenuItem});
this.contextMenuStripBatch.Name = "contextMenuStripBatch";
this.contextMenuStripBatch.Size = new System.Drawing.Size(179, 126);
this.contextMenuStripBatch.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripBatch_Opening);
//
// addFilesToolStripMenuItem
//
this.addFilesToolStripMenuItem.Name = "addFilesToolStripMenuItem";
this.addFilesToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.addFilesToolStripMenuItem.Text = "Add video files...";
this.addFilesToolStripMenuItem.Click += new System.EventHandler(this.addFilesToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(175, 6);
//
// pickSubtitleFileToolStripMenuItem
//
this.pickSubtitleFileToolStripMenuItem.Name = "pickSubtitleFileToolStripMenuItem";
this.pickSubtitleFileToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.pickSubtitleFileToolStripMenuItem.Text = "Pick subtitle file...";
this.pickSubtitleFileToolStripMenuItem.Click += new System.EventHandler(this.pickSubtitleFileToolStripMenuItem_Click);
//
// removeSubtitleFileToolStripMenuItem
//
this.removeSubtitleFileToolStripMenuItem.Name = "removeSubtitleFileToolStripMenuItem";
this.removeSubtitleFileToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.removeSubtitleFileToolStripMenuItem.Text = "Remove subtitle file";
this.removeSubtitleFileToolStripMenuItem.Click += new System.EventHandler(this.removeSubtitleFileToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(175, 6);
//
// deleteToolStripMenuItem
//
this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
this.deleteToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.deleteToolStripMenuItem.Text = "Delete";
this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);
//
// clearToolStripMenuItem
//
this.clearToolStripMenuItem.Name = "clearToolStripMenuItem";
this.clearToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.clearToolStripMenuItem.Text = "Clear";
this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click);
// //
// buttonClear // buttonClear
// //
@ -1397,6 +1302,115 @@ namespace Nikse.SubtitleEdit.Forms
this.labelFontSize.TabIndex = 0; this.labelFontSize.TabIndex = 0;
this.labelFontSize.Text = "Font size"; this.labelFontSize.Text = "Font size";
// //
// listViewBatch
//
this.listViewBatch.AllowDrop = true;
this.listViewBatch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listViewBatch.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeaderVideoFile,
this.columnHeaderResolution,
this.columnHeaderSize,
this.columnHeaderSubtitleFile,
this.columnHeaderStatus});
this.listViewBatch.ContextMenuStrip = this.contextMenuStripBatch;
this.listViewBatch.FullRowSelect = true;
this.listViewBatch.HideSelection = false;
this.listViewBatch.Location = new System.Drawing.Point(6, 316);
this.listViewBatch.Name = "listViewBatch";
this.listViewBatch.Size = new System.Drawing.Size(852, 191);
this.listViewBatch.TabIndex = 3;
this.listViewBatch.UseCompatibleStateImageBehavior = false;
this.listViewBatch.View = System.Windows.Forms.View.Details;
this.listViewBatch.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewBatch_DragDrop);
this.listViewBatch.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewBatch_DragEnter);
this.listViewBatch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewBatch_KeyDown);
//
// columnHeaderVideoFile
//
this.columnHeaderVideoFile.Text = "Video file";
this.columnHeaderVideoFile.Width = 420;
//
// columnHeaderResolution
//
this.columnHeaderResolution.Text = "Resolution";
this.columnHeaderResolution.Width = 80;
//
// columnHeaderSize
//
this.columnHeaderSize.Text = "Size";
this.columnHeaderSize.Width = 80;
//
// columnHeaderSubtitleFile
//
this.columnHeaderSubtitleFile.Text = "Subtitle file";
this.columnHeaderSubtitleFile.Width = 180;
//
// columnHeaderStatus
//
this.columnHeaderStatus.Text = "Status";
this.columnHeaderStatus.Width = 80;
//
// contextMenuStripBatch
//
this.contextMenuStripBatch.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addFilesToolStripMenuItem,
this.toolStripSeparator2,
this.pickSubtitleFileToolStripMenuItem,
this.removeSubtitleFileToolStripMenuItem,
this.toolStripSeparator1,
this.deleteToolStripMenuItem,
this.clearToolStripMenuItem});
this.contextMenuStripBatch.Name = "contextMenuStripBatch";
this.contextMenuStripBatch.Size = new System.Drawing.Size(179, 126);
this.contextMenuStripBatch.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripBatch_Opening);
//
// addFilesToolStripMenuItem
//
this.addFilesToolStripMenuItem.Name = "addFilesToolStripMenuItem";
this.addFilesToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.addFilesToolStripMenuItem.Text = "Add video files...";
this.addFilesToolStripMenuItem.Click += new System.EventHandler(this.addFilesToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(175, 6);
//
// pickSubtitleFileToolStripMenuItem
//
this.pickSubtitleFileToolStripMenuItem.Name = "pickSubtitleFileToolStripMenuItem";
this.pickSubtitleFileToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.pickSubtitleFileToolStripMenuItem.Text = "Pick subtitle file...";
this.pickSubtitleFileToolStripMenuItem.Click += new System.EventHandler(this.pickSubtitleFileToolStripMenuItem_Click);
//
// removeSubtitleFileToolStripMenuItem
//
this.removeSubtitleFileToolStripMenuItem.Name = "removeSubtitleFileToolStripMenuItem";
this.removeSubtitleFileToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.removeSubtitleFileToolStripMenuItem.Text = "Remove subtitle file";
this.removeSubtitleFileToolStripMenuItem.Click += new System.EventHandler(this.removeSubtitleFileToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(175, 6);
//
// deleteToolStripMenuItem
//
this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
this.deleteToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.deleteToolStripMenuItem.Text = "Delete";
this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);
//
// clearToolStripMenuItem
//
this.clearToolStripMenuItem.Name = "clearToolStripMenuItem";
this.clearToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.clearToolStripMenuItem.Text = "Clear";
this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click);
//
// buttonPreview // buttonPreview
// //
this.buttonPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
@ -1423,6 +1437,7 @@ namespace Nikse.SubtitleEdit.Forms
// contextMenuStripRes // contextMenuStripRes
// //
this.contextMenuStripRes.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.contextMenuStripRes.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.useSourceResolutionToolStripMenuItem,
this.x2160ToolStripMenuItem, this.x2160ToolStripMenuItem,
this.uHD3840x2160ToolStripMenuItem, this.uHD3840x2160ToolStripMenuItem,
this.k2048x1080ToolStripMenuItem, this.k2048x1080ToolStripMenuItem,
@ -1438,7 +1453,15 @@ namespace Nikse.SubtitleEdit.Forms
this.x352ToolStripMenuItem, this.x352ToolStripMenuItem,
this.x272ToolStripMenuItem}); this.x272ToolStripMenuItem});
this.contextMenuStripRes.Name = "contextMenuStripRes"; this.contextMenuStripRes.Name = "contextMenuStripRes";
this.contextMenuStripRes.Size = new System.Drawing.Size(204, 312); this.contextMenuStripRes.Size = new System.Drawing.Size(204, 334);
this.contextMenuStripRes.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripRes_Opening);
//
// useSourceResolutionToolStripMenuItem
//
this.useSourceResolutionToolStripMenuItem.Name = "useSourceResolutionToolStripMenuItem";
this.useSourceResolutionToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
this.useSourceResolutionToolStripMenuItem.Text = "Use source resoluton";
this.useSourceResolutionToolStripMenuItem.Click += new System.EventHandler(this.useSourceResolutionToolStripMenuItem_Click);
// //
// x2160ToolStripMenuItem // x2160ToolStripMenuItem
// //
@ -1631,13 +1654,13 @@ namespace Nikse.SubtitleEdit.Forms
this.contextMenuStripGenerate.ResumeLayout(false); this.contextMenuStripGenerate.ResumeLayout(false);
this.groupBoxSettings.ResumeLayout(false); this.groupBoxSettings.ResumeLayout(false);
this.groupBoxSettings.PerformLayout(); this.groupBoxSettings.PerformLayout();
this.contextMenuStripBatch.ResumeLayout(false);
this.groupBoxCut.ResumeLayout(false); this.groupBoxCut.ResumeLayout(false);
this.groupBoxCut.PerformLayout(); this.groupBoxCut.PerformLayout();
this.groupBoxVideo.ResumeLayout(false); this.groupBoxVideo.ResumeLayout(false);
this.groupBoxVideo.PerformLayout(); this.groupBoxVideo.PerformLayout();
this.groupBoxAudio.ResumeLayout(false); this.groupBoxAudio.ResumeLayout(false);
this.groupBoxAudio.PerformLayout(); this.groupBoxAudio.PerformLayout();
this.contextMenuStripBatch.ResumeLayout(false);
this.contextMenuStripRes.ResumeLayout(false); this.contextMenuStripRes.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -1748,5 +1771,7 @@ namespace Nikse.SubtitleEdit.Forms
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem removeSubtitleFileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem removeSubtitleFileToolStripMenuItem;
private System.Windows.Forms.ColumnHeader columnHeaderResolution; private System.Windows.Forms.ColumnHeader columnHeaderResolution;
private System.Windows.Forms.ToolStripMenuItem useSourceResolutionToolStripMenuItem;
private System.Windows.Forms.Button buttonOutputFileSettings;
} }
} }

View File

@ -42,8 +42,8 @@ namespace Nikse.SubtitleEdit.Forms
public bool BatchMode { get; set; } public bool BatchMode { get; set; }
public string BatchInfo { get; set; } public string BatchInfo { get; set; }
private readonly List<BatchVideoAndSub> _batchVideoAndSubList; private readonly List<BatchVideoAndSub> _batchVideoAndSubList;
private const int ListViewBatchSubItemIndexColumnSubtitleFile = 2; private const int ListViewBatchSubItemIndexColumnSubtitleFile = 3;
private const int ListViewBatchSubItemIndexColumnStatus = 3; private const int ListViewBatchSubItemIndexColumnStatus = 4;
public class BatchVideoAndSub public class BatchVideoAndSub
{ {
@ -314,11 +314,13 @@ namespace Nikse.SubtitleEdit.Forms
buttonRemoveFile.Visible = BatchMode; buttonRemoveFile.Visible = BatchMode;
buttonClear.Visible = BatchMode; buttonClear.Visible = BatchMode;
buttonAddFile.Visible = BatchMode; buttonAddFile.Visible = BatchMode;
buttonOutputFileSettings.Visible = BatchMode;
var audioTracks = _mediaInfo.Tracks.Where(p => p.TrackType == FfmpegTrackType.Audio).ToList(); var audioTracks = _mediaInfo.Tracks.Where(p => p.TrackType == FfmpegTrackType.Audio).ToList();
if (BatchMode) if (BatchMode)
{ {
listViewAudioTracks.Visible = false; listViewAudioTracks.Visible = false;
useSourceResolutionToolStripMenuItem_Click(null, null);
} }
else if (audioTracks.Count > 1) else if (audioTracks.Count > 1)
{ {
@ -437,9 +439,13 @@ namespace Nikse.SubtitleEdit.Forms
Stopwatch stopWatch; Stopwatch stopWatch;
if (BatchMode) if (BatchMode)
{ {
checkBoxTargetFileSize.Checked = false;
var useSourceResolution = numericUpDownWidth.Value == 0 && numericUpDownHeight.Value == 0;
listViewBatch.SelectedIndices.Clear();
stopWatch = Stopwatch.StartNew(); stopWatch = Stopwatch.StartNew();
var sbInfo = new StringBuilder(); var sbInfo = new StringBuilder();
sbInfo.AppendLine($"Input for convert: {_batchVideoAndSubList.Count} video files:"); sbInfo.AppendLine("Conversion report:");
sbInfo.AppendLine(); sbInfo.AppendLine();
var okCount = 0; var okCount = 0;
var failCount = 0; var failCount = 0;
@ -447,6 +453,12 @@ namespace Nikse.SubtitleEdit.Forms
{ {
var videoAndSub = _batchVideoAndSubList[index]; var videoAndSub = _batchVideoAndSubList[index];
_videoInfo = UiUtil.GetVideoInfo(videoAndSub.VideoFileName); _videoInfo = UiUtil.GetVideoInfo(videoAndSub.VideoFileName);
if (useSourceResolution)
{
numericUpDownWidth.Value = _videoInfo.Width;
numericUpDownHeight.Value = _videoInfo.Height;
}
var subtitle = new Subtitle(); var subtitle = new Subtitle();
if (!string.IsNullOrEmpty(videoAndSub.SubtitleFileName) & File.Exists(videoAndSub.SubtitleFileName)) if (!string.IsNullOrEmpty(videoAndSub.SubtitleFileName) & File.Exists(videoAndSub.SubtitleFileName))
{ {
@ -454,14 +466,21 @@ namespace Nikse.SubtitleEdit.Forms
} }
var path = Path.GetDirectoryName(videoAndSub.VideoFileName); var path = Path.GetDirectoryName(videoAndSub.VideoFileName);
if (Configuration.Settings.Tools.GenVideoUseOutputFolder &&
!string.IsNullOrEmpty(Configuration.Settings.Tools.GenVideoOutputFolder) &&
Directory.Exists(Configuration.Settings.Tools.GenVideoOutputFolder))
{
path = Configuration.Settings.Tools.GenVideoOutputFolder;
}
var nameNoExt = Path.GetFileNameWithoutExtension(videoAndSub.VideoFileName); var nameNoExt = Path.GetFileNameWithoutExtension(videoAndSub.VideoFileName);
var ext = Path.GetExtension(videoAndSub.VideoFileName); var ext = Path.GetExtension(videoAndSub.VideoFileName);
VideoFileName = Path.Combine(path, $"{nameNoExt.TrimEnd('.', '.')}_new{ext}"); VideoFileName = Path.Combine(path, $"{nameNoExt.TrimEnd('.', '.')}{Configuration.Settings.Tools.GenVideoOutputFileSuffix}{ext}");
if (File.Exists(VideoFileName)) if (File.Exists(VideoFileName))
{ {
for (var i = 2; i < int.MaxValue; i++) for (var i = 2; i < int.MaxValue; i++)
{ {
VideoFileName = Path.Combine(path, $"{nameNoExt.TrimEnd('.', '.')}_new_{i}{ext}"); VideoFileName = Path.Combine(path, $"{nameNoExt.TrimEnd('.', '.')}{Configuration.Settings.Tools.GenVideoOutputFileSuffix}_{i}{ext}");
if (!File.Exists(VideoFileName)) if (!File.Exists(VideoFileName))
{ {
break; break;
@ -469,9 +488,9 @@ namespace Nikse.SubtitleEdit.Forms
} }
} }
if (File.Exists(VideoFileName)) listViewBatch.Items[index].Selected = true;
{ listViewBatch.Items[index].Focused = true;
} listViewBatch.Items[index].EnsureVisible();
if (ConvertVideo(oldFontSizeEnabled, videoAndSub.VideoFileName, subtitle)) if (ConvertVideo(oldFontSizeEnabled, videoAndSub.VideoFileName, subtitle))
{ {
@ -488,10 +507,20 @@ namespace Nikse.SubtitleEdit.Forms
} }
sbInfo.AppendLine(); sbInfo.AppendLine();
sbInfo.AppendLine($"Video files converted in {stopWatch.Elapsed}: {okCount}");
var timeString = $"{stopWatch.Elapsed.Hours + stopWatch.Elapsed.Days * 24:00}:{stopWatch.Elapsed.Minutes:00}:{stopWatch.Elapsed.Seconds:00}";
if (okCount == 1)
{
sbInfo.AppendLine($"One video file converted in {timeString}");
}
else
{
sbInfo.AppendLine($"{okCount} video files converted in {timeString}");
}
if (failCount > 0) if (failCount > 0)
{ {
sbInfo.AppendLine($"Video files failed: {failCount}"); sbInfo.AppendLine($"{failCount} video file(s) failed!");
} }
BatchInfo = sbInfo.ToString(); BatchInfo = sbInfo.ToString();
@ -703,7 +732,10 @@ namespace Nikse.SubtitleEdit.Forms
fileName += ".burn-in"; fileName += ".burn-in";
fileName += $".{numericUpDownWidth.Value}x{numericUpDownHeight.Value}"; if (numericUpDownWidth.Value > 0 && numericUpDownHeight.Value > 0)
{
fileName += $".{numericUpDownWidth.Value}x{numericUpDownHeight.Value}";
}
if (comboBoxVideoEncoding.Text == "libx265" || comboBoxVideoEncoding.Text == "hevc_nvenc" || comboBoxVideoEncoding.Text == "hevc_amf") if (comboBoxVideoEncoding.Text == "libx265" || comboBoxVideoEncoding.Text == "hevc_nvenc" || comboBoxVideoEncoding.Text == "hevc_amf")
{ {
@ -1503,20 +1535,7 @@ namespace Nikse.SubtitleEdit.Forms
private void MediaPlayer_OnButtonClicked(object sender, EventArgs e) private void MediaPlayer_OnButtonClicked(object sender, EventArgs e)
{ {
if (sender is PictureBox pb && pb.Name == "_pictureBoxFullscreenOver")
{
if (_previewVideo != null && !_previewVideo.IsDisposed)
{
_previewVideo.Close();
_previewVideo.Dispose();
_previewVideo = null;
}
else
{
_previewVideo = new PreviewVideo(_inputVideoFileName, _mpvSubtitleFileName, _assaSubtitle, true);
_previewVideo.Show(this);
}
}
} }
private void checkBoxTargetFileSize_CheckedChanged(object sender, EventArgs e) private void checkBoxTargetFileSize_CheckedChanged(object sender, EventArgs e)
@ -1715,6 +1734,11 @@ namespace Nikse.SubtitleEdit.Forms
private void ResolutionPickClick(object sender, EventArgs e) private void ResolutionPickClick(object sender, EventArgs e)
{ {
labelX.Left = numericUpDownWidth.Left + numericUpDownWidth.Width + 3;
numericUpDownWidth.Visible = true;
labelX.Text = "x";
numericUpDownHeight.Visible = true;
var text = (sender as ToolStripMenuItem).Text; var text = (sender as ToolStripMenuItem).Text;
var match = new Regex("\\d+x\\d+").Match(text); var match = new Regex("\\d+x\\d+").Match(text);
var parts = match.Value.Split('x'); var parts = match.Value.Split('x');
@ -1974,11 +1998,27 @@ namespace Nikse.SubtitleEdit.Forms
buttonAddFile.Visible = BatchMode; buttonAddFile.Visible = BatchMode;
buttonRemoveFile.Visible = BatchMode; buttonRemoveFile.Visible = BatchMode;
buttonClear.Visible = BatchMode; buttonClear.Visible = BatchMode;
buttonOutputFileSettings.Visible = BatchMode;
buttonMode.Text = BatchMode buttonMode.Text = BatchMode
? LanguageSettings.Current.Split.Basic ? LanguageSettings.Current.Split.Basic
: LanguageSettings.Current.AudioToText.BatchMode; : LanguageSettings.Current.AudioToText.BatchMode;
FontEnableOrDisable(BatchMode || _initialFontOn); FontEnableOrDisable(BatchMode || _initialFontOn);
if (!numericUpDownWidth.Visible)
{
var item = new ToolStripMenuItem();
if (_videoInfo == null)
{
item.Text = "(1920x1080)";
}
else
{
item.Text = $"({_videoInfo.Width}x{_videoInfo.Height})";
}
ResolutionPickClick(item, null);
}
} }
private void addFilesToolStripMenuItem_Click(object sender, EventArgs e) private void addFilesToolStripMenuItem_Click(object sender, EventArgs e)
@ -2220,5 +2260,30 @@ namespace Nikse.SubtitleEdit.Forms
_batchVideoAndSubList[i].SubtitleFileName = null; _batchVideoAndSubList[i].SubtitleFileName = null;
} }
} }
private void buttonOutputFileSettings_Click(object sender, EventArgs e)
{
using (var form = new GenerateVideoWithHardSubsOutFile())
{
form.ShowDialog(this);
}
}
private void useSourceResolutionToolStripMenuItem_Click(object sender, EventArgs e)
{
numericUpDownWidth.Visible = false;
numericUpDownHeight.Visible = false;
labelX.Left = numericUpDownWidth.Left;
labelX.Text = "Use source";
numericUpDownWidth.Value = 0;
numericUpDownHeight.Value = 0;
}
private void contextMenuStripRes_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
useSourceResolutionToolStripMenuItem.Visible = BatchMode;
}
} }
} }

View File

@ -0,0 +1,183 @@
namespace Nikse.SubtitleEdit.Forms
{
partial class GenerateVideoWithHardSubsOutFile
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.radioButtonSaveInOutputFolder = new System.Windows.Forms.RadioButton();
this.linkLabelOpenOutputFolder = new System.Windows.Forms.LinkLabel();
this.buttonChooseFolder = new System.Windows.Forms.Button();
this.textBoxOutputFolder = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.radioButtonSaveInSourceFolder = new System.Windows.Forms.RadioButton();
this.labelSuffix = new System.Windows.Forms.Label();
this.textBoxSuffix = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.buttonCancel = new System.Windows.Forms.Button();
this.buttonOK = new System.Windows.Forms.Button();
this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
this.SuspendLayout();
//
// radioButtonSaveInOutputFolder
//
this.radioButtonSaveInOutputFolder.AutoSize = true;
this.radioButtonSaveInOutputFolder.Location = new System.Drawing.Point(21, 54);
this.radioButtonSaveInOutputFolder.Name = "radioButtonSaveInOutputFolder";
this.radioButtonSaveInOutputFolder.Size = new System.Drawing.Size(154, 17);
this.radioButtonSaveInOutputFolder.TabIndex = 6;
this.radioButtonSaveInOutputFolder.Text = "Save in output folder below";
this.radioButtonSaveInOutputFolder.UseVisualStyleBackColor = true;
this.radioButtonSaveInOutputFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInOutputFolder_CheckedChanged);
//
// linkLabelOpenOutputFolder
//
this.linkLabelOpenOutputFolder.AutoSize = true;
this.linkLabelOpenOutputFolder.Location = new System.Drawing.Point(368, 83);
this.linkLabelOpenOutputFolder.Name = "linkLabelOpenOutputFolder";
this.linkLabelOpenOutputFolder.Size = new System.Drawing.Size(42, 13);
this.linkLabelOpenOutputFolder.TabIndex = 9;
this.linkLabelOpenOutputFolder.TabStop = true;
this.linkLabelOpenOutputFolder.Text = "Open...";
this.linkLabelOpenOutputFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenOutputFolder_LinkClicked);
//
// buttonChooseFolder
//
this.buttonChooseFolder.Enabled = false;
this.buttonChooseFolder.Location = new System.Drawing.Point(336, 78);
this.buttonChooseFolder.Name = "buttonChooseFolder";
this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23);
this.buttonChooseFolder.TabIndex = 8;
this.buttonChooseFolder.Text = "...";
this.buttonChooseFolder.UseVisualStyleBackColor = true;
this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click);
//
// textBoxOutputFolder
//
this.textBoxOutputFolder.Enabled = false;
this.textBoxOutputFolder.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.textBoxOutputFolder.Location = new System.Drawing.Point(28, 81);
this.textBoxOutputFolder.Name = "textBoxOutputFolder";
this.textBoxOutputFolder.Size = new System.Drawing.Size(302, 20);
this.textBoxOutputFolder.TabIndex = 7;
//
// radioButtonSaveInSourceFolder
//
this.radioButtonSaveInSourceFolder.AutoSize = true;
this.radioButtonSaveInSourceFolder.Checked = true;
this.radioButtonSaveInSourceFolder.Location = new System.Drawing.Point(21, 23);
this.radioButtonSaveInSourceFolder.Name = "radioButtonSaveInSourceFolder";
this.radioButtonSaveInSourceFolder.Size = new System.Drawing.Size(141, 17);
this.radioButtonSaveInSourceFolder.TabIndex = 5;
this.radioButtonSaveInSourceFolder.TabStop = true;
this.radioButtonSaveInSourceFolder.Text = "Save in source file folder";
this.radioButtonSaveInSourceFolder.UseVisualStyleBackColor = true;
this.radioButtonSaveInSourceFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInSourceFolder_CheckedChanged);
//
// labelSuffix
//
this.labelSuffix.AutoSize = true;
this.labelSuffix.Location = new System.Drawing.Point(21, 135);
this.labelSuffix.Name = "labelSuffix";
this.labelSuffix.Size = new System.Drawing.Size(79, 13);
this.labelSuffix.TabIndex = 11;
this.labelSuffix.Text = "File name suffix";
//
// textBoxSuffix
//
this.textBoxSuffix.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.textBoxSuffix.Location = new System.Drawing.Point(21, 151);
this.textBoxSuffix.Name = "textBoxSuffix";
this.textBoxSuffix.Size = new System.Drawing.Size(309, 20);
this.textBoxSuffix.TabIndex = 12;
//
// buttonCancel
//
this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonCancel.Location = new System.Drawing.Point(349, 214);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
this.buttonCancel.TabIndex = 105;
this.buttonCancel.Text = "C&ancel";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(268, 214);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 23);
this.buttonOK.TabIndex = 104;
this.buttonOK.Text = "&OK";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// GenerateVideoWithHardSubsOutFile
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(436, 249);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.labelSuffix);
this.Controls.Add(this.textBoxSuffix);
this.Controls.Add(this.radioButtonSaveInOutputFolder);
this.Controls.Add(this.linkLabelOpenOutputFolder);
this.Controls.Add(this.buttonChooseFolder);
this.Controls.Add(this.textBoxOutputFolder);
this.Controls.Add(this.radioButtonSaveInSourceFolder);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "GenerateVideoWithHardSubsOutFile";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "GenerateVideoWithHardSubsOutFile";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GenerateVideoWithHardSubsOutFile_KeyDown);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.RadioButton radioButtonSaveInOutputFolder;
private System.Windows.Forms.LinkLabel linkLabelOpenOutputFolder;
private System.Windows.Forms.Button buttonChooseFolder;
private Controls.NikseTextBox textBoxOutputFolder;
private System.Windows.Forms.RadioButton radioButtonSaveInSourceFolder;
private System.Windows.Forms.Label labelSuffix;
private Controls.NikseTextBox textBoxSuffix;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;
}
}

View File

@ -0,0 +1,130 @@
using Nikse.SubtitleEdit.Logic;
using System;
using System.IO;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Core.Common;
namespace Nikse.SubtitleEdit.Forms
{
public partial class GenerateVideoWithHardSubsOutFile : Form
{
public GenerateVideoWithHardSubsOutFile()
{
UiUtil.PreInitialize(this);
InitializeComponent();
UiUtil.FixFonts(this);
labelSuffix.Text = LanguageSettings.Current.Settings.Suffix;
buttonOK.Text = LanguageSettings.Current.General.Ok;
buttonCancel.Text = LanguageSettings.Current.General.Cancel;
if (string.IsNullOrEmpty(Configuration.Settings.Tools.GenVideoOutputFolder) || !Directory.Exists(Configuration.Settings.Tools.GenVideoOutputFolder))
{
textBoxOutputFolder.Text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Output");
}
else
{
textBoxOutputFolder.Text = Configuration.Settings.Tools.GenVideoOutputFolder;
}
textBoxSuffix.Text = Configuration.Settings.Tools.GenVideoOutputFileSuffix;
if (Configuration.Settings.Tools.GenVideoUseOutputFolder)
{
radioButtonSaveInOutputFolder.Checked = true;
}
else
{
radioButtonSaveInSourceFolder.Checked = true;
}
radioButtonSaveInSourceFolder_CheckedChanged(null, null);
}
private void GenerateVideoWithHardSubsOutFile_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
DialogResult = DialogResult.Cancel;
}
}
private void buttonOK_Click(object sender, EventArgs e)
{
if (radioButtonSaveInOutputFolder.Checked && string.IsNullOrWhiteSpace(textBoxOutputFolder.Text))
{
MessageBox.Show("Please choose output folder");
return;
}
try
{
if (!Directory.Exists(textBoxOutputFolder.Text))
{
Directory.CreateDirectory(textBoxOutputFolder.Text);
}
}
catch (Exception exception)
{
MessageBox.Show("Please choose output folder" + Environment.NewLine + exception.Message);
return;
}
Configuration.Settings.Tools.GenVideoOutputFolder = textBoxOutputFolder.Text;
Configuration.Settings.Tools.GenVideoOutputFileSuffix = textBoxSuffix.Text;
Configuration.Settings.Tools.GenVideoUseOutputFolder = radioButtonSaveInOutputFolder.Checked;
DialogResult = DialogResult.OK;
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
private void buttonChooseFolder_Click(object sender, EventArgs e)
{
folderBrowserDialog1.ShowNewFolderButton = true;
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
textBoxOutputFolder.Text = folderBrowserDialog1.SelectedPath;
}
}
private void linkLabelOpenOutputFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (!Directory.Exists(textBoxOutputFolder.Text))
{
try
{
Directory.CreateDirectory(textBoxOutputFolder.Text);
}
catch
{
// ignore
}
}
if (Directory.Exists(textBoxOutputFolder.Text))
{
UiUtil.OpenFolder(textBoxOutputFolder.Text);
}
else
{
MessageBox.Show(string.Format(LanguageSettings.Current.SplitSubtitle.FolderNotFoundX, textBoxOutputFolder.Text));
}
}
private void radioButtonSaveInSourceFolder_CheckedChanged(object sender, EventArgs e)
{
textBoxOutputFolder.Enabled = !radioButtonSaveInSourceFolder.Checked;
buttonChooseFolder.Enabled = !radioButtonSaveInSourceFolder.Checked;
}
private void radioButtonSaveInOutputFolder_CheckedChanged(object sender, EventArgs e)
{
textBoxOutputFolder.Enabled = !radioButtonSaveInSourceFolder.Checked;
buttonChooseFolder.Enabled = !radioButtonSaveInSourceFolder.Checked;
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="folderBrowserDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -36804,9 +36804,13 @@ namespace Nikse.SubtitleEdit.Forms
{ {
using (var form = new TextToSpeech(_subtitle, GetCurrentSubtitleFormat(), _videoFileName, _videoInfo)) using (var form = new TextToSpeech(_subtitle, GetCurrentSubtitleFormat(), _videoFileName, _videoInfo))
{ {
if (form.ShowDialog(this) != DialogResult.OK) if (form.ShowDialog(this) == DialogResult.OK)
{ {
return; var idx = FirstSelectedIndex;
_subtitle = form.EditedSubtitle;
SubtitleListview1.Fill(_subtitle, _subtitleOriginal);
_subtitleListViewIndex = -1;
SubtitleListview1.SelectIndexAndEnsureVisibleFaster(idx);
} }
} }
} }

View File

@ -0,0 +1,150 @@
namespace Nikse.SubtitleEdit.Forms.Tts
{
partial class RegenerateAudioClip
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.buttonCancel = new System.Windows.Forms.Button();
this.TextBoxReGenerate = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.buttonReGenerate = new System.Windows.Forms.Button();
this.labelVoice = new System.Windows.Forms.Label();
this.nikseComboBoxVoice = new Nikse.SubtitleEdit.Controls.NikseComboBox();
this.labelText = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// buttonCancel
//
this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonCancel.Location = new System.Drawing.Point(730, 208);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(84, 23);
this.buttonCancel.TabIndex = 7;
this.buttonCancel.Text = "C&ancel";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// TextBoxReGenerate
//
this.TextBoxReGenerate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TextBoxReGenerate.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.TextBoxReGenerate.Location = new System.Drawing.Point(12, 40);
this.TextBoxReGenerate.Multiline = true;
this.TextBoxReGenerate.Name = "TextBoxReGenerate";
this.TextBoxReGenerate.Size = new System.Drawing.Size(802, 162);
this.TextBoxReGenerate.TabIndex = 22;
//
// buttonReGenerate
//
this.buttonReGenerate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonReGenerate.Location = new System.Drawing.Point(550, 208);
this.buttonReGenerate.Name = "buttonReGenerate";
this.buttonReGenerate.Size = new System.Drawing.Size(174, 23);
this.buttonReGenerate.TabIndex = 21;
this.buttonReGenerate.Text = "Regenerate ";
this.buttonReGenerate.UseVisualStyleBackColor = true;
this.buttonReGenerate.Click += new System.EventHandler(this.buttonReGenerate_Click);
//
// labelVoice
//
this.labelVoice.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.labelVoice.AutoSize = true;
this.labelVoice.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelVoice.Location = new System.Drawing.Point(153, 213);
this.labelVoice.Name = "labelVoice";
this.labelVoice.Size = new System.Drawing.Size(34, 13);
this.labelVoice.TabIndex = 24;
this.labelVoice.Text = "Voice";
//
// nikseComboBoxVoice
//
this.nikseComboBoxVoice.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.nikseComboBoxVoice.BackColor = System.Drawing.SystemColors.Window;
this.nikseComboBoxVoice.BackColorDisabled = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
this.nikseComboBoxVoice.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(171)))), ((int)(((byte)(173)))), ((int)(((byte)(179)))));
this.nikseComboBoxVoice.BorderColorDisabled = System.Drawing.Color.FromArgb(((int)(((byte)(120)))), ((int)(((byte)(120)))), ((int)(((byte)(120)))));
this.nikseComboBoxVoice.ButtonForeColor = System.Drawing.SystemColors.ControlText;
this.nikseComboBoxVoice.ButtonForeColorDown = System.Drawing.Color.Orange;
this.nikseComboBoxVoice.ButtonForeColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.nikseComboBoxVoice.DropDownHeight = 400;
this.nikseComboBoxVoice.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.nikseComboBoxVoice.DropDownWidth = 0;
this.nikseComboBoxVoice.FormattingEnabled = false;
this.nikseComboBoxVoice.Location = new System.Drawing.Point(193, 208);
this.nikseComboBoxVoice.MaxLength = 32767;
this.nikseComboBoxVoice.Name = "nikseComboBoxVoice";
this.nikseComboBoxVoice.SelectedIndex = -1;
this.nikseComboBoxVoice.SelectedItem = null;
this.nikseComboBoxVoice.SelectedText = "";
this.nikseComboBoxVoice.Size = new System.Drawing.Size(351, 23);
this.nikseComboBoxVoice.TabIndex = 23;
this.nikseComboBoxVoice.UsePopupWindow = false;
//
// labelText
//
this.labelText.AutoSize = true;
this.labelText.Location = new System.Drawing.Point(13, 21);
this.labelText.Name = "labelText";
this.labelText.Size = new System.Drawing.Size(28, 13);
this.labelText.TabIndex = 25;
this.labelText.Text = "Text";
//
// RegenerateAudioClip
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(826, 243);
this.Controls.Add(this.labelText);
this.Controls.Add(this.labelVoice);
this.Controls.Add(this.nikseComboBoxVoice);
this.Controls.Add(this.TextBoxReGenerate);
this.Controls.Add(this.buttonReGenerate);
this.Controls.Add(this.buttonCancel);
this.KeyPreview = true;
this.MinimumSize = new System.Drawing.Size(600, 250);
this.Name = "RegenerateAudioClip";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Regenerate audio clip";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button buttonCancel;
private Controls.NikseTextBox TextBoxReGenerate;
private System.Windows.Forms.Button buttonReGenerate;
private System.Windows.Forms.Label labelVoice;
private Controls.NikseComboBox nikseComboBoxVoice;
private System.Windows.Forms.Label labelText;
}
}

View File

@ -0,0 +1,62 @@
using Nikse.SubtitleEdit.Core.Common;
using Nikse.SubtitleEdit.Logic;
using System;
using System.Windows.Forms;
namespace Nikse.SubtitleEdit.Forms.Tts
{
public partial class RegenerateAudioClip : Form
{
public TextToSpeech.FileNameAndSpeedFactor FileNameAndSpeedFactor { get; set; }
private readonly TextToSpeech _textToSpeech;
private readonly Subtitle _subtitle;
private readonly int _index;
public RegenerateAudioClip(TextToSpeech textToSpeech, Subtitle subtitle, int idx)
{
UiUtil.PreInitialize(this);
InitializeComponent();
UiUtil.FixFonts(this);
_subtitle = subtitle;
_textToSpeech = textToSpeech;
_index = idx;
buttonCancel.Text = LanguageSettings.Current.General.Cancel;
UiUtil.FixLargeFonts(this, buttonCancel);
TextBoxReGenerate.Text = subtitle.Paragraphs[idx].Text;
textToSpeech.SetCurrentVoices(nikseComboBoxVoice);
}
private async void buttonReGenerate_Click(object sender, EventArgs e)
{
var paragraph = _subtitle.Paragraphs[_index];
paragraph.Text = TextBoxReGenerate.Text.Trim();
try
{
Cursor = Cursors.WaitCursor;
buttonReGenerate.Enabled = false;
var fileNameAndSpeedFactor = await _textToSpeech.ReGenerateAudio(paragraph, nikseComboBoxVoice.Text);
if (fileNameAndSpeedFactor != null)
{
FileNameAndSpeedFactor = fileNameAndSpeedFactor;
Cursor = Cursors.Default;
DialogResult = DialogResult.OK;
}
}
finally
{
Cursor = Cursors.Default;
buttonReGenerate.Enabled = true;
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,216 @@
namespace Nikse.SubtitleEdit.Forms.Tts
{
sealed partial class ReviewAudioClips
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.listView1 = new System.Windows.Forms.ListView();
this.columnHeaderInclude = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderNo = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderVoice = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderCps = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.buttonOK = new System.Windows.Forms.Button();
this.labelInfo = new System.Windows.Forms.Label();
this.buttonPlay = new System.Windows.Forms.Button();
this.labelParagraphInfo = new System.Windows.Forms.Label();
this.checkBoxContinuePlay = new System.Windows.Forms.CheckBox();
this.buttonStop = new System.Windows.Forms.Button();
this.buttonEdit = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listView1
//
this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listView1.CheckBoxes = true;
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeaderInclude,
this.columnHeaderNo,
this.columnHeaderVoice,
this.columnHeaderCps,
this.columnHeaderText});
this.listView1.FullRowSelect = true;
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(12, 52);
this.listView1.MultiSelect = false;
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(684, 319);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown);
//
// columnHeaderInclude
//
this.columnHeaderInclude.Text = "Include";
//
// columnHeaderNo
//
this.columnHeaderNo.Text = "#";
this.columnHeaderNo.Width = 50;
//
// columnHeaderVoice
//
this.columnHeaderVoice.Text = "Voice";
this.columnHeaderVoice.Width = 120;
//
// columnHeaderCps
//
this.columnHeaderCps.Text = "CPS";
//
// columnHeaderText
//
this.columnHeaderText.Text = "Text";
this.columnHeaderText.Width = 460;
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(795, 413);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(87, 23);
this.buttonOK.TabIndex = 5;
this.buttonOK.Text = "&OK";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// labelInfo
//
this.labelInfo.AutoSize = true;
this.labelInfo.Location = new System.Drawing.Point(12, 33);
this.labelInfo.Name = "labelInfo";
this.labelInfo.Size = new System.Drawing.Size(219, 13);
this.labelInfo.TabIndex = 8;
this.labelInfo.Text = "Review and un-include unwanted audio clips";
//
// buttonPlay
//
this.buttonPlay.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonPlay.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonPlay.Location = new System.Drawing.Point(702, 295);
this.buttonPlay.Name = "buttonPlay";
this.buttonPlay.Size = new System.Drawing.Size(180, 23);
this.buttonPlay.TabIndex = 9;
this.buttonPlay.Text = "Play";
this.buttonPlay.UseVisualStyleBackColor = true;
this.buttonPlay.Click += new System.EventHandler(this.buttonPlay_Click);
//
// labelParagraphInfo
//
this.labelParagraphInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelParagraphInfo.AutoSize = true;
this.labelParagraphInfo.Location = new System.Drawing.Point(12, 383);
this.labelParagraphInfo.Name = "labelParagraphInfo";
this.labelParagraphInfo.Size = new System.Drawing.Size(76, 13);
this.labelParagraphInfo.TabIndex = 10;
this.labelParagraphInfo.Text = "Paragraph info";
//
// checkBoxContinuePlay
//
this.checkBoxContinuePlay.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.checkBoxContinuePlay.AutoSize = true;
this.checkBoxContinuePlay.Location = new System.Drawing.Point(717, 354);
this.checkBoxContinuePlay.Name = "checkBoxContinuePlay";
this.checkBoxContinuePlay.Size = new System.Drawing.Size(92, 17);
this.checkBoxContinuePlay.TabIndex = 11;
this.checkBoxContinuePlay.Text = "Auto continue";
this.checkBoxContinuePlay.UseVisualStyleBackColor = true;
//
// buttonStop
//
this.buttonStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonStop.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonStop.Location = new System.Drawing.Point(703, 324);
this.buttonStop.Name = "buttonStop";
this.buttonStop.Size = new System.Drawing.Size(179, 23);
this.buttonStop.TabIndex = 12;
this.buttonStop.Text = "Stop ";
this.buttonStop.UseVisualStyleBackColor = true;
this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click);
//
// buttonEdit
//
this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonEdit.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonEdit.Location = new System.Drawing.Point(703, 249);
this.buttonEdit.Name = "buttonEdit";
this.buttonEdit.Size = new System.Drawing.Size(180, 23);
this.buttonEdit.TabIndex = 13;
this.buttonEdit.Text = "Edit";
this.buttonEdit.UseVisualStyleBackColor = true;
this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click);
//
// ReviewAudioClips
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(894, 448);
this.Controls.Add(this.buttonEdit);
this.Controls.Add(this.buttonStop);
this.Controls.Add(this.checkBoxContinuePlay);
this.Controls.Add(this.labelParagraphInfo);
this.Controls.Add(this.buttonPlay);
this.Controls.Add(this.labelInfo);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.listView1);
this.KeyPreview = true;
this.MinimumSize = new System.Drawing.Size(800, 450);
this.Name = "ReviewAudioClips";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Review audio clips";
this.Load += new System.EventHandler(this.VoicePreviewList_Load);
this.Shown += new System.EventHandler(this.VoicePreviewList_Shown);
this.ResizeEnd += new System.EventHandler(this.VoicePreviewList_ResizeEnd);
this.Resize += new System.EventHandler(this.VoicePreviewList_Resize);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Label labelInfo;
private System.Windows.Forms.ColumnHeader columnHeaderInclude;
private System.Windows.Forms.ColumnHeader columnHeaderNo;
private System.Windows.Forms.ColumnHeader columnHeaderVoice;
private System.Windows.Forms.ColumnHeader columnHeaderCps;
private System.Windows.Forms.ColumnHeader columnHeaderText;
private System.Windows.Forms.Button buttonPlay;
private System.Windows.Forms.Label labelParagraphInfo;
private System.Windows.Forms.CheckBox checkBoxContinuePlay;
private System.Windows.Forms.Button buttonStop;
private System.Windows.Forms.Button buttonEdit;
}
}

View File

@ -0,0 +1,216 @@
using Nikse.SubtitleEdit.Core.Common;
using Nikse.SubtitleEdit.Logic;
using Nikse.SubtitleEdit.Logic.VideoPlayers;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Forms;
namespace Nikse.SubtitleEdit.Forms.Tts
{
public sealed partial class ReviewAudioClips : Form
{
public List<int> SkipIndices { get; set; }
private readonly Subtitle _subtitle;
private readonly TextToSpeech _textToSpeech;
private readonly List<TextToSpeech.FileNameAndSpeedFactor> _fileNames;
private bool _abortPlay;
private LibMpvDynamic _libMpv;
private Timer _mpvDoneTimer;
public ReviewAudioClips(TextToSpeech textToSpeech, Subtitle subtitle, List<TextToSpeech.FileNameAndSpeedFactor> fileNames)
{
UiUtil.PreInitialize(this);
InitializeComponent();
UiUtil.FixFonts(this);
buttonOK.Text = LanguageSettings.Current.General.Ok;
UiUtil.FixLargeFonts(this, buttonOK);
_textToSpeech = textToSpeech;
_subtitle = subtitle;
_fileNames = fileNames;
SkipIndices = new List<int>();
listView1.BeginUpdate();
foreach (var p in subtitle.Paragraphs)
{
var item = new ListViewItem { Tag = p, Checked = true };
item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture));
item.SubItems.Add(_textToSpeech.GetParagraphAudio(p));
item.SubItems.Add(Utilities.GetCharactersPerSecond(p).ToString("0.#", CultureInfo.InvariantCulture));
item.SubItems.Add(p.Text);
listView1.Items.Add(item);
}
listView1.EndUpdate();
if (listView1.Items.Count > 0)
{
listView1.Items[0].Selected = true;
}
labelParagraphInfo.Text = string.Empty;
}
private void buttonOK_Click(object sender, EventArgs e)
{
_libMpv?.Stop();
for (var index = 0; index < listView1.Items.Count; index++)
{
if (!listView1.Items[index].Checked)
{
SkipIndices.Add(index);
}
}
DialogResult = DialogResult.OK;
}
private void VoicePreviewList_Load(object sender, EventArgs e)
{
listView1.AutoSizeLastColumn();
}
private void VoicePreviewList_ResizeEnd(object sender, EventArgs e)
{
listView1.AutoSizeLastColumn();
}
private void VoicePreviewList_Resize(object sender, EventArgs e)
{
listView1.AutoSizeLastColumn();
}
private void Play(bool noAutoContinue = false)
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
var idx = listView1.SelectedItems[0].Index;
var waveFileName = _fileNames[idx].Filename;
if (_libMpv != null)
{
_libMpv.Initialize(
null,
waveFileName,
(sender, args) =>
{
_libMpv.Play();
},
null);
if (checkBoxContinuePlay.Checked && !noAutoContinue)
{
_mpvDoneTimer.Start();
}
}
else
{
using (var soundPlayer = new System.Media.SoundPlayer(waveFileName))
{
soundPlayer.PlaySync();
}
if (!noAutoContinue)
{
PlayNext(idx);
}
}
}
private void PlayNext(int idx)
{
if (checkBoxContinuePlay.Checked && !_abortPlay && idx < listView1.Items.Count - 1)
{
listView1.Items[idx].Selected = false;
listView1.Items[idx + 1].Selected = true;
listView1.Items[idx + 1].Focused = true;
listView1.Items[idx + 1].EnsureVisible();
TaskDelayHelper.RunDelayed(TimeSpan.FromMilliseconds(10), () => Play());
Application.DoEvents();
}
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0)
{
labelParagraphInfo.Text = string.Empty;
return;
}
var idx = listView1.SelectedItems[0].Index;
var p = _subtitle.Paragraphs[idx];
labelParagraphInfo.Text = p.StartTime.ToDisplayString() + " --> " + p.EndTime.ToDisplayString() + " : " + p.Duration.ToShortDisplayString();
}
private void buttonPlay_Click(object sender, EventArgs e)
{
_abortPlay = false;
Play();
}
private void buttonStop_Click(object sender, EventArgs e)
{
_libMpv?.Stop();
_abortPlay = true;
}
private void VoicePreviewList_Shown(object sender, EventArgs e)
{
if (LibMpvDynamic.IsInstalled)
{
_libMpv = new LibMpvDynamic();
_mpvDoneTimer = new Timer();
_mpvDoneTimer.Interval = 100;
_mpvDoneTimer.Tick += (o, args) =>
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
var idx = listView1.SelectedItems[0].Index;
if (_libMpv.IsPaused && _libMpv.CurrentPosition > _libMpv.Duration - 1)
{
_mpvDoneTimer.Stop();
PlayNext(idx);
}
};
}
}
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Space || e.KeyCode == Keys.P || e.KeyCode == Keys.Play)
{
e.SuppressKeyPress = true;
TaskDelayHelper.RunDelayed(TimeSpan.FromMilliseconds(1), () => Play());
}
}
private void buttonEdit_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
var idx = listView1.SelectedItems[0].Index;
using (var form = new RegenerateAudioClip(_textToSpeech, _subtitle, idx))
{
var dr = form.ShowDialog(this);
if (dr == DialogResult.OK)
{
_fileNames[idx].Filename = form.FileNameAndSpeedFactor.Filename;
_fileNames[idx].Factor = form.FileNameAndSpeedFactor.Factor;
listView1.Items[idx].SubItems[4].Text = _subtitle.Paragraphs[idx].Text;
Play(true);
}
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -35,19 +35,21 @@
this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.labelEngine = new System.Windows.Forms.Label(); this.labelEngine = new System.Windows.Forms.Label();
this.groupBoxMsSettings = new System.Windows.Forms.GroupBox(); this.groupBoxMsSettings = new System.Windows.Forms.GroupBox();
this.checkBoxShowPreview = new System.Windows.Forms.CheckBox();
this.labelApiKey = new System.Windows.Forms.Label(); this.labelApiKey = new System.Windows.Forms.Label();
this.nikseTextBoxApiKey = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.TextBoxTest = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.buttonTestVoice = new System.Windows.Forms.Button(); this.buttonTestVoice = new System.Windows.Forms.Button();
this.checkBoxAddToVideoFile = new System.Windows.Forms.CheckBox(); this.checkBoxAddToVideoFile = new System.Windows.Forms.CheckBox();
this.labelVoice = new System.Windows.Forms.Label(); this.labelVoice = new System.Windows.Forms.Label();
this.nikseComboBoxVoice = new Nikse.SubtitleEdit.Controls.NikseComboBox();
this.nikseComboBoxEngine = new Nikse.SubtitleEdit.Controls.NikseComboBox();
this.listViewActors = new System.Windows.Forms.ListView(); this.listViewActors = new System.Windows.Forms.ListView();
this.columnHeaderActor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderActor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderVoice = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderVoice = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStripActors = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStripActors = new System.Windows.Forms.ContextMenuStrip(this.components);
this.labelActors = new System.Windows.Forms.Label(); this.labelActors = new System.Windows.Forms.Label();
this.nikseTextBoxApiKey = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.TextBoxTest = new Nikse.SubtitleEdit.Controls.NikseTextBox();
this.nikseComboBoxVoice = new Nikse.SubtitleEdit.Controls.NikseComboBox();
this.nikseComboBoxEngine = new Nikse.SubtitleEdit.Controls.NikseComboBox();
this.buttonCancel = new System.Windows.Forms.Button();
this.groupBoxMsSettings.SuspendLayout(); this.groupBoxMsSettings.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -55,7 +57,7 @@
// //
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(767, 456); this.buttonOK.Location = new System.Drawing.Point(686, 456);
this.buttonOK.Name = "buttonOK"; this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 23); this.buttonOK.Size = new System.Drawing.Size(75, 23);
this.buttonOK.TabIndex = 100; this.buttonOK.TabIndex = 100;
@ -92,7 +94,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.progressBar1.Location = new System.Drawing.Point(12, 456); this.progressBar1.Location = new System.Drawing.Point(12, 456);
this.progressBar1.Name = "progressBar1"; this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(749, 10); this.progressBar1.Size = new System.Drawing.Size(665, 10);
this.progressBar1.TabIndex = 12; this.progressBar1.TabIndex = 12;
// //
// labelEngine // labelEngine
@ -109,6 +111,7 @@
// //
this.groupBoxMsSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.groupBoxMsSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left))); | System.Windows.Forms.AnchorStyles.Left)));
this.groupBoxMsSettings.Controls.Add(this.checkBoxShowPreview);
this.groupBoxMsSettings.Controls.Add(this.labelApiKey); this.groupBoxMsSettings.Controls.Add(this.labelApiKey);
this.groupBoxMsSettings.Controls.Add(this.nikseTextBoxApiKey); this.groupBoxMsSettings.Controls.Add(this.nikseTextBoxApiKey);
this.groupBoxMsSettings.Controls.Add(this.TextBoxTest); this.groupBoxMsSettings.Controls.Add(this.TextBoxTest);
@ -125,6 +128,19 @@
this.groupBoxMsSettings.TabStop = false; this.groupBoxMsSettings.TabStop = false;
this.groupBoxMsSettings.Text = "Settings"; this.groupBoxMsSettings.Text = "Settings";
// //
// checkBoxShowPreview
//
this.checkBoxShowPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.checkBoxShowPreview.AutoSize = true;
this.checkBoxShowPreview.Checked = true;
this.checkBoxShowPreview.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkBoxShowPreview.Location = new System.Drawing.Point(17, 350);
this.checkBoxShowPreview.Name = "checkBoxShowPreview";
this.checkBoxShowPreview.Size = new System.Drawing.Size(115, 17);
this.checkBoxShowPreview.TabIndex = 25;
this.checkBoxShowPreview.Text = "Review audio clips";
this.checkBoxShowPreview.UseVisualStyleBackColor = true;
//
// labelApiKey // labelApiKey
// //
this.labelApiKey.AutoSize = true; this.labelApiKey.AutoSize = true;
@ -135,28 +151,6 @@
this.labelApiKey.TabIndex = 28; this.labelApiKey.TabIndex = 28;
this.labelApiKey.Text = "API key"; this.labelApiKey.Text = "API key";
// //
// nikseTextBoxApiKey
//
this.nikseTextBoxApiKey.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.nikseTextBoxApiKey.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.nikseTextBoxApiKey.Location = new System.Drawing.Point(17, 258);
this.nikseTextBoxApiKey.Name = "nikseTextBoxApiKey";
this.nikseTextBoxApiKey.Size = new System.Drawing.Size(351, 20);
this.nikseTextBoxApiKey.TabIndex = 27;
//
// TextBoxTest
//
this.TextBoxTest.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TextBoxTest.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.TextBoxTest.Location = new System.Drawing.Point(17, 187);
this.TextBoxTest.Name = "TextBoxTest";
this.TextBoxTest.Size = new System.Drawing.Size(351, 20);
this.TextBoxTest.TabIndex = 20;
this.TextBoxTest.Text = "Hello, how are you?";
this.TextBoxTest.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxTest_KeyDown);
//
// buttonTestVoice // buttonTestVoice
// //
this.buttonTestVoice.Location = new System.Drawing.Point(17, 158); this.buttonTestVoice.Location = new System.Drawing.Point(17, 158);
@ -190,6 +184,72 @@
this.labelVoice.TabIndex = 16; this.labelVoice.TabIndex = 16;
this.labelVoice.Text = "Voice"; this.labelVoice.Text = "Voice";
// //
// listViewActors
//
this.listViewActors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listViewActors.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeaderActor,
this.columnHeaderVoice});
this.listViewActors.ContextMenuStrip = this.contextMenuStripActors;
this.listViewActors.FullRowSelect = true;
this.listViewActors.GridLines = true;
this.listViewActors.HideSelection = false;
this.listViewActors.Location = new System.Drawing.Point(412, 42);
this.listViewActors.Name = "listViewActors";
this.listViewActors.Size = new System.Drawing.Size(430, 375);
this.listViewActors.TabIndex = 40;
this.listViewActors.UseCompatibleStateImageBehavior = false;
this.listViewActors.View = System.Windows.Forms.View.Details;
//
// columnHeaderActor
//
this.columnHeaderActor.Text = "Actor";
this.columnHeaderActor.Width = 200;
//
// columnHeaderVoice
//
this.columnHeaderVoice.Text = "Voice";
this.columnHeaderVoice.Width = 200;
//
// contextMenuStripActors
//
this.contextMenuStripActors.Name = "contextMenuStripActors";
this.contextMenuStripActors.Size = new System.Drawing.Size(61, 4);
//
// labelActors
//
this.labelActors.AutoSize = true;
this.labelActors.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelActors.Location = new System.Drawing.Point(412, 20);
this.labelActors.Name = "labelActors";
this.labelActors.Size = new System.Drawing.Size(170, 13);
this.labelActors.TabIndex = 19;
this.labelActors.Text = "Right-click to assign actor to voice";
//
// nikseTextBoxApiKey
//
this.nikseTextBoxApiKey.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.nikseTextBoxApiKey.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.nikseTextBoxApiKey.Location = new System.Drawing.Point(17, 258);
this.nikseTextBoxApiKey.Name = "nikseTextBoxApiKey";
this.nikseTextBoxApiKey.Size = new System.Drawing.Size(351, 20);
this.nikseTextBoxApiKey.TabIndex = 27;
//
// TextBoxTest
//
this.TextBoxTest.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TextBoxTest.FocusedColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
this.TextBoxTest.Location = new System.Drawing.Point(17, 187);
this.TextBoxTest.Name = "TextBoxTest";
this.TextBoxTest.Size = new System.Drawing.Size(351, 20);
this.TextBoxTest.TabIndex = 20;
this.TextBoxTest.Text = "Hello, how are you?";
this.TextBoxTest.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxTest_KeyDown);
//
// nikseComboBoxVoice // nikseComboBoxVoice
// //
this.nikseComboBoxVoice.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) this.nikseComboBoxVoice.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
@ -243,55 +303,25 @@
this.nikseComboBoxEngine.UsePopupWindow = false; this.nikseComboBoxEngine.UsePopupWindow = false;
this.nikseComboBoxEngine.SelectedIndexChanged += new System.EventHandler(this.nikseComboBoxEngine_SelectedIndexChanged); this.nikseComboBoxEngine.SelectedIndexChanged += new System.EventHandler(this.nikseComboBoxEngine_SelectedIndexChanged);
// //
// listViewActors // buttonCancel
// //
this.listViewActors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
| System.Windows.Forms.AnchorStyles.Left) this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
| System.Windows.Forms.AnchorStyles.Right))); this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.listViewActors.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.buttonCancel.Location = new System.Drawing.Point(767, 456);
this.columnHeaderActor, this.buttonCancel.Name = "buttonCancel";
this.columnHeaderVoice}); this.buttonCancel.Size = new System.Drawing.Size(75, 23);
this.listViewActors.ContextMenuStrip = this.contextMenuStripActors; this.buttonCancel.TabIndex = 101;
this.listViewActors.FullRowSelect = true; this.buttonCancel.Text = "C&ancel";
this.listViewActors.GridLines = true; this.buttonCancel.UseVisualStyleBackColor = true;
this.listViewActors.HideSelection = false; this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
this.listViewActors.Location = new System.Drawing.Point(412, 42);
this.listViewActors.Name = "listViewActors";
this.listViewActors.Size = new System.Drawing.Size(430, 375);
this.listViewActors.TabIndex = 40;
this.listViewActors.UseCompatibleStateImageBehavior = false;
this.listViewActors.View = System.Windows.Forms.View.Details;
//
// columnHeaderActor
//
this.columnHeaderActor.Text = "Actor";
this.columnHeaderActor.Width = 200;
//
// columnHeaderVoice
//
this.columnHeaderVoice.Text = "Voice";
this.columnHeaderVoice.Width = 200;
//
// contextMenuStripActors
//
this.contextMenuStripActors.Name = "contextMenuStripActors";
this.contextMenuStripActors.Size = new System.Drawing.Size(61, 4);
//
// labelActors
//
this.labelActors.AutoSize = true;
this.labelActors.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelActors.Location = new System.Drawing.Point(412, 20);
this.labelActors.Name = "labelActors";
this.labelActors.Size = new System.Drawing.Size(170, 13);
this.labelActors.TabIndex = 19;
this.labelActors.Text = "Right-click to assign actor to voice";
// //
// TextToSpeech // TextToSpeech
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(854, 491); this.ClientSize = new System.Drawing.Size(854, 491);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.labelActors); this.Controls.Add(this.labelActors);
this.Controls.Add(this.listViewActors); this.Controls.Add(this.listViewActors);
this.Controls.Add(this.groupBoxMsSettings); this.Controls.Add(this.groupBoxMsSettings);
@ -338,5 +368,7 @@
private System.Windows.Forms.Label labelActors; private System.Windows.Forms.Label labelActors;
private System.Windows.Forms.Label labelApiKey; private System.Windows.Forms.Label labelApiKey;
private Controls.NikseTextBox nikseTextBoxApiKey; private Controls.NikseTextBox nikseTextBoxApiKey;
private System.Windows.Forms.CheckBox checkBoxShowPreview;
private System.Windows.Forms.Button buttonCancel;
} }
} }

View File

@ -14,12 +14,15 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Nikse.SubtitleEdit.Controls;
using MessageBox = Nikse.SubtitleEdit.Forms.SeMsgBox.MessageBox; using MessageBox = Nikse.SubtitleEdit.Forms.SeMsgBox.MessageBox;
namespace Nikse.SubtitleEdit.Forms.Tts namespace Nikse.SubtitleEdit.Forms.Tts
{ {
public sealed partial class TextToSpeech : Form public sealed partial class TextToSpeech : Form
{ {
public Subtitle EditedSubtitle { get; set; }
private readonly Subtitle _subtitle; private readonly Subtitle _subtitle;
private readonly string _videoFileName; private readonly string _videoFileName;
private readonly VideoInfo _videoInfo; private readonly VideoInfo _videoInfo;
@ -29,7 +32,8 @@ namespace Nikse.SubtitleEdit.Forms.Tts
private bool _abort; private bool _abort;
private readonly List<string> _actors; private readonly List<string> _actors;
private readonly List<TextToSpeechEngine> _engines; private readonly List<TextToSpeechEngine> _engines;
private readonly List<ElevenLabModel> _elevelLabVoices; private readonly List<ElevenLabModel> _elevenLabVoices;
private bool _actorsOn;
public class ActorAndVoice public class ActorAndVoice
{ {
@ -39,6 +43,12 @@ namespace Nikse.SubtitleEdit.Forms.Tts
public int VoiceIndex { get; set; } public int VoiceIndex { get; set; }
} }
public class FileNameAndSpeedFactor
{
public string Filename { get; set; }
public decimal Factor { get; set; }
}
public class TextToSpeechEngine public class TextToSpeechEngine
{ {
public TextToSpeechEngineId Id { get; set; } public TextToSpeechEngineId Id { get; set; }
@ -68,11 +78,11 @@ namespace Nikse.SubtitleEdit.Forms.Tts
InitializeComponent(); InitializeComponent();
UiUtil.FixFonts(this); UiUtil.FixFonts(this);
_subtitle = subtitle; _subtitle = new Subtitle(subtitle, false);
_subtitleFormat = subtitleFormat; _subtitleFormat = subtitleFormat;
_videoFileName = videoFileName; _videoFileName = videoFileName;
_videoInfo = videoInfo; _videoInfo = videoInfo;
_elevelLabVoices = new List<ElevenLabModel>(); _elevenLabVoices = new List<ElevenLabModel>();
_actors = _subtitle.Paragraphs _actors = _subtitle.Paragraphs
.Where(p => !string.IsNullOrEmpty(p.Actor)) .Where(p => !string.IsNullOrEmpty(p.Actor))
.Select(p => p.Actor) .Select(p => p.Actor)
@ -87,6 +97,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
checkBoxAddToVideoFile.Text = LanguageSettings.Current.TextToSpeech.AddAudioToVideo; checkBoxAddToVideoFile.Text = LanguageSettings.Current.TextToSpeech.AddAudioToVideo;
buttonGenerateTTS.Text = LanguageSettings.Current.TextToSpeech.GenerateSpeech; buttonGenerateTTS.Text = LanguageSettings.Current.TextToSpeech.GenerateSpeech;
buttonOK.Text = LanguageSettings.Current.General.Ok; buttonOK.Text = LanguageSettings.Current.General.Ok;
buttonCancel.Text = LanguageSettings.Current.General.Cancel;
UiUtil.FixLargeFonts(this, buttonOK); UiUtil.FixLargeFonts(this, buttonOK);
progressBar1.Visible = false; progressBar1.Visible = false;
@ -135,6 +146,8 @@ namespace Nikse.SubtitleEdit.Forms.Tts
MinimumSize = new Size(w, MinimumSize.Height); MinimumSize = new Size(w, MinimumSize.Height);
Width = w; Width = w;
} }
nikseComboBoxVoice.Text = Configuration.Settings.Tools.TextToSpeechLastVoice;
} }
private void SetActor(ActorAndVoice actor) private void SetActor(ActorAndVoice actor)
@ -189,14 +202,33 @@ namespace Nikse.SubtitleEdit.Forms.Tts
return; return;
} }
var fileNames = FixParagraphAudioSpeed(); var fileNameAndSpeedFactors = FixParagraphAudioSpeed(_subtitle, null);
if (_abort) if (_abort)
{ {
HandleAbort(); HandleAbort();
return; return;
} }
var tempAudioFile = MergeAudioParagraphs(fileNames); if (checkBoxShowPreview.Checked)
{
using (var form = new ReviewAudioClips(this, _subtitle, fileNameAndSpeedFactors))
{
var dr = form.ShowDialog(this);
if (dr != DialogResult.OK)
{
_abort = true;
HandleAbort();
return;
}
foreach (var idx in form.SkipIndices)
{
fileNameAndSpeedFactors[idx] = null; // skip these files
}
}
}
var tempAudioFile = MergeAudioParagraphs(fileNameAndSpeedFactors);
if (_abort) if (_abort)
{ {
HandleAbort(); HandleAbort();
@ -307,37 +339,47 @@ namespace Nikse.SubtitleEdit.Forms.Tts
} }
} }
private List<string> FixParagraphAudioSpeed() private List<FileNameAndSpeedFactor> FixParagraphAudioSpeed(Subtitle subtitle, string overrideFileName)
{ {
var fileNames = new List<string>(_subtitle.Paragraphs.Count); var fileNames = new List<FileNameAndSpeedFactor>(subtitle.Paragraphs.Count);
labelProgress.Text = string.Empty; labelProgress.Text = string.Empty;
labelProgress.Refresh(); labelProgress.Refresh();
Application.DoEvents(); Application.DoEvents();
progressBar1.Value = 0; progressBar1.Value = 0;
progressBar1.Maximum = _subtitle.Paragraphs.Count; progressBar1.Maximum = subtitle.Paragraphs.Count;
progressBar1.Visible = true; progressBar1.Visible = true;
for (var index = 0; index < _subtitle.Paragraphs.Count; index++) for (var index = 0; index < subtitle.Paragraphs.Count; index++)
{ {
progressBar1.Value = index + 1; progressBar1.Value = index + 1;
labelProgress.Text = string.Format(LanguageSettings.Current.TextToSpeech.AdjustingSpeedXOfY, index + 1, _subtitle.Paragraphs.Count); labelProgress.Text = string.Format(LanguageSettings.Current.TextToSpeech.AdjustingSpeedXOfY, index + 1, subtitle.Paragraphs.Count);
var p = _subtitle.Paragraphs[index]; var p = subtitle.Paragraphs[index];
var next = _subtitle.GetParagraphOrDefault(index + 1); var next = subtitle.GetParagraphOrDefault(index + 1);
var pFileName = Path.Combine(_waveFolder, index + ".wav"); var pFileName = Path.Combine(_waveFolder, index + ".wav");
if (!string.IsNullOrEmpty(overrideFileName) && File.Exists(Path.Combine(_waveFolder, overrideFileName)))
{
pFileName = Path.Combine(_waveFolder, overrideFileName);
}
if (!File.Exists(pFileName)) if (!File.Exists(pFileName))
{ {
pFileName = Path.Combine(_waveFolder, index + ".mp3"); pFileName = Path.Combine(_waveFolder, index + ".mp3");
} }
var outputFileName1 = Path.Combine(_waveFolder, index + "_u.wav"); var outputFileName1 = Path.Combine(_waveFolder, index + "_u.wav");
if (!string.IsNullOrEmpty(overrideFileName) && File.Exists(Path.Combine(_waveFolder, overrideFileName)))
{
outputFileName1 = Path.Combine(_waveFolder, Path.GetFileNameWithoutExtension(overrideFileName) + "_u.wav");
}
var trimProcess = VideoPreviewGenerator.TrimSilenceStartAndEnd(pFileName, outputFileName1); var trimProcess = VideoPreviewGenerator.TrimSilenceStartAndEnd(pFileName, outputFileName1);
trimProcess.Start(); trimProcess.Start();
while (!trimProcess.HasExited) while (!trimProcess.HasExited)
{ {
if (_abort) if (_abort)
{ {
return new List<string>(); return new List<FileNameAndSpeedFactor>();
} }
} }
@ -354,19 +396,24 @@ namespace Nikse.SubtitleEdit.Forms.Tts
if (_abort) if (_abort)
{ {
return new List<string>(); return new List<FileNameAndSpeedFactor>();
} }
var waveInfo = UiUtil.GetVideoInfo(outputFileName1); var waveInfo = UiUtil.GetVideoInfo(outputFileName1);
if (waveInfo.TotalMilliseconds <= p.DurationTotalMilliseconds + addDuration) if (waveInfo.TotalMilliseconds <= p.DurationTotalMilliseconds + addDuration)
{ {
fileNames.Add(outputFileName1); fileNames.Add(new FileNameAndSpeedFactor { Filename = outputFileName1, Factor = 1 });
continue; continue;
} }
var factor = waveInfo.TotalMilliseconds / (p.DurationTotalMilliseconds + addDuration); var factor = (decimal)waveInfo.TotalMilliseconds / (decimal)(p.DurationTotalMilliseconds + addDuration);
var outputFileName2 = Path.Combine(_waveFolder, index + "_t.wav"); var outputFileName2 = Path.Combine(_waveFolder, index + "_t.wav");
fileNames.Add(outputFileName2); if (!string.IsNullOrEmpty(overrideFileName) && File.Exists(Path.Combine(_waveFolder, overrideFileName)))
{
outputFileName2 = Path.Combine(_waveFolder, Path.GetFileNameWithoutExtension(overrideFileName) + "_t.wav");
}
fileNames.Add(new FileNameAndSpeedFactor { Filename = outputFileName2, Factor = factor });
var mergeProcess = VideoPreviewGenerator.ChangeSpeed(outputFileName1, outputFileName2, (float)factor); var mergeProcess = VideoPreviewGenerator.ChangeSpeed(outputFileName1, outputFileName2, (float)factor);
mergeProcess.Start(); mergeProcess.Start();
@ -375,7 +422,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
Application.DoEvents(); Application.DoEvents();
if (_abort) if (_abort)
{ {
return new List<string>(); return new List<FileNameAndSpeedFactor>();
} }
} }
} }
@ -383,7 +430,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
return fileNames; return fileNames;
} }
private string MergeAudioParagraphs(List<string> fileNames) private string MergeAudioParagraphs(List<FileNameAndSpeedFactor> fileNames)
{ {
labelProgress.Text = string.Empty; labelProgress.Text = string.Empty;
labelProgress.Refresh(); labelProgress.Refresh();
@ -404,14 +451,14 @@ namespace Nikse.SubtitleEdit.Forms.Tts
labelProgress.Text = string.Format(LanguageSettings.Current.TextToSpeech.MergingAudioTrackXOfY, index + 1, _subtitle.Paragraphs.Count); labelProgress.Text = string.Format(LanguageSettings.Current.TextToSpeech.MergingAudioTrackXOfY, index + 1, _subtitle.Paragraphs.Count);
var p = _subtitle.Paragraphs[index]; var p = _subtitle.Paragraphs[index];
var pFileName = fileNames[index]; var pFileName = fileNames[index];
if (!File.Exists(pFileName)) if (!File.Exists(pFileName.Filename))
{ {
SeLogger.Error($"TextToSpeech: File not found (skipping): {pFileName}"); SeLogger.Error($"TextToSpeech: File not found (skipping): {pFileName.Filename}");
continue; continue;
} }
outputFileName = Path.Combine(_waveFolder, $"silence{index}.wav"); outputFileName = Path.Combine(_waveFolder, $"silence{index}.wav");
var mergeProcess = VideoPreviewGenerator.MergeAudioTracks(inputFileName, pFileName, outputFileName, (float)p.StartTime.TotalSeconds); var mergeProcess = VideoPreviewGenerator.MergeAudioTracks(inputFileName, pFileName.Filename, outputFileName, (float)p.StartTime.TotalSeconds);
inputFileName = outputFileName; inputFileName = outputFileName;
mergeProcess.Start(); mergeProcess.Start();
@ -778,8 +825,6 @@ namespace Nikse.SubtitleEdit.Forms.Tts
} }
var httpClient = new HttpClient(); var httpClient = new HttpClient();
//httpClient.BaseAddress = new Uri("https://api.elevenlabs.io/v1/text-to-speech/");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "audio/mpeg"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "audio/mpeg");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("xi-api-key", nikseTextBoxApiKey.Text.Trim()); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("xi-api-key", nikseTextBoxApiKey.Text.Trim());
@ -788,7 +833,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
progressBar1.Maximum = subtitle.Paragraphs.Count; progressBar1.Maximum = subtitle.Paragraphs.Count;
progressBar1.Visible = showProgressBar; progressBar1.Visible = showProgressBar;
var voices = _elevelLabVoices; var voices = _elevenLabVoices;
var v = nikseComboBoxVoice.Text; var v = nikseComboBoxVoice.Text;
for (var index = 0; index < subtitle.Paragraphs.Count; index++) for (var index = 0; index < subtitle.Paragraphs.Count; index++)
@ -843,6 +888,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
private void buttonOK_Click(object sender, EventArgs e) private void buttonOK_Click(object sender, EventArgs e)
{ {
EditedSubtitle = _subtitle;
DialogResult = DialogResult.OK; DialogResult = DialogResult.OK;
} }
@ -920,12 +966,12 @@ namespace Nikse.SubtitleEdit.Forms.Tts
labelApiKey.Visible = true; labelApiKey.Visible = true;
nikseTextBoxApiKey.Visible = true; nikseTextBoxApiKey.Visible = true;
if (_elevelLabVoices.Count == 0) if (_elevenLabVoices.Count == 0)
{ {
_elevelLabVoices.AddRange(GetElevelLabVoices()); _elevenLabVoices.AddRange(GetElevelLabVoices());
} }
foreach (var voice in _elevelLabVoices) foreach (var voice in _elevenLabVoices)
{ {
nikseComboBoxVoice.Items.Add(voice.ToString()); nikseComboBoxVoice.Items.Add(voice.ToString());
} }
@ -1002,7 +1048,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
} }
else if (engine.Id == TextToSpeechEngineId.ElevenLabs) else if (engine.Id == TextToSpeechEngineId.ElevenLabs)
{ {
var voices = _elevelLabVoices; var voices = _elevenLabVoices;
foreach (var voiceLanguage in voices foreach (var voiceLanguage in voices
.GroupBy(p => p.Language) .GroupBy(p => p.Language)
.OrderBy(p => p.Key)) .OrderBy(p => p.Key))
@ -1063,6 +1109,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
labelActors.Visible = true; labelActors.Visible = true;
listViewActors.Visible = true; listViewActors.Visible = true;
_actorsOn = true;
} }
} }
} }
@ -1152,6 +1199,23 @@ namespace Nikse.SubtitleEdit.Forms.Tts
listViewActors.AutoSizeLastColumn(); listViewActors.AutoSizeLastColumn();
} }
public async Task<FileNameAndSpeedFactor> ReGenerateAudio(Paragraph p, string voice)
{
nikseComboBoxVoice.Text = voice;
var sub = new Subtitle();
sub.Paragraphs.Add(p);
var waveFileNameOnly = Guid.NewGuid() + ".wav";
var ok = await GenerateParagraphAudio(sub, false, waveFileNameOnly);
if (!ok)
{
return null;
}
var fileNameAndSpeedFactors = FixParagraphAudioSpeed(sub, waveFileNameOnly);
return fileNameAndSpeedFactors.First();
}
private async void buttonTestVoice_Click(object sender, EventArgs e) private async void buttonTestVoice_Click(object sender, EventArgs e)
{ {
try try
@ -1235,6 +1299,7 @@ namespace Nikse.SubtitleEdit.Forms.Tts
} }
Configuration.Settings.Tools.TextToSpeechEngine = engine.Id.ToString(); Configuration.Settings.Tools.TextToSpeechEngine = engine.Id.ToString();
Configuration.Settings.Tools.TextToSpeechLastVoice = nikseComboBoxVoice.Text;
} }
private void TextToSpeech_KeyDown(object sender, KeyEventArgs e) private void TextToSpeech_KeyDown(object sender, KeyEventArgs e)
@ -1253,5 +1318,45 @@ namespace Nikse.SubtitleEdit.Forms.Tts
buttonTestVoice_Click(null, null); buttonTestVoice_Click(null, null);
} }
} }
public string GetParagraphAudio(Paragraph paragraph)
{
if (_actorsOn)
{
var engine = _engines.First(p => p.Index == nikseComboBoxEngine.SelectedIndex);
if (engine.Id == TextToSpeechEngineId.Piper)
{
var voices = PiperModels.GetVoices();
var voice = voices.First(x => x.ToString() == nikseComboBoxVoice.Text);
if (_actorAndVoices.Count > 0 && !string.IsNullOrEmpty(paragraph.Actor))
{
var f = _actorAndVoices.FirstOrDefault(x => x.Actor == paragraph.Actor);
if (f != null && !string.IsNullOrEmpty(f.Voice))
{
return voices[f.VoiceIndex].Voice;
}
}
}
}
return nikseComboBoxVoice.Text;
}
public void SetCurrentVoices(NikseComboBox nikseComboBox)
{
nikseComboBox.Items.Clear();
foreach (var voice in nikseComboBoxVoice.Items)
{
nikseComboBox.Items.Add(voice.ToString());
}
nikseComboBox.SelectedIndex = nikseComboBoxVoice.SelectedIndex;
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
} }
} }

View File

@ -851,9 +851,9 @@ namespace Nikse.SubtitleEdit.Logic.VideoPlayers
} }
} }
Application.DoEvents(); Application.DoEvents();
OnVideoLoaded?.Invoke(this, null);
Application.DoEvents();
Pause(); Pause();
Application.DoEvents();
OnVideoLoaded?.Invoke(this, null);
} }
public override void DisposeVideoPlayer() public override void DisposeVideoPlayer()

View File

@ -385,6 +385,12 @@
<Compile Include="Forms\AudioToText\VoskModelDownload.Designer.cs"> <Compile Include="Forms\AudioToText\VoskModelDownload.Designer.cs">
<DependentUpon>VoskModelDownload.cs</DependentUpon> <DependentUpon>VoskModelDownload.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Forms\GenerateVideoWithHardSubsOutFile.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\GenerateVideoWithHardSubsOutFile.Designer.cs">
<DependentUpon>GenerateVideoWithHardSubsOutFile.cs</DependentUpon>
</Compile>
<Compile Include="Forms\GenerateVideoWithSoftSubsLanguage.cs"> <Compile Include="Forms\GenerateVideoWithSoftSubsLanguage.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -686,6 +692,12 @@
<Compile Include="Forms\Tts\PiperDownload.Designer.cs"> <Compile Include="Forms\Tts\PiperDownload.Designer.cs">
<DependentUpon>PiperDownload.cs</DependentUpon> <DependentUpon>PiperDownload.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Forms\Tts\RegenerateAudioClip.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\Tts\RegenerateAudioClip.Designer.cs">
<DependentUpon>RegenerateAudioClip.cs</DependentUpon>
</Compile>
<Compile Include="Forms\Tts\TextToSpeech.cs"> <Compile Include="Forms\Tts\TextToSpeech.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -1416,6 +1428,12 @@
<Compile Include="Forms\TransportStreamSubtitleChooser.Designer.cs"> <Compile Include="Forms\TransportStreamSubtitleChooser.Designer.cs">
<DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Forms\Tts\ReviewAudioClips.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\Tts\ReviewAudioClips.Designer.cs">
<DependentUpon>ReviewAudioClips.cs</DependentUpon>
</Compile>
<Compile Include="Forms\UnknownSubtitle.cs"> <Compile Include="Forms\UnknownSubtitle.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -1822,6 +1840,9 @@
<EmbeddedResource Include="Forms\GenerateVideoFFmpegPrompt.resx"> <EmbeddedResource Include="Forms\GenerateVideoFFmpegPrompt.resx">
<DependentUpon>GenerateVideoFFmpegPrompt.cs</DependentUpon> <DependentUpon>GenerateVideoFFmpegPrompt.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Forms\GenerateVideoWithHardSubsOutFile.resx">
<DependentUpon>GenerateVideoWithHardSubsOutFile.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\GenerateVideoWithSoftSubs.resx"> <EmbeddedResource Include="Forms\GenerateVideoWithSoftSubs.resx">
<DependentUpon>GenerateVideoWithSoftSubs.cs</DependentUpon> <DependentUpon>GenerateVideoWithSoftSubs.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@ -1960,6 +1981,9 @@
<EmbeddedResource Include="Forms\Tts\PiperDownload.resx"> <EmbeddedResource Include="Forms\Tts\PiperDownload.resx">
<DependentUpon>PiperDownload.cs</DependentUpon> <DependentUpon>PiperDownload.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Forms\Tts\RegenerateAudioClip.resx">
<DependentUpon>RegenerateAudioClip.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Tts\TextToSpeech.resx"> <EmbeddedResource Include="Forms\Tts\TextToSpeech.resx">
<DependentUpon>TextToSpeech.cs</DependentUpon> <DependentUpon>TextToSpeech.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@ -2312,6 +2336,9 @@
<EmbeddedResource Include="Forms\TransportStreamSubtitleChooser.resx"> <EmbeddedResource Include="Forms\TransportStreamSubtitleChooser.resx">
<DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Forms\Tts\ReviewAudioClips.resx">
<DependentUpon>ReviewAudioClips.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\UnknownSubtitle.resx"> <EmbeddedResource Include="Forms\UnknownSubtitle.resx">
<DependentUpon>UnknownSubtitle.cs</DependentUpon> <DependentUpon>UnknownSubtitle.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>