-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
131 lines (109 loc) · 4.77 KB
/
Copy pathProgram.cs
File metadata and controls
131 lines (109 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
if (args == null || args.Length == 0)
{
Console.WriteLine("Informe o arquivo a transcrever.");
return;
}
string inputFilePath = args[0];
var path = Path.GetDirectoryName(inputFilePath);
var extension = Path.GetExtension(inputFilePath);
// Check if the extension is a valid audio or video format
if (!IsValidAudioExtension(extension) && !IsValidVideoExtension(extension))
{
Console.WriteLine("Formato de arquivo inválido: " + extension);
return;
}
string tempDirectory = Path.GetTempPath();
string mp3FilePath;
bool isAudioFile = IsValidAudioExtension(extension);
if (!isAudioFile)
{
Console.WriteLine($"Converting to mp3");
mp3FilePath = Path.Combine(tempDirectory, Guid.NewGuid() + ".mp3");
if (File.Exists(mp3FilePath)) File.Delete(mp3FilePath);
ConvertVideoToMp3(inputFilePath, mp3FilePath);
}
else
{
mp3FilePath = inputFilePath;
}
string outputFilePath = isAudioFile ? Path.ChangeExtension(inputFilePath, ".txt") : Path.ChangeExtension(inputFilePath, ".srt");
if (File.Exists(outputFilePath)) File.Delete(outputFilePath);
bool useTranslationEndpoint = args.Length > 1 && args[1] == "--translate";
string endpointUrl = useTranslationEndpoint ? "https://api.openai.com/v1/audio/translations" : "https://api.openai.com/v1/audio/transcriptions";
Console.WriteLine($"Gerando {(useTranslationEndpoint ? "tradução" : "transcrição")} do arquivo {inputFilePath}");
await ConvertMp3ToText(mp3FilePath, outputFilePath, endpointUrl, isAudioFile ? "text" : "srt");
Console.WriteLine($"Arquivo Criado: {outputFilePath}");
}
static bool IsValidAudioExtension(string extension)
{
return extension == ".mp3" || extension == ".mpga" || extension == ".m4a" || extension == ".wav";
}
static bool IsValidVideoExtension(string extension)
{
return extension == ".mp4" || extension == ".mpeg" || extension == ".webm";
}
static void ConvertVideoToMp3(string videoFilePath, string mp3FilePath)
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments = $"-i \"{videoFilePath}\" -vn -ar 44100 -ac 2 -b:a 32k \"{mp3FilePath}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process process = new Process { StartInfo = startInfo })
{
process.Start();
// Read the standard error output to get progress information
while (!process.StandardError.EndOfStream)
{
var line = process.StandardError.ReadLine();
if (line?.Contains("time=") == true)
{
int timeIndex = line.IndexOf("time=");
string timeStr = line.Substring(timeIndex + 5, 11);
Console.WriteLine($"Progresso: {timeStr}");
}
}
process.WaitForExit();
}
}
static async Task ConvertMp3ToText(string mp3FilePath, string outputFilePath, string endpointUrl, string responseFormat = "srt")
{
var apiKey = Environment.GetEnvironmentVariable("WHISPER_API_KEY");
if (string.IsNullOrWhiteSpace(apiKey))
{
Console.WriteLine("Erro: A chave de api da openAI não foi encontrada. Tente executar o Uninstall.bat e então o Install.bat novametne para poder informar a chave.\nPressione qualquer tecla para continuar...");
Console.ReadLine();
return;
}
apiKey = apiKey.Trim();
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + apiKey);
MultipartFormDataContent form = new MultipartFormDataContent();
form.Add(new StringContent("whisper-1"), "model");
form.Add(new ByteArrayContent(File.ReadAllBytes(mp3FilePath)), "file", Path.GetFileName(mp3FilePath));
form.Add(new StringContent(responseFormat), "response_format");
HttpResponseMessage response = await client.PostAsync(endpointUrl, form);
if (response.IsSuccessStatusCode)
{
string outputData = await response.Content.ReadAsStringAsync();
File.WriteAllText(outputFilePath, outputData);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}
}
}