はじめに
PythonでWhisperを使用する方法は簡単に見つかったが、rails上でwhisperを使用する方法があまり出てこなかった。
今回は、試した中で成功したプログラムを紹介する。
状況
・ActiveStorageを使用して、S3上にmp3ファイルを保存している。
・mp3ファイルは、Chat
モデルのmp3_file
というカラムに格納されている。
・mp3ファイルをWhisperを使って文字起こししたい。
準備
rails上でWhisperを使うには、"ruby-openai"
というgemをインストールする必要がある。
また、S3にアクセスするには、"aws-sdk-s3"
というgemも必要である。
Gemfileに、
gem "ruby-openai"
gem "aws-sdk-s3"
を追記して、bundle install
しておきましょう。
S3からファイルを取り出す
まずは、S3から音声ファイルを取り出す。
s3_client = Aws::S3::Client.new(region: ENV["REGION"], access_key_id: ENV["ACCESS_KEY_ID"], secret_access_key: ENV["SECRET_ACCESS_KEY"])
file = s3_client.get_object(bucket: ENV["BUCKET"], key: @chat.mp3_file.key).body.read
S3からのファイル取り出しは、
-
region
、access_key_id
、secret_access_key
を与えて、クライアントを立てる。 -
bucket
、key
を与えて、ファイルを取得する。
という流れで行います。
tempfileに一時保存する
次に、取り出したファイルをtempfileに書き込みます。
tempfileに一時保存しておくことで、Whisperで扱えるようになるようです。
まず、tempfileに格納する関数を用意しておきます。
def create_tempfile(file)
tempfile = Tempfile.open(["temp", ".mp3"])
tempfile.binmode
tempfile.write(file)
tempfile.rewind
return tempfile
end
-
Tempfile
のOpen関数で、mp3
形式のtempfileを作成します。 -
binmode
でバイナリーモードにします。 -
write(file)
で書き込みます。 - 変更を加えた後は
rewind
する必要があるみたいです。(iosを入力の先頭に配置する。) - 最後に、
tempfile
を返します。
create_template
関数にS3から取ってきたfile
を与えて、tempfileに書き込みましょう。
tempfile = create_tempfile(file)
Whisperを使って文字起こし
それでは、Whisperを使ってみましょう。
まずは、文字起こしする関数を作成します。
def transcribe(tempfile)
client = OpenAI::Client.new(access_token: ENV["OPENAI_API_KEY"])
response = client.transcribe(
parameters: {
model: "whisper-1",
file: File.open(tempfile, 'rb'),
})
return response.dig("text")
end
- APIキーを使ってクライアントを立てる。
-
transcribe
関数を使って文字起こしします。 -
tempfile
を与えることで文字起こしすることができます。 -
response
から文字起こしの結果を取り出し、return
します(response.dig("text")
)。
この関数にcreate_tempfile
で返したtempfile
を渡し、文字起こししましょう。
transcribed_text = transcribe(tempfile)
おわりに
今回は、rails上でWhisperを使ってみました。
tempfile
を使用するということろがコツだったようです。
参考になったら「いいね」と「ストック」お願いします!