BotSharp/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Audio/AudioCompletionProvider.SpeechToText.cs

90 lines
2.7 KiB
C#
Raw Normal View History

2024-08-28 16:08:12 +00:00
using OpenAI.Audio;
namespace BotSharp.Plugin.OpenAI.Providers.Audio;
public partial class AudioCompletionProvider
{
public async Task<string> GenerateTextFromAudioAsync(Stream audio, string audioFileName, string? text = null)
{
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)
{
var state = _services.GetRequiredService<IConversationStateService>();
2024-08-28 17:06:23 +00:00
var format = GetTranscriptionResponseFormat(state.GetState("audio_response_format"));
var granularity = GetGranularity(state.GetState("audio_granularity"));
var temperature = GetTemperature(state.GetState("audio_temperature"));
2024-08-28 16:08:12 +00:00
var options = new AudioTranscriptionOptions
{
2024-08-28 17:06:23 +00:00
ResponseFormat = format,
2024-10-02 18:00:23 +00:00
TimestampGranularities = granularity,
2024-08-28 17:06:23 +00:00
Temperature = temperature,
2024-08-28 16:08:12 +00:00
Prompt = text
};
return options;
}
2024-08-28 17:06:23 +00:00
private AudioTranscriptionFormat GetTranscriptionResponseFormat(string input)
2024-08-28 16:08:12 +00:00
{
2024-08-28 17:06:23 +00:00
var value = !string.IsNullOrEmpty(input) ? input : "verbose";
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":
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
}
}