mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-28 06:52:35 +01:00
Add download of Whisper CTranslate2 models (multi file)
This commit is contained in:
parent
65365b5213
commit
4b878aa920
123
src/libse/AudioToText/WhisperCTranslate2Model.cs
Normal file
123
src/libse/AudioToText/WhisperCTranslate2Model.cs
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Nikse.SubtitleEdit.Core.AudioToText
|
||||||
|
{
|
||||||
|
public class WhisperCTranslate2Model : IWhisperModel
|
||||||
|
{
|
||||||
|
public string[] Urls { get; set; }
|
||||||
|
public string Size { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public bool AlreadyDownloaded { get; set; }
|
||||||
|
public long Bytes { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{(AlreadyDownloaded ? "* " : string.Empty)}{Name} ({Size})";
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string[] _fileNames = { "model.bin", "config.json", "vocabulary.txt", "tokenizer.json" };
|
||||||
|
|
||||||
|
public string ModelFolder => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".cache", "whisper-ctranslate2");
|
||||||
|
|
||||||
|
public void CreateModelFolder()
|
||||||
|
{
|
||||||
|
var cacheFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".cache");
|
||||||
|
if (!Directory.Exists(cacheFolder))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(cacheFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(ModelFolder))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ModelFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://github.com/jordimas/whisper-ctranslate2/blob/main/src/whisper_ctranslate2/models.py
|
||||||
|
public WhisperModel[] Models => new[]
|
||||||
|
{
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "tiny.en",
|
||||||
|
Size = "74 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/c4d1be0a2003ce00bb721abd23e7a34925a6f0c0d21d5c416f11c763ee7f7b15.tiny-en/"),
|
||||||
|
Folder = "c4d1be0a2003ce00bb721abd23e7a34925a6f0c0d21d5c416f11c763ee7f7b15.tiny-en",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "tiny",
|
||||||
|
Size = "74 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/dc6a7765cdc8ae7822b1c3068a2f966eddc2549eda7e67406cae915a8c19430c.tiny/"),
|
||||||
|
Folder = "dc6a7765cdc8ae7822b1c3068a2f966eddc2549eda7e67406cae915a8c19430c.tiny",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "base.en",
|
||||||
|
Size = "142 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/2ca96777261aeadd48e30bc5f26fd3ee462f4921dbc1f38dfd826a67c761c9b2.base-en/"),
|
||||||
|
Folder = "2ca96777261aeadd48e30bc5f26fd3ee462f4921dbc1f38dfd826a67c761c9b2.base-en",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "base",
|
||||||
|
Size = "142 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/d7c4df31737340263ce37933bda1e77a38367dbb09cda7433ce1ee0c58ce1a60.base/"),
|
||||||
|
Folder = "d7c4df31737340263ce37933bda1e77a38367dbb09cda7433ce1ee0c58ce1a60.base",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "small.en",
|
||||||
|
Size = "472 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/e2c14bb0f6a8a69afe12fbe1d82fa0c41494d4bde9615bdf399da5665f43cbc4.small-en/"),
|
||||||
|
Folder = "e2c14bb0f6a8a69afe12fbe1d82fa0c41494d4bde9615bdf399da5665f43cbc4.small-en",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "small",
|
||||||
|
Size = "472 MB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/936cd99363be80fa388c0c5006e846d8cd42834c6cf8156a7c300723a3bf929f.small/"),
|
||||||
|
Folder = "936cd99363be80fa388c0c5006e846d8cd42834c6cf8156a7c300723a3bf929f.small",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "medium",
|
||||||
|
Size = "1.5 GB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/d8b91e278db3041c3b41bf879716281edf5cfa7b0025823cc174b5429877d2bc.medium/"),
|
||||||
|
Folder = "d8b91e278db3041c3b41bf879716281edf5cfa7b0025823cc174b5429877d2bc.medium",
|
||||||
|
},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "medium.en",
|
||||||
|
Size = "1.5 GB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/22d42d3e69ce9149bfd52c07d357e4cb72b992fb602805d6bb39f331400d6742.mediu-en/"),
|
||||||
|
Folder = "22d42d3e69ce9149bfd52c07d357e4cb72b992fb602805d6bb39f331400d6742.mediu-en",
|
||||||
|
},
|
||||||
|
//new WhisperModel - large-v1
|
||||||
|
//{
|
||||||
|
// Name = "large",
|
||||||
|
// Size = "2.1 GB",
|
||||||
|
// Urls = "MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/ea44e7a9609bd21a604b28880b85fc7dc2c373876c627a7553ce5440a8c406c1.large/"),
|
||||||
|
//},
|
||||||
|
new WhisperModel
|
||||||
|
{
|
||||||
|
Name = "large", // large-v2
|
||||||
|
Size = "2.9 GB",
|
||||||
|
Urls = MakeUrls("https://huggingface.co/datasets/jordimas/whisper-ct2-v2/resolve/main/ff9f410b63b3d996274c895f6209e9b9ab01d497815b21c2d35ae336ab7d7f20.large-v2/"),
|
||||||
|
Folder = "ff9f410b63b3d996274c895f6209e9b9ab01d497815b21c2d35ae336ab7d7f20.large-v2",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
private string[] MakeUrls(string baseUrl)
|
||||||
|
{
|
||||||
|
var result = new List<string>();
|
||||||
|
foreach (var fileName in _fileNames)
|
||||||
|
{
|
||||||
|
result.Add(baseUrl.TrimEnd('/') + "/" + fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,64 +27,55 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
|||||||
{
|
{
|
||||||
Name = "tiny.en",
|
Name = "tiny.en",
|
||||||
Size = "74 MB",
|
Size = "74 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-tiny.en.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-tiny.en.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-tiny.en.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "tiny",
|
Name = "tiny",
|
||||||
Size = "74 MB",
|
Size = "74 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-tiny.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "base.en",
|
Name = "base.en",
|
||||||
Size = "141 MB",
|
Size = "141 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-base.en.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "base",
|
Name = "base",
|
||||||
Size = "141 MB",
|
Size = "141 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-base.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-base.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-base.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "small.en",
|
Name = "small.en",
|
||||||
Size = "465 MB",
|
Size = "465 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-small.en.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-small.en.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-small.en.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "small",
|
Name = "small",
|
||||||
Size = "465 MB",
|
Size = "465 MB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-small.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-small.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-small.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "medium.en",
|
Name = "medium.en",
|
||||||
Size = "1.42 GB",
|
Size = "1.42 GB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-medium.en.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-medium.en.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-medium.en.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "medium",
|
Name = "medium",
|
||||||
Size = "1.42 GB",
|
Size = "1.42 GB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-medium.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "large",
|
Name = "large",
|
||||||
Size = "2.88 GB",
|
Size = "2.88 GB",
|
||||||
UrlSecondary = "https://ggml.ggerganov.com/ggml-model-whisper-large.bin",
|
Urls = new []{ "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-large.bin" },
|
||||||
UrlPrimary = "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main/ggml-large.bin",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,11 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
|||||||
return new WhisperCppModel();
|
return new WhisperCppModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.CTranslate2)
|
||||||
|
{
|
||||||
|
return new WhisperCTranslate2Model();
|
||||||
|
}
|
||||||
|
|
||||||
return new WhisperModel();
|
return new WhisperModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,6 +30,11 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
|||||||
return ".bin";
|
return ".bin";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.CTranslate2)
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
return ".pt";
|
return ".pt";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,10 +5,10 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
|||||||
{
|
{
|
||||||
public class WhisperModel : IWhisperModel
|
public class WhisperModel : IWhisperModel
|
||||||
{
|
{
|
||||||
public string UrlPrimary { get; set; }
|
public string[] Urls { get; set; }
|
||||||
public string UrlSecondary { get; set; }
|
|
||||||
public string Size { get; set; }
|
public string Size { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
public string Folder { get; set; }
|
||||||
public bool AlreadyDownloaded { get; set; }
|
public bool AlreadyDownloaded { get; set; }
|
||||||
public long Bytes { get; set; }
|
public long Bytes { get; set; }
|
||||||
|
|
||||||
@ -40,71 +40,61 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
|||||||
{
|
{
|
||||||
Name = "tiny.en",
|
Name = "tiny.en",
|
||||||
Size = "74 MB",
|
Size = "74 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "tiny",
|
Name = "tiny",
|
||||||
Size = "74 MB",
|
Size = "74 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "base.en",
|
Name = "base.en",
|
||||||
Size = "142 MB",
|
Size = "142 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "base",
|
Name = "base",
|
||||||
Size = "142 MB",
|
Size = "142 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "small.en",
|
Name = "small.en",
|
||||||
Size = "472 MB",
|
Size = "472 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "small",
|
Name = "small",
|
||||||
Size = "472 MB",
|
Size = "472 MB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "medium",
|
Name = "medium",
|
||||||
Size = "1.5 GB",
|
Size = "1.5 GB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt",
|
|
||||||
},
|
},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "medium.en",
|
Name = "medium.en",
|
||||||
Size = "1.5 GB",
|
Size = "1.5 GB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt",
|
|
||||||
},
|
},
|
||||||
//new WhisperModel - large-v1
|
//new WhisperModel - large-v1
|
||||||
//{
|
//{
|
||||||
// Name = "large",
|
// Name = "large",
|
||||||
// Size = "2.1 GB",
|
// Size = "2.1 GB",
|
||||||
// UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large.pt",
|
// Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large.pt" },
|
||||||
// UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large.pt",
|
|
||||||
//},
|
//},
|
||||||
new WhisperModel
|
new WhisperModel
|
||||||
{
|
{
|
||||||
Name = "large", // large-v2
|
Name = "large", // large-v2
|
||||||
Size = "2.9 GB",
|
Size = "2.9 GB",
|
||||||
UrlPrimary = "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt",
|
Urls = new []{ "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt" },
|
||||||
UrlSecondary = "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Vosk;
|
|
||||||
|
|
||||||
namespace Nikse.SubtitleEdit.Forms.AudioToText
|
namespace Nikse.SubtitleEdit.Forms.AudioToText
|
||||||
{
|
{
|
||||||
@ -166,8 +165,6 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
comboBoxCharsPerSub.Visible = Configuration.Settings.Tools.WhisperChoice == WhisperChoice.Cpp;
|
comboBoxCharsPerSub.Visible = Configuration.Settings.Tools.WhisperChoice == WhisperChoice.Cpp;
|
||||||
labelCharsPerSub.Left = comboBoxCharsPerSub.Left - labelCharsPerSub.Width - 9;
|
labelCharsPerSub.Left = comboBoxCharsPerSub.Left - labelCharsPerSub.Width - 9;
|
||||||
labelCharsPerSub.Visible = Configuration.Settings.Tools.WhisperChoice == WhisperChoice.Cpp;
|
labelCharsPerSub.Visible = Configuration.Settings.Tools.WhisperChoice == WhisperChoice.Cpp;
|
||||||
|
|
||||||
buttonDownload.Enabled = Configuration.Settings.Tools.WhisperChoice != WhisperChoice.CTranslate2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FillModels(ComboBox comboBoxModels, string lastDownloadedModel)
|
public static void FillModels(ComboBox comboBoxModels, string lastDownloadedModel)
|
||||||
@ -175,11 +172,20 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
var whisperModel = WhisperHelper.GetWhisperModel();
|
var whisperModel = WhisperHelper.GetWhisperModel();
|
||||||
var modelsFolder = whisperModel.ModelFolder;
|
var modelsFolder = whisperModel.ModelFolder;
|
||||||
var selectName = string.IsNullOrEmpty(lastDownloadedModel) ? Configuration.Settings.Tools.WhisperModel : lastDownloadedModel;
|
var selectName = string.IsNullOrEmpty(lastDownloadedModel) ? Configuration.Settings.Tools.WhisperModel : lastDownloadedModel;
|
||||||
|
|
||||||
|
if (!Directory.Exists(modelsFolder))
|
||||||
|
{
|
||||||
|
whisperModel.CreateModelFolder();
|
||||||
|
}
|
||||||
|
|
||||||
comboBoxModels.Items.Clear();
|
comboBoxModels.Items.Clear();
|
||||||
|
|
||||||
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.CTranslate2)
|
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.CTranslate2)
|
||||||
{
|
{
|
||||||
foreach (var model in whisperModel.Models)
|
foreach (var model in whisperModel.Models)
|
||||||
|
{
|
||||||
|
var path = Path.Combine(modelsFolder, model.Folder, "model.bin");
|
||||||
|
if (File.Exists(path))
|
||||||
{
|
{
|
||||||
comboBoxModels.Items.Add(model);
|
comboBoxModels.Items.Add(model);
|
||||||
if (model.Name == selectName)
|
if (model.Name == selectName)
|
||||||
@ -187,6 +193,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
comboBoxModels.SelectedIndex = comboBoxModels.Items.Count - 1;
|
comboBoxModels.SelectedIndex = comboBoxModels.Items.Count - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (comboBoxModels.SelectedIndex < 0 && comboBoxModels.Items.Count > 0)
|
if (comboBoxModels.SelectedIndex < 0 && comboBoxModels.Items.Count > 0)
|
||||||
{
|
{
|
||||||
@ -196,11 +203,6 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Directory.Exists(modelsFolder))
|
|
||||||
{
|
|
||||||
whisperModel.CreateModelFolder();
|
|
||||||
}
|
|
||||||
|
|
||||||
var models = new List<WhisperModel>();
|
var models = new List<WhisperModel>();
|
||||||
foreach (var fileName in Directory.GetFiles(modelsFolder))
|
foreach (var fileName in Directory.GetFiles(modelsFolder))
|
||||||
{
|
{
|
||||||
@ -1317,7 +1319,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
checkBoxTranslateToEnglish.Enabled = comboBoxLanguages.Text.ToLowerInvariant() != "english";
|
checkBoxTranslateToEnglish.Enabled = comboBoxLanguages.Text.ToLowerInvariant() != "english";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void whisperPhpOriginalToolStripMenuItem_Click(object sender, EventArgs e)
|
private void WhisperPhpOriginalChoose()
|
||||||
{
|
{
|
||||||
Configuration.Settings.Tools.WhisperChoice = WhisperChoice.OpenAI;
|
Configuration.Settings.Tools.WhisperChoice = WhisperChoice.OpenAI;
|
||||||
|
|
||||||
@ -1348,12 +1350,6 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void whisperCppCToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Configuration.Settings.Tools.WhisperChoice = WhisperChoice.Cpp;
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void removeTemporaryFilesToolStripMenuItem_Click(object sender, EventArgs e)
|
private void removeTemporaryFilesToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Configuration.Settings.Tools.WhisperDeleteTempFiles = !Configuration.Settings.Tools.WhisperDeleteTempFiles;
|
Configuration.Settings.Tools.WhisperDeleteTempFiles = !Configuration.Settings.Tools.WhisperDeleteTempFiles;
|
||||||
@ -1433,7 +1429,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
|
|
||||||
if (comboBoxWhisperEngine.Text == WhisperChoice.OpenAI)
|
if (comboBoxWhisperEngine.Text == WhisperChoice.OpenAI)
|
||||||
{
|
{
|
||||||
whisperPhpOriginalToolStripMenuItem_Click(null, null);
|
WhisperPhpOriginalChoose();
|
||||||
}
|
}
|
||||||
else if (comboBoxWhisperEngine.Text == WhisperChoice.Cpp)
|
else if (comboBoxWhisperEngine.Text == WhisperChoice.Cpp)
|
||||||
{
|
{
|
||||||
|
@ -33,13 +33,14 @@
|
|||||||
this.buttonCancel = new System.Windows.Forms.Button();
|
this.buttonCancel = new System.Windows.Forms.Button();
|
||||||
this.comboBoxModels = new System.Windows.Forms.ComboBox();
|
this.comboBoxModels = new System.Windows.Forms.ComboBox();
|
||||||
this.textBoxError = new System.Windows.Forms.TextBox();
|
this.textBoxError = new System.Windows.Forms.TextBox();
|
||||||
|
this.labelFileName = new System.Windows.Forms.Label();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// labelPleaseWait
|
// labelPleaseWait
|
||||||
//
|
//
|
||||||
this.labelPleaseWait.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.labelPleaseWait.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.labelPleaseWait.AutoSize = true;
|
this.labelPleaseWait.AutoSize = true;
|
||||||
this.labelPleaseWait.Location = new System.Drawing.Point(12, 92);
|
this.labelPleaseWait.Location = new System.Drawing.Point(12, 111);
|
||||||
this.labelPleaseWait.Name = "labelPleaseWait";
|
this.labelPleaseWait.Name = "labelPleaseWait";
|
||||||
this.labelPleaseWait.Size = new System.Drawing.Size(70, 13);
|
this.labelPleaseWait.Size = new System.Drawing.Size(70, 13);
|
||||||
this.labelPleaseWait.TabIndex = 3;
|
this.labelPleaseWait.TabIndex = 3;
|
||||||
@ -61,7 +62,7 @@
|
|||||||
this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
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.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
|
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
|
||||||
this.buttonCancel.Location = new System.Drawing.Point(362, 87);
|
this.buttonCancel.Location = new System.Drawing.Point(362, 106);
|
||||||
this.buttonCancel.Name = "buttonCancel";
|
this.buttonCancel.Name = "buttonCancel";
|
||||||
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
|
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
|
||||||
this.buttonCancel.TabIndex = 4;
|
this.buttonCancel.TabIndex = 4;
|
||||||
@ -83,18 +84,29 @@
|
|||||||
this.textBoxError.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.textBoxError.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.textBoxError.Location = new System.Drawing.Point(15, 69);
|
this.textBoxError.Location = new System.Drawing.Point(97, 86);
|
||||||
this.textBoxError.Multiline = true;
|
this.textBoxError.Multiline = true;
|
||||||
this.textBoxError.Name = "textBoxError";
|
this.textBoxError.Name = "textBoxError";
|
||||||
this.textBoxError.ReadOnly = true;
|
this.textBoxError.ReadOnly = true;
|
||||||
this.textBoxError.Size = new System.Drawing.Size(422, 12);
|
this.textBoxError.Size = new System.Drawing.Size(340, 14);
|
||||||
this.textBoxError.TabIndex = 2;
|
this.textBoxError.TabIndex = 2;
|
||||||
//
|
//
|
||||||
|
// labelFileName
|
||||||
|
//
|
||||||
|
this.labelFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.labelFileName.AutoSize = true;
|
||||||
|
this.labelFileName.Location = new System.Drawing.Point(12, 86);
|
||||||
|
this.labelFileName.Name = "labelFileName";
|
||||||
|
this.labelFileName.Size = new System.Drawing.Size(52, 13);
|
||||||
|
this.labelFileName.TabIndex = 5;
|
||||||
|
this.labelFileName.Text = "File name";
|
||||||
|
//
|
||||||
// WhisperModelDownload
|
// WhisperModelDownload
|
||||||
//
|
//
|
||||||
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(449, 120);
|
this.ClientSize = new System.Drawing.Size(449, 139);
|
||||||
|
this.Controls.Add(this.labelFileName);
|
||||||
this.Controls.Add(this.textBoxError);
|
this.Controls.Add(this.textBoxError);
|
||||||
this.Controls.Add(this.comboBoxModels);
|
this.Controls.Add(this.comboBoxModels);
|
||||||
this.Controls.Add(this.labelPleaseWait);
|
this.Controls.Add(this.labelPleaseWait);
|
||||||
@ -122,5 +134,6 @@
|
|||||||
private System.Windows.Forms.Button buttonCancel;
|
private System.Windows.Forms.Button buttonCancel;
|
||||||
private System.Windows.Forms.ComboBox comboBoxModels;
|
private System.Windows.Forms.ComboBox comboBoxModels;
|
||||||
private System.Windows.Forms.TextBox textBoxError;
|
private System.Windows.Forms.TextBox textBoxError;
|
||||||
|
private System.Windows.Forms.Label labelFileName;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,6 +3,7 @@ using Nikse.SubtitleEdit.Core.Common;
|
|||||||
using Nikse.SubtitleEdit.Logic;
|
using Nikse.SubtitleEdit.Logic;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@ -13,7 +14,6 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
public bool AutoClose { get; internal set; }
|
public bool AutoClose { get; internal set; }
|
||||||
public WhisperModel LastDownloadedModel { get; private set; }
|
public WhisperModel LastDownloadedModel { get; private set; }
|
||||||
private readonly CancellationTokenSource _cancellationTokenSource;
|
private readonly CancellationTokenSource _cancellationTokenSource;
|
||||||
private bool _error;
|
|
||||||
private string _downloadFileName;
|
private string _downloadFileName;
|
||||||
|
|
||||||
public WhisperModelDownload()
|
public WhisperModelDownload()
|
||||||
@ -29,7 +29,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
var selectedIndex = 0;
|
var selectedIndex = 0;
|
||||||
foreach (var downloadModel in WhisperHelper.GetWhisperModel().Models)
|
foreach (var downloadModel in WhisperHelper.GetWhisperModel().Models)
|
||||||
{
|
{
|
||||||
var fileName = MakeDownloadFileName(downloadModel);
|
var fileName = MakeDownloadFileName(downloadModel, downloadModel.Urls[0]);
|
||||||
downloadModel.AlreadyDownloaded = File.Exists(fileName);
|
downloadModel.AlreadyDownloaded = File.Exists(fileName);
|
||||||
|
|
||||||
comboBoxModels.Items.Add(downloadModel);
|
comboBoxModels.Items.Add(downloadModel);
|
||||||
@ -41,6 +41,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
|
|
||||||
comboBoxModels.SelectedIndex = selectedIndex;
|
comboBoxModels.SelectedIndex = selectedIndex;
|
||||||
labelPleaseWait.Text = string.Empty;
|
labelPleaseWait.Text = string.Empty;
|
||||||
|
labelFileName.Text = string.Empty;
|
||||||
textBoxError.Visible = false;
|
textBoxError.Visible = false;
|
||||||
_cancellationTokenSource = new CancellationTokenSource();
|
_cancellationTokenSource = new CancellationTokenSource();
|
||||||
}
|
}
|
||||||
@ -66,14 +67,18 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
}
|
}
|
||||||
|
|
||||||
LastDownloadedModel = (WhisperModel)comboBoxModels.Items[comboBoxModels.SelectedIndex];
|
LastDownloadedModel = (WhisperModel)comboBoxModels.Items[comboBoxModels.SelectedIndex];
|
||||||
var url = _error ? LastDownloadedModel.UrlSecondary : LastDownloadedModel.UrlPrimary;
|
MultiFileDownload();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MultiFileDownload()
|
||||||
|
{
|
||||||
|
var currentDownloadUrl = string.Empty;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
labelPleaseWait.Text = LanguageSettings.Current.General.PleaseWait;
|
labelPleaseWait.Text = LanguageSettings.Current.General.PleaseWait;
|
||||||
buttonDownload.Enabled = false;
|
buttonDownload.Enabled = false;
|
||||||
Refresh();
|
Refresh();
|
||||||
Cursor = Cursors.WaitCursor;
|
Cursor = Cursors.WaitCursor;
|
||||||
var httpClient = HttpClientHelper.MakeHttpClient();
|
|
||||||
|
|
||||||
var folder = WhisperHelper.GetWhisperModel().ModelFolder;
|
var folder = WhisperHelper.GetWhisperModel().ModelFolder;
|
||||||
if (!Directory.Exists(folder))
|
if (!Directory.Exists(folder))
|
||||||
@ -81,7 +86,21 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
WhisperHelper.GetWhisperModel().CreateModelFolder();
|
WhisperHelper.GetWhisperModel().CreateModelFolder();
|
||||||
}
|
}
|
||||||
|
|
||||||
_downloadFileName = MakeDownloadFileName(LastDownloadedModel) + ".$$$";
|
if (!string.IsNullOrEmpty(LastDownloadedModel.Folder))
|
||||||
|
{
|
||||||
|
folder = Path.Combine(folder, LastDownloadedModel.Folder);
|
||||||
|
if (!Directory.Exists(folder))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var url in LastDownloadedModel.Urls)
|
||||||
|
{
|
||||||
|
var httpClient = HttpClientHelper.MakeHttpClient();
|
||||||
|
currentDownloadUrl = url;
|
||||||
|
_downloadFileName = MakeDownloadFileName(LastDownloadedModel, url) + ".$$$";
|
||||||
|
labelFileName.Text = url.Split('/').Last();
|
||||||
using (var downloadStream = new FileStream(_downloadFileName, FileMode.Create, FileAccess.Write))
|
using (var downloadStream = new FileStream(_downloadFileName, FileMode.Create, FileAccess.Write))
|
||||||
{
|
{
|
||||||
var downloadTask = httpClient.DownloadAsync(url, downloadStream, new Progress<float>((progress) =>
|
var downloadTask = httpClient.DownloadAsync(url, downloadStream, new Progress<float>((progress) =>
|
||||||
@ -113,20 +132,44 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
CompleteDownload(downloadStream);
|
CompleteDownload(downloadStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Cursor = Cursors.Default;
|
||||||
|
labelPleaseWait.Text = string.Empty;
|
||||||
|
|
||||||
|
if (AutoClose)
|
||||||
|
{
|
||||||
|
DialogResult = DialogResult.OK;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buttonDownload.Enabled = true;
|
||||||
|
labelPleaseWait.Text = string.Format(LanguageSettings.Current.SettingsFfmpeg.XDownloadOk, "Whisper model");
|
||||||
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
labelPleaseWait.Text = string.Empty;
|
labelPleaseWait.Text = string.Empty;
|
||||||
buttonDownload.Enabled = true;
|
buttonDownload.Enabled = true;
|
||||||
Cursor = Cursors.Default;
|
Cursor = Cursors.Default;
|
||||||
MessageBox.Show($"Unable to download {url}!" + Environment.NewLine + Environment.NewLine +
|
MessageBox.Show($"Unable to download {currentDownloadUrl}!" + Environment.NewLine + Environment.NewLine +
|
||||||
exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace);
|
exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace);
|
||||||
_error = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string MakeDownloadFileName(WhisperModel model)
|
private static string MakeDownloadFileName(WhisperModel model, string url)
|
||||||
{
|
{
|
||||||
return Path.Combine(WhisperHelper.GetWhisperModel().ModelFolder, model.Name + WhisperHelper.ModelExtension());
|
var path = WhisperHelper.GetWhisperModel().ModelFolder;
|
||||||
|
if (!string.IsNullOrEmpty(model.Folder))
|
||||||
|
{
|
||||||
|
path = Path.Combine(path, model.Folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model.Urls.Length > 1)
|
||||||
|
{
|
||||||
|
var arr = url.Split('/');
|
||||||
|
return Path.Combine(path, arr.Last());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Path.Combine(path, model.Name + WhisperHelper.ModelExtension());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buttonCancel_Click(object sender, EventArgs e)
|
private void buttonCancel_Click(object sender, EventArgs e)
|
||||||
@ -157,18 +200,7 @@ namespace Nikse.SubtitleEdit.Forms.AudioToText
|
|||||||
|
|
||||||
Application.DoEvents();
|
Application.DoEvents();
|
||||||
File.Move(_downloadFileName, newFileName);
|
File.Move(_downloadFileName, newFileName);
|
||||||
|
labelFileName.Text = string.Empty;
|
||||||
Cursor = Cursors.Default;
|
|
||||||
labelPleaseWait.Text = string.Empty;
|
|
||||||
|
|
||||||
if (AutoClose)
|
|
||||||
{
|
|
||||||
DialogResult = DialogResult.OK;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
buttonDownload.Enabled = true;
|
|
||||||
labelPleaseWait.Text = string.Format(LanguageSettings.Current.SettingsFfmpeg.XDownloadOk, "Whisper model");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user