c# 即時錄音送至openai whisper 翻譯/逐字稿

最近試著做即時翻譯這件事,透過安裝naudio。把麥克風聲音錄下後,每10秒轉成一個檔案上傳至open AI whisper做即時翻譯或逐字稿:


private const string API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private const string API_URL = "https://api.openai.com/v1/audio/transcriptions";
var waveIn = new WaveInEvent();
waveIn.WaveFormat = new WaveFormat(16000, 1);

var buffer = new MemoryStream();
var writer = new WaveFileWriter(buffer, waveIn.WaveFormat);

//var writer = new WaveFileWriter(new DisposeStream(buffer), waveIn.WaveFormat);

waveIn.DataAvailable += async (sender, e) =>
{
writer.Write(e.Buffer, 0, e.BytesRecorded);
if (buffer.Length > 16000 * 2 * 10) // 每10秒
{
var audioData = buffer.ToArray();
buffer.SetLength(0);
buffer.Position = 0;
await SaveAudioChunkAsMp3(audioData, waveIn.WaveFormat);
await SendAudioChunk(audioData);
}
};

Console.WriteLine(“開始錄音。按任意鍵停止…”);
waveIn.StartRecording();
Console.ReadKey();

waveIn.StopRecording();
writer.Dispose();
buffer.Dispose();

static async Task SendAudioChunk(byte[] audioData)
{
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add(“Authorization”, $”Bearer {API_KEY}”);

using var content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(audioData), “file”, “audio.wav”);
content.Add(new StringContent(“whisper-1”), “model”);
content.Add(new StringContent(“language”), “zh-hant”);

var response = await httpClient.PostAsync(API_URL, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine($”Transcription: {result}”);
}

作者: 林壽山

目前任職於軟體公司研究開發部門,擔任專業處長,專注於.NET C# 開發,並具備豐富的POS 收銀系統與金流整合開發經驗。我精通各類支付系統的設計與開發,包含第三方支付(如綠界、藍新、歐付寶、速買配、馬來西亞 ePay/HappyPay、台新 One 碼)、行動支付(悠遊卡、一卡通、支付寶、微信支付、街口支付)、以及信用卡支付(聯合信用卡)。 熟悉多種開發技術,擅長PHP 網頁開發(CodeIgniter、Laravel 框架)、Delphi 程式設計、資料庫設計、C# WinForm/WebForm 應用開發、ASP.NET MVC、API 串接設計,並具備LINE 串接開發的豐富經驗。 除了技術開發之外,我也熱衷於技術分享,曾擔任台中學校產業學院講師 5 年,培育新一代的軟體開發人才,致力於推動軟體技術的應用與創新。 我對技術充滿熱忱,始終保持學習與探索的心態,期望透過軟體開發為企業與社會創造更大的價值。