見出し画像

大容量音声ファイルも安心!Whisper APIで25MB以上の音声ファイルでも文字起こしできるように対応しました。

Whisper APIは、音声ファイルをテキストデータに変換する、非常に便利なAPIです。しかし、その利便性にも関わらず、25MB以上の音声ファイルには対応していないという課題がありました。今回の記事では、これを解決し、どんなサイズの音声ファイルでも文字起こしができるようになった方法を紹介していきます。

下記にコードを載せてあります。詳しくはこちらをご確認ください!

仕組みについて

まず、25MB以下の音声ファイルに関しては、通常通りWhisper APIを使用して文字起こしを行います。これにより、小さな音声ファイルは引き続き簡単に扱えるようになっています。

ここで問題となるのが、25MBを超える音声ファイルです。その対応策として、次の2つの方法が提案されました。

  1. 音声ファイルを圧縮してサイズを縮小する

  2. 音声ファイルを複数の小さなファイルに分割する

まず、音声ファイルを圧縮することで、25MB以下に縮小することができる場合があります。そして、それでも25MB以下にならない場合は、音声ファイルを分割し、それぞれ個別に文字起こしを行います。

分割された音声ファイルの文字起こし処理が完了したら、最後にそれらのテキストデータを連結します。この方法により、どんな大きさの音声ファイルでも、最終的には適切なサイズに分割され、文字起こしが可能になります。

このようにして、Whisper APIの利点を最大限に活用し、25MBを超える音声ファイルの文字起こしにも対応することができるようになりました。今後は、これらの方法を活用して、さまざまな音声データを簡単にテキスト化し、役立てていくことが期待されます。


後日談

ここまでGPT-4にほとんど書いてもらいました。コードも8割はGPT-4です。実際にかかった時間は記事化も含めて2時間半といったところでしょうか。

せっかくなのでGPT-4を使ってどのようにWhisper 25MB以上でも対応可能なコードを作成したのかについても共有していこうと思います。

※Voice-inと言う音声入力ツールを使っているため、句読点が抜けていたり、誤字が多くなっています。可読性は低くなっていますが、GPT-4はちゃんと意図を汲み取ってくれています。


コードを書いてもらう

音声ファイルを元に文字起こしをしたいと思っていますただ音声ファイルの容量が25 MB を超えると書き起こしすることができないという状況ですこれを解決するために圧縮したり音声ファイルを分割したりする方法があると思うんですが具体的にどのようにやると良いでしょうか教えてください

音声ファイルの容量が25 MBを超える場合、圧縮や分割する方法を試すことができます。以下に、それぞれの方法について説明します。

**圧縮**

音声ファイルの圧縮には、専用のソフトウェアやオンラインツールを利用できます。以下にいくつかの代表的なツールを紹介します。

1. [Audacity](https://www.audacityteam.org/)
2. [Audio Compressor](https://audio-compressor.com/ja/)

Audacityは無料で、様々なフォーマットの音声ファイルを編集・変換できます。変換・圧縮方法は以下の通りです。

1. Audacityをインストールして起動します。
2. 「ファイル」メニューから「開く」を選択し、音声ファイルをインポートします。
3. 「ファイル」メニューから「書き出す」を選択して圧縮したフォーマット(mp3など)を指定し、出力先を指定して保存します。

**分割**

音声ファイルを複数に分割することもできます。以下にいくつかの代表的なツールを紹介します。

1. Audacity
2. [mp3DirectCut](https://mpesch3.de1.cc/mp3dc.html)

Audacityで音声ファイルを分割する方法は以下の通りです。

1. Audacityをインストールして起動します。
2. 「ファイル」メニューから「開く」を選択し、音声ファイルをインポートします。
3. 分割したい部分で波形をクリックし、「編集」メニューから「クリップ境界」を選択し、「分割」をクリックします。
4. 「ファイル」メニューから「書き出す」を選択して、分割された部分をそれぞれファイルとして保存します。

これらの方法を試して、25 MB以下のサイズに分割や圧縮を行ってください。適切なサイズに変換できれば、文字起こし作業を問題なく行えるでしょう。

GPT-4

上記のような音声ファイルの圧縮や分割を Python コードで書くことはできますかステップバイステップで教えてください

もちろん、Pythonコードを使って音声ファイルの圧縮や分割を行うことができます。`pydub`というライブラリを使って、音声ファイルを分割および圧縮を行う方法を説明します。

**前提条件**:
`pydub`と`ffmpeg`をインストールしておく必要があります。以下のコマンドでインストールできます。

```bash
pip install pydub
```

また、`ffmpeg`をこちらのリンクからダウンロードし、インストールしてください。
https://www.ffmpeg.org/download.html

**分割**:

以下のPythonコードで、音声ファイルを指定した時間間隔で分割することができます。

```python
from pydub import AudioSegment
from os import path

def split_audio(file_path, interval_ms, output_folder):
audio = AudioSegment.from_file(file_path)
file_name, ext = path.splitext(path.basename(file_path))

n_splits = len(audio) // interval_ms
for i in range(n_splits + 1):
start = i * interval_ms
end = (i + 1) * interval_ms
split = audio[start:end]
split.export(f"{output_folder}/{file_name}_{i}{ext}", format="wav")

file_path = "example.wav"
output_folder = "./output"

# 分割間隔をミリ秒単位で指定
interval_ms = 30_000 # 30秒 = 30000ミリ秒

split_audio(file_path, interval_ms, output_folder)
```

**圧縮**:

以下のPythonコードで、音声ファイルを指定したフォーマットに圧縮することができます。この例では、簡単のためにwavファイルをmp3形式に変換していますが、他の形式にも対応できます。

```python
from pydub import AudioSegment

def compress_audio(file_path, output_path, target_format):
audio = AudioSegment.from_file(file_path)

audio.export(output_path, format=target_format)

file_path = "example.wav"
output_path = "example_compressed.mp3"

compress_audio(file_path, output_path, "mp3")
```

これらのスクリプトを使って、音声ファイルを分割および圧縮することができます。

GPT-4

圧縮するとどれくらいデータサイズは小さくなりますか例えば1 GB の wav ファイルだとどれくらいのサイズになるのでしょうか

音声ファイルの圧縮率は、圧縮後のフォーマットやビットレート設定によって異なります。一般的に、MP3フォーマットに圧縮することで、データサイズをかなり削減できることが一般的です。

例えば、1 GBのWAVファイルを圧縮する場合、以下のような結果が得られます。

- MP3フォーマットで128 kbpsの設定: WAVファイルのサイズが約1/10になることが一般的です。この場合、1 GBのWAVファイルが約100 MBのMP3ファイルに圧縮されます。

実際の結果は、音声の内容や、圧縮設定によって異なるため、これらの数値はあくまで目安です。特定のファイルに対して実際に圧縮を行い、適切な設定を試すことをお勧めします。

GPT-4

音声ファイルのデータサイズを Python で確認する方法はありますか

Pythonで音声ファイルのデータサイズを確認する方法は、`os.path.getsize()`関数を使います。この関数は、指定されたファイルのデータサイズをバイト単位で返します。

以下に、音声ファイルのデータサイズを確認するPythonスクリプトの例を示します。

```python
import os

def get_file_size(file_path):
size = os.path.getsize(file_path)
return size

def format_size(size):
# バイトを適切な単位に変換
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if size < 1024.0:
return f"{size:.2f} {unit}"
size /= 1024.0

file_path = "example.mp3"
size_bytes = get_file_size(file_path)
formatted_size = format_size(size_bytes)

print(f"音声ファイルのデータサイズは {formatted_size} です。")
```

このスクリプトは、音声ファイルのデータサイズを取得し、適切な単位(B, KB, MB, GB, TB)に変換して表示します。

今から Google コラボラトリーで音声ファイルを必要に応じて圧縮もしくは分割しその音声ファイルを文字起こしするスクリプトを書いていこうと思っています文字起こしにはウィスパー API というものを利用しようと思っています。できるだけ精度を高めるために圧縮や分割が必要でなければ行えませんまた圧縮の方が優先度が高くそれでも難しいようであれば分割をするという方針でいきたいと思っていますAPI の制約として音声ファイルのデータサイズが25 MB を超えると処理することができませんそのためアップロードされた音声ファイルは25 MB 以下であればそのまま API を利用25 MB 以上であれば必要に応じて圧縮を行いまたそのデータサイズを確認してまだ25 MB を超えているようであれば分割を行って25 MB 以下に全てのファイルは治るように処理をしていきたいと思ってます上記を踏まえてGoogle コラボラトリー上で動く Python のスクリプトをステップバイステップでわかりやすく解説をしながら返してください

Google Colab上で音声ファイルの圧縮および分割を行い、その後にWhisper APIを使用して文字起こしを行うPythonスクリプトをステップバイステップで解説します。

**ステップ1**: 必要なライブラリをインストール

Google Colabの環境に`pydub`と`requests`ライブラリをインストールします。以下のコマンドを実行します。

```python
!pip install pydub requests
```

**ステップ2**: 関数の作成

圧縮、分割、サイズ確認、Whisper APIを使用した文字起こしの各機能を実現する関数を作成します。

**ステップ2.1**: 圧縮関数(compress_audio)

前述の方法で圧縮を実行する関数を作成します。

```python
def compress_audio(file_path, output_path, target_format="mp3", bitrate="128k"):
audio = AudioSegment.from_file(file_path)
audio.export(output_path, format=target_format, bitrate=bitrate)
```

**ステップ2.2**: 分割関数(split_audio)

前述の方法で分割を実行する関数を作成します。

```python
def split_audio(file_path, interval_ms, output_folder):
audio = AudioSegment.from_file(file_path)
file_name, ext = path.splitext(path.basename(file_path))

n_splits = len(audio) // interval_ms
for i in range(n_splits + 1):
start = i * interval_ms
end = (i + 1) * interval_ms
split = audio[start:end]
split.export(f"{output_folder}/{file_name}_{i}{ext}", format="wav")
```

**ステップ2.3**: サイズ確認関数(get_file_size)

前述の方法でファイルサイズを取得する関数を作成します。

```python
def get_file_size(file_path):
size = os.path.getsize(file_path)
return size
```

**ステップ2.4**: Whisper APIを使用した文字起こし関数(transcribe_audio)

[Whisper ASR API 公式ドキュメント](https://docs.openai.com/whisper/asr/overview)を参照して、APIリクエストを送信し、結果を処理する関数を作成します。ここでは、単純化のために、APIキーを環境変数から直接読み込んでいます(実際には安全な方法でキーを保存してください)。

```python
import requests

API_KEY = os.environ.get("OPENAI_API_KEY") # 環境変数からAPIキーを取得

def transcribe_audio(file_path):
url = "https://api.openai.com/v1/whisper/asr"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "audio/mpeg",
}

with open(file_path, "rb") as file:
response = requests.post(url, data=file, headers=headers)

if response.status_code == 200:
result = response.json()
transcript = result["utterances"][0]["transcript"]
return transcript
else:
print(f"エラーが発生しました: {response.status_code}, {response.text}")
return None
```

**ステップ3**: 音声ファイル処理コード

音声ファイルを読み込み、必要に応じて圧縮と分割を実行し、文字起こしを行うコードを記述します。

```python
input_file = "example.wav"
compressed_file = "compressed.mp3"
output_folder = "output"

# 圧縮優先
file_size = get_file_size(input_file)
if file_size > 25_000_000:
compress_audio(input_file, compressed_file)
file_size = get_file_size(compressed_file)

# 圧縮後も25 MBを超えていれば分割処理
if file_size > 25_000_000:
interval_ms = 30_000 # 30秒 = 30000ミリ秒
split_audio(compressed_file, interval_ms, output_folder)

files_to_process = [f"{output_folder}/{path.splitext(path.basename(compressed_file))[0]}_{i}.mp3" for i in range(len(AudioSegment.from_file(compressed_file)) // interval_ms + 1)]
else:
files_to_process = [compressed_file]

# 文字起こし
transcripts = []
for file in files_to_process:
result = transcribe_audio(file)
if result:
transcripts.append(result)

# 全ての文字起こし結果を連結
final_transcript = " ".join(transcripts)
print(final_transcript)

GPT-4

あ、Whisper APIは今年の3月に公開されたからモデルは学習していないのだった。。と言うことで公式ページからその部分だけ手で修正する。


すみません、whisper apiはpythonのライブラリでサポートしており、下記のように書けるようです。こちらの形式を採用したいです。 def transcribe_audio(file_path): file = open(f"{file_path}", "rb") transcription = openai.Audio.transcribe("whisper-1", file) return transcription 上記のコードはtextフィールドを考慮していないので修正してください

`openai`ライブラリを使ってWhisper APIにリクエストを送り、応答から`text`フィールドを取得するように、`transcribe_audio`関数を修正しました。

まず、`openai`ライブラリをインストールしてください。

```python
!pip install openai
```

そして、下記のように`transcribe_audio`関数を修正します。

```python
import openai

def transcribe_audio(file_path):
file = open(f"{file_path}", "rb")
transcription = openai.Audio.transcribe("whisper-1", file)
transcript = transcription["text"]
return transcript
```

これで、`transcribe_audio`関数は`openai`ライブラリを使ってWhisper APIにリクエストを送り、応答の`text`フィールドを取得して返します。他のコード部分に変更はありません。

GPT-4


上記のコードを踏まえて、文字起こしされた出力結果をtxtファイルで書き出しをしてください。また改行があった方が読みやすいので、改行がもし生データに存在しているのであればそれは残しておいてください。

以下のPythonスクリプトは、前述のコードを基に、文字起こしされた出力結果をテキストファイルに書き出す機能が追加されています。改行が生データに存在する場合、それを残しています。

```python
# ・・・(前述のコードと同じ、文字起こしまでの処理)・・・

# 文字起こし結果をテキストファイルに書き出し
output_file = "transcript.txt"
with open(output_file, "w", encoding="utf-8") as file:
for transcript_line in transcripts:
if transcript_line:
# 波形の分割時に境界で改行されることが一般的なため、元の文章の改行を維持します。
file.write(transcript_line.strip() + "\n")

print(f"文字起こし結果が {output_file} に書き出されました。")
```

このスクリプトを実行すると、`transcript.txt`という名前のテキストファイルに文字起こし結果が書き出されます。改行が元のデータに存在する場合、それが維持されています。

GPT-4

apiからのresponseタイプは下記のようになっているようです。 `{ "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. .... }` 先ほど教えてもらったコードを書いたところ次のようなエラーが出てしまいました。 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) /usr/local/lib/python3.9/dist-packages/openai/openai_object.py in __getattr__(self, k) 58 try: ---> 59 return self[k] 60 except KeyError as err: KeyError: 'strip' During handling of the above exception, another exception occurred: AttributeError Traceback (most recent call last) 1 frames /usr/local/lib/python3.9/dist-packages/openai/openai_object.py in __getattr__(self, k) 59 return self[k] 60 except KeyError as err: ---> 61 raise AttributeError(*err.args) 62 63 def __delattr__(self, k): AttributeError: strip おそらくtextフィールドから取り出さないと、エラーが出てしまうのかなと思っています。ここまでを踏まえてコードを修正してください

おっしゃる通り、APIからの応答を処理する際に、正しいフィールド名(`text`)を使用する必要があります。`transcribe_audio`関数内で、結果を取得する部分を修正してください。

```python
def transcribe_audio(file_path):
url = "https://api.openai.com/v1/whisper/asr"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "audio/mpeg",
}

with open(file_path, "rb") as file:
response = requests.post(url, data=file, headers=headers)

if response.status_code == 200:
result = response.json()
transcript = result["text"] # ここを修正。"text"フィールドを取得
return transcript
else:
print(f"エラーが発生しました: {response.status_code}, {response.text}")
return None
```

この修正により、API応答から正しいフィールド(`text`)を取得できるようになります。後続の処理でエラーが発生しないはずです。もし、改行がフィールドに含まれている場合でも、上述のコードで改行を維持します。

GPT-4


記事を書いてもらう

今から note というサービスに記事を書いていこうと思います。考えている内容について話していくので、それをもとに記事を書いていってもらいたいです。良いでしょうか?

もちろん大丈夫です!お話しいただいた内容を基に、わかりやすく論理的な記事を書かせていただきます。それでは、どんな内容についてお話しいただけるでしょうか?具体的な情報をお聞かせいただけると、より良い記事に仕上げることができるかと思います。どうぞお気軽にお話しください。

GPT-4

今回は文字起こしAPI Whisperの音声ファイルのサイズが25MBを超えてしまうと対応できないという課題に着目した記事になりますこの記事では25 MB 以上の音声ファイルでも文字起こしをできるように対応された行動を紹介していきます対応した内容としては大きくは25 MB以下であれば通常通りウィスパーで対応25 MB 以上であれば音声ファイルを圧縮またそれでも25 MB 以下に治らなければ音声ファイルを分割して開く音声ファイルことに文字起こしを行って最後に文字列を連結するというような手法をとっていますこれによってどれだけ大きな音声ファイルであっても最終的に分割されて一つ一つは文字起こして切るようなサイズになっていくので25 MB 超えてしまっても問題なく文字起こしをすることができます

**タイトル:大容量音声ファイルも安心!Whisper APIで文字起こしを最適化しよう**

Whisper APIは、音声ファイルをテキストデータに変換する、非常に便利なAPIです。しかし、その利便性にも関わらず、25MB以上の音声ファイルには対応していないという課題がありました。今回の記事では、これを解決し、どんなサイズの音声ファイルでも文字起こしができるようになった方法を紹介していきます。

**見出し1:25MB以下なら通常通りWhisperで対応**

まず、25MB以下の音声ファイルに関しては、通常通りWhisper APIを使用して文字起こしを行います。これにより、小さな音声ファイルは引き続き簡単に扱えるようになっています。

**見出し2:25MB以上の場合は音声ファイルを圧縮または分割**

ここで問題となるのが、25MBを超える音声ファイルです。その対応策として、次の2つの方法が提案されました。

1. 音声ファイルを圧縮してサイズを縮小する
2. 音声ファイルを複数の小さなファイルに分割する

まず、音声ファイルを圧縮することで、25MB以下に縮小することができる場合があります。そして、それでも25MB以下にならない場合は、音声ファイルを分割し、それぞれ個別に文字起こしを行います。

**見出し3:最後に文字データを結合**

分割された音声ファイルの文字起こし処理が完了したら、最後にそれらのテキストデータを連結します。この方法により、どんな大きさの音声ファイルでも、最終的には適切なサイズに分割され、文字起こしが可能になります。

このようにして、Whisper APIの利点を最大限に活用し、25MBを超える音声ファイルの文字起こしにも対応することができるようになりました。今後は、これらの方法を活用して、さまざまな音声データを簡単にテキスト化し、役立てていくことが期待されます。

GPT-4

この記事が気に入ったらサポートをしてみませんか?