Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/AnthropicTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class AnthropicTranslate : IAutoTranslator, IDisposable
public class AnthropicTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -62,6 +62,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.AnthropicApiModel;
if (string.IsNullOrEmpty(model))
Expand All @@ -74,7 +79,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.AnthropicPrompt = new ToolsSettings().AnthropicPrompt;
}
var prompt = string.Format(Json.EncodeJsonText(Configuration.Settings.Tools.AnthropicPrompt), sourceLanguageCode, targetLanguageCode);
var prompt = Json.EncodeJsonText(string.Format(Configuration.Settings.Tools.AnthropicPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText));
var input = "{ \"model\": \"" + model + "\", \"max_tokens\": 1024, \"messages\": [{ \"role\": \"user\", \"content\": \"" + prompt + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/AvalAi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class AvalAi : IAutoTranslator, IDisposable
public class AvalAi : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -99,6 +99,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.AvalAiModel;
if (string.IsNullOrEmpty(model))
Expand All @@ -111,7 +116,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.AvalAiPrompt = new ToolsSettings().AvalAiPrompt;
}
var prompt = string.Format(Json.EncodeJsonText(Configuration.Settings.Tools.AvalAiPrompt), sourceLanguageCode, targetLanguageCode);
var prompt = Json.EncodeJsonText(string.Format(Configuration.Settings.Tools.AvalAiPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText));
var input = "";
var input2 = "{\"model\": \"" + model + "\",\"messages\": [{ \"role\": \"user\", \"content\": \"" + prompt + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var modelJson = "\"" + model + "\"";
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/ChatGptTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class ChatGptTranslate : IAutoTranslator, IDisposable
public class ChatGptTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private static readonly Regex UnicodeRegex = new Regex(@"\\u([0-9a-fA-F]{4})", RegexOptions.Compiled);

Expand Down Expand Up @@ -97,6 +97,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.ChatGptModel;
if (string.IsNullOrEmpty(model))
Expand All @@ -109,7 +114,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.ChatGptPrompt = new ToolsSettings().ChatGptPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.ChatGptPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.ChatGptPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{\"model\": \"" + Json.EncodeJsonText(model) + "\",\"messages\": [{ \"role\": \"user\", \"content\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/DeepSeekTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class DeepSeekTranslate : IAutoTranslator, IDisposable
public class DeepSeekTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -58,6 +58,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.DeepSeekModel;
if (string.IsNullOrEmpty(model))
Expand All @@ -70,7 +75,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.DeepSeekPrompt = new ToolsSettings().DeepSeekPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.DeepSeekPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.DeepSeekPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{\"model\": \"" + model + "\",\"messages\": [{ \"role\": \"user\", \"content\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";

int[] retryDelays = { 2555, 5007, 9013 };
Expand Down
13 changes: 9 additions & 4 deletions src/libse/AutoTranslate/GeminiTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class GeminiTranslate : IAutoTranslator, IDisposable
public class GeminiTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
public static string StaticName { get; set; } = "Google Gemini";
public override string ToString() => StaticName;
Expand Down Expand Up @@ -82,14 +82,19 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
int[] retryDelays = { 555, 3007, 7013 };
HttpResponseMessage result = null;
string resultContent = null;
var switchedBaseUrl = false;
for (var attempt = 0; attempt <= retryDelays.Length; attempt++)
{
var content = MakeContent(text, sourceLanguageCode, targetLanguageCode);
var content = MakeContent(text, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
result = await _httpClient.PostAsync(_baseUrl, content, cancellationToken);

if (result.StatusCode == System.Net.HttpStatusCode.NotFound && !switchedBaseUrl)
Expand Down Expand Up @@ -147,9 +152,9 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
return outputText;
}

private HttpContent MakeContent(string text, string sourceLanguageCode, string targetLanguageCode)
private HttpContent MakeContent(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText)
{
var prompt = string.Format(Configuration.Settings.Tools.GeminiPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.GeminiPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{ \"contents\": [ { \"role\": \"user\", \"parts\": [{ \"text\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/GroqTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class GroqTranslate : IAutoTranslator, IDisposable
public class GroqTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -76,6 +76,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
//-d '{"messages": [{"role": "user", "content": "Explain the importance of fast language models"}], "model": "llama3-8b-8192"}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.GroqModel;
if (string.IsNullOrEmpty(model))
Expand All @@ -88,7 +93,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.GroqPrompt = new ToolsSettings().GroqPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.GroqPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.GroqPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{\"model\": \"" + model + "\",\"messages\": [{ \"role\": \"user\", \"content\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
23 changes: 23 additions & 0 deletions src/libse/AutoTranslate/IAutoTranslatorWithContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Threading;
using System.Threading.Tasks;

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
/// <summary>
/// Optional extension for <see cref="IAutoTranslator"/> implementations that can use the
/// surrounding subtitle lines (previous/next) as extra context for the translation.
/// </summary>
public interface IAutoTranslatorWithContext
{
/// <summary>
/// Translates the given text, providing the neighboring subtitle lines as extra context.
/// </summary>
/// <param name="text">The text to be translated.</param>
/// <param name="sourceLanguageCode">The language code of the source language.</param>
/// <param name="targetLanguageCode">The language code of the target language.</param>
/// <param name="previousLineText">The subtitle line right before <paramref name="text"/>, or empty if none.</param>
/// <param name="nextLineText">The subtitle line right after <paramref name="text"/>, or empty if none.</param>
/// <param name="cancellationToken">The cancellation token to cancel the translation process.</param>
Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken);
}
}
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/KoboldCppTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class KoboldCppTranslate : IAutoTranslator, IDisposable
public class KoboldCppTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -44,6 +44,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
// var model = Configuration.Settings.Tools.KoboldCppModel;
var modelJson = string.Empty;
Expand All @@ -63,7 +68,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.KoboldCppPrompt = new ToolsSettings().KoboldCppPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.KoboldCppPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.KoboldCppPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{ " + modelJson + temperatureJson + " \"prompt\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\", \"stream\": false }";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/LlamaCppTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class LlamaCppTranslate : IAutoTranslator, IDisposable
public class LlamaCppTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -44,6 +44,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = string.Empty;
var modelJson = string.Empty;
Expand All @@ -57,7 +62,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.LlamaCppPrompt = new ToolsSettings().LlamaCppPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.LlamaCppPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.LlamaCppPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{ " + modelJson + " \"messages\": [{ \"role\": \"user\", \"content\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
9 changes: 7 additions & 2 deletions src/libse/AutoTranslate/LmStudioTranslate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace Nikse.SubtitleEdit.Core.AutoTranslate
{
public class LmStudioTranslate : IAutoTranslator, IDisposable
public class LmStudioTranslate : IAutoTranslator, IAutoTranslatorWithContext, IDisposable
{
private HttpClient _httpClient;

Expand Down Expand Up @@ -44,6 +44,11 @@ public List<TranslationPair> GetSupportedTargetLanguages()
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
return await Translate(text, sourceLanguageCode, targetLanguageCode, string.Empty, string.Empty, cancellationToken);
}

public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, string previousLineText, string nextLineText, CancellationToken cancellationToken)
{
var model = Configuration.Settings.Tools.LmStudioModel;
var modelJson = string.Empty;
Expand All @@ -57,7 +62,7 @@ public async Task<string> Translate(string text, string sourceLanguageCode, stri
{
Configuration.Settings.Tools.LmStudioPrompt = new ToolsSettings().LmStudioPrompt;
}
var prompt = string.Format(Configuration.Settings.Tools.LmStudioPrompt, sourceLanguageCode, targetLanguageCode);
var prompt = string.Format(Configuration.Settings.Tools.LmStudioPrompt, sourceLanguageCode, targetLanguageCode, previousLineText, nextLineText);
var input = "{ " + modelJson + " \"messages\": [{ \"role\": \"user\", \"content\": \"" + Json.EncodeJsonText(prompt) + "\\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Expand Down
Loading