Whisper APIは、OpenAIが開発した音声を文字起こし(Speech to Text)するサービスです。
もともとWhisperはGitHubで公開されていて、ローカルで動かすことができるものでした。しかし、GPU端末でないと処理に時間がかかってしまいます。2023年にChatGPTと同様にAPI化されたことで、自前でサーバを用意する必要がなくなりました。
この記事では流行のWhisper APIについて、C#で使ってみたいと思います。
【検証環境】.NET6.0
利用準備
APIの利用にはOpenAIのアカウントを作成して、APIキーを発行する必要があります。
https://openai.com/blog/openai-api
APIキーを取得するために、OpenAIの管理画面からAPIキーを作成します。APIキーを作成すると、アクセストークンが発行されます。このアクセストークンを使って、APIにアクセスすることができます。
利用料についてはFree Trialで18ドル分まで利用できます。トライアルで使うには十分すぎますね。

Whisper API の利用料
現状、使えるモデルはひとつで、料金は1分ごとに0.006ドルです。
1時間の音声ファイルで約50円(140/$)です。

APIの使い方
公式ドキュメント https://platform.openai.com/docs/api-reference/chat/create
リクエストパラメータ
ドキュメントのリクエストパラメータは下記です。
modelはwhisper-1を埋め込みで利用します。fileに音声ファイルのパスを指定します。
{
"file": "audio.mp3",
"model": "whisper-1"
}
レスポンスパラメータ
公式のレスポンス例がこちら。
text項目だけ返ってきます。
{
"text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger. This is a place where you can get to do that."
}
APIにリクエスト
上記を踏まえて、HttpClinetでAPIにリクエストするコードを書いてみます。
レスポンス用のクラスを作成します。
public class WhisperResponse
{
[JsonPropertyName("text")]
public string Text { get; set; }
}
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;
public static async Task<string> RequestToWhisperAsync()
{
using var httpClient = new HttpClient();
var url = "https://api.openai.com/v1/audio/transcriptions";
// ここにBearerトークンを入力
var token = "TOKEN";
// ここにファイルのパスを入力
var filePath = "output.wav";
var model = "whisper-1";
var fileStream = File.OpenRead(filePath);
using var formData = new MultipartFormDataContent();
formData.Add(new StreamContent(fileStream));
formData.Add(new StringContent(model));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
// Whisper APIにリクエスト送信
var response = await httpClient.PostAsync(url, formData);
if (response.IsSuccessStatusCode)
{
// レスポンスをJSONとしてパースし、必要な情報を取得
var responseContent = await response.Content.ReadAsStringAsync();
var whisperResponse = JsonSerializer.Deserialize<WhisperResponse>(responseContent);
return whisperResponse == null ? "" : whisperResponse.Text;
}
else
{
return "";
}
}
これで、文字起こしした内容が文字列で取得できるようになります。