BotSharp/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Audio/AudioTranscriptionProvider.cs

135 lines
4.2 KiB
C#
Raw Normal View History

2024-08-28 16:08:12 +00:00
using OpenAI.Audio;
namespace BotSharp.Plugin.OpenAI.Providers.Audio;
2025-03-22 00:28:22 +00:00
public class AudioTranscriptionProvider : IAudioTranscription
2024-08-28 16:08:12 +00:00
{
2025-03-22 00:28:22 +00:00
private readonly IServiceProvider _services;
public string Provider => "openai";
public string Model => _model;
private string _model;
public AudioTranscriptionProvider(IServiceProvider service)
{
_services = service;
}
public void SetModelName(string model)
{
_model = model;
}
public async Task<string> TranscriptTextAsync(Stream audio, string audioFileName, string? text = null)
2024-08-28 16:08:12 +00:00
{
var audioClient = ProviderHelper.GetClient(Provider, _model, _services)
.GetAudioClient(_model);
var options = PrepareTranscriptionOptions(text);
var result = await audioClient.TranscribeAudioAsync(audio, audioFileName, options);
return result.Value.Text;
}
private AudioTranscriptionOptions PrepareTranscriptionOptions(string? text)
{
2025-09-17 18:33:48 +00:00
var settingsService = _services.GetRequiredService<ILlmProviderService>();
2024-08-28 16:08:12 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2025-09-17 18:33:48 +00:00
var settings = settingsService.GetSetting(Provider, _model)?.Audio?.Transcription;
var temperature = state.GetState("audio_temperature");
var responseFormat = state.GetState("audio_response_format");
var granularity = state.GetState("audio_granularity");
if (string.IsNullOrEmpty(temperature) && settings?.Temperature != null)
{
temperature = $"{settings.Temperature}";
}
2025-09-23 18:27:04 +00:00
responseFormat = settings?.ResponseFormat != null ? LlmUtility.VerifyModelParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
granularity = settings?.Granularity != null ? LlmUtility.VerifyModelParameter(granularity, settings.Granularity.Default, settings.Granularity.Options) : null;
2024-08-28 17:06:23 +00:00
2024-08-28 16:08:12 +00:00
var options = new AudioTranscriptionOptions
{
Prompt = text
};
2025-09-17 18:33:48 +00:00
if (!string.IsNullOrEmpty(temperature))
{
options.Temperature = GetTemperature(temperature);
}
if (!string.IsNullOrEmpty(responseFormat))
{
options.ResponseFormat = GetTranscriptionResponseFormat(responseFormat);
}
if (!string.IsNullOrEmpty(granularity))
{
options.TimestampGranularities = GetGranularity(granularity);
}
2024-08-28 16:08:12 +00:00
return options;
}
2024-08-28 17:06:23 +00:00
private AudioTranscriptionFormat GetTranscriptionResponseFormat(string input)
2024-08-28 16:08:12 +00:00
{
2025-09-17 18:33:48 +00:00
var value = !string.IsNullOrEmpty(input) ? input : "json";
2024-08-28 16:08:12 +00:00
2024-08-28 17:06:23 +00:00
AudioTranscriptionFormat format;
2024-08-28 16:08:12 +00:00
switch (value)
{
case "json":
2025-09-12 16:30:41 +00:00
format = new AudioTranscriptionFormat("json");
break;
case "text":
format = new AudioTranscriptionFormat("text");
break;
case "simple":
2024-08-28 17:06:23 +00:00
format = AudioTranscriptionFormat.Simple;
2024-08-28 16:08:12 +00:00
break;
case "srt":
2024-08-28 17:06:23 +00:00
format = AudioTranscriptionFormat.Srt;
2024-08-28 16:08:12 +00:00
break;
case "vtt":
2024-08-28 17:06:23 +00:00
format = AudioTranscriptionFormat.Vtt;
2024-08-28 16:08:12 +00:00
break;
default:
2024-08-28 17:06:23 +00:00
format = AudioTranscriptionFormat.Verbose;
break;
}
return format;
}
private AudioTimestampGranularities GetGranularity(string input)
{
var value = !string.IsNullOrEmpty(input) ? input : "default";
AudioTimestampGranularities granularity;
switch (value)
{
case "word":
granularity = AudioTimestampGranularities.Word;
2024-08-28 16:08:12 +00:00
break;
2024-08-28 17:06:23 +00:00
case "segment":
granularity = AudioTimestampGranularities.Segment;
break;
default:
granularity = AudioTimestampGranularities.Default;
break;
}
return granularity;
}
2024-08-28 18:43:37 +00:00
private float? GetTemperature(string input)
2024-08-28 17:06:23 +00:00
{
if (!float.TryParse(input, out var temperature))
{
2024-08-28 18:43:37 +00:00
return null;
2024-08-28 16:08:12 +00:00
}
2024-08-28 17:06:23 +00:00
return temperature;
2024-08-28 16:08:12 +00:00
}
}