【C#】Whisper API(音声文字起こし)の使い方

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

リクエストパラメータ

ドキュメントのリクエストパラメータは下記です。

modelwhisper-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 "";
    }
}

これで、文字起こしした内容が文字列で取得できるようになります。

Leave a Reply

Your email address will not be published. Required fields are marked *