Python なっトク!

【超便利】音声を文字に変換--コード全文掲載&徹底解説

ライブラリのインストール

たすく

文字を音声にするのは、わりと早くできたのですが、音声を文字にするのは、けっこう大変でした。
でも最終的にうまくできたので、よかったです。
GoogleColabにコピペするコードなので、環境設定不要、Googleアカウントをもってさえいれば、すぐ活用できます!

ライブラリのインストール

このコードは、音声処理と音声認識のためのライブラリをインストールし、ffmpegツールをシステムにインストールするためのものです。
 

# ライブラリのインストール
!pip install pydub speechrecognition
  • !pip install pydub speechrecognition:
    • pydub ライブラリをインストールします。これは音声ファイルの操作を簡単にするためのPythonライブラリです。
    • speechrecognition ライブラリをインストールします。これは音声データをテキストに変換するためのライブラリです。

ffmpegのインストール

# ffmpegのインストール
!apt-get install ffmpeg -y
  • !apt-get install ffmpeg -y:
    • ffmpeg をシステムにインストールします。これは音声や動画の変換や編集に使われる強力なツールです。
    • y オプションは、インストール中のすべての確認プロンプトに自動的に「yes」と答えるためのものです。

使用ライブラリの簡単な説明

  • pydub:
    • 音声ファイルの読み込み、書き込み、変換、編集を行うためのライブラリ。ffmpegavlib との連携で多様な音声形式を扱うことができます。
  • speechrecognition:
    • 音声認識エンジンを使用して音声データをテキストに変換するためのライブラリ。Google Web Speech API、Microsoft Bing Voice Recognition、IBM Speech to Textなど、複数の音声認識サービスと連携します。
  • ffmpeg:
    • 音声および動画の変換、編集、ストリーミングのためのコマンドラインツール。多様なフォーマットのサポートと高い柔軟性が特徴です。
    Googleドライブのマウントコードの目的このコードは、Google Colab環境でGoogleドライブをマウントし、ドライブ内のファイルにアクセスできるようにするためのものです。 コードの説明Googleドライブのマウントfrom google.colab import drive drive.mount('/content/drive')
    • from google.colab import drive:
      • Google Colabのdriveモジュールをインポートします。これは、Google Colab環境からGoogleドライブにアクセスするための特別なモジュールです。
      drive.mount('/content/drive'):
      • Googleドライブを/content/driveディレクトリにマウントします。このコマンドを実行すると、認証プロセスが始まり、ユーザーはGoogleアカウントにログインして権限を付与する必要があります。マウントが成功すると、Googleドライブのファイルやフォルダに対して通常のファイル操作が可能になります。

    ライブラリの簡単な説明
    • google.colab.drive:
      • Google ColabでGoogleドライブをマウントするためのモジュールです。これを使うことで、Googleドライブ内のデータセットやファイルを直接Colabのノートブックから読み書きすることができます。
    実行結果のイメージ
    • 実行すると、ユーザーは認証リンクをクリックし、Googleアカウントにログインして、認証コードをコピーしてColabに貼り付けます。マウントが成功すると、Googleドライブの内容が/content/driveディレクトリ以下に表示されます。
    ファイルのアップロードコードの目的このコードは、Google Colab環境にローカルファイルをアップロードし、アップロードされたファイル名を表示するためのものです。 コードの説明ファイルのアップロードfrom google.colab import files
    • from google.colab import files:
      • Google Colabのfilesモジュールをインポートします。これにより、ローカルファイルのアップロードやダウンロードが可能になります。
    uploaded = files.upload()
    • uploaded = files.upload():
      • ユーザーがローカルファイルをGoogle Colab環境にアップロードするためのダイアログを表示します。アップロードされたファイルは、辞書形式でuploaded変数に保存されます。この辞書のキーはファイル名で、値はファイルのバイナリデータです。
    アップロードされたファイル名の表示for filename in uploaded.keys(): print(f'アップロードされたファイル: {filename}')
    • for filename in uploaded.keys()::
      • アップロードされたファイルのファイル名(辞書のキー)を繰り返し処理します。
      print(f'アップロードされたファイル: {filename}'):
      • 各ファイル名を出力します。アップロードされたすべてのファイルの名前が表示されます。

    ライブラリの簡単な説明
    • google.colab.files:
      • Google Colabでファイルのアップロードやダウンロードを行うためのモジュールです。ローカルファイルをGoogle Colab環境に簡単に取り込むことができます。
    実行結果のイメージ
    • コードを実行すると、ファイルアップロードのダイアログが表示されます。
    • ユーザーがファイルを選択すると、そのファイルがアップロードされ、指定されたディレクトリに保存されます。
    • アップロードが完了すると、ファイル名が表示されます。例えば:アップロードされたファイル: example.txt アップロードされたファイル: data.csv 音声をテキストに変換してその結果をGoogleドライブに保存主なタスクこのコードは、音声ファイルを文字起こしするためのもので、以下の主なタスクを実行します:
      1. アップロードされた音声ファイルをWAV形式に変換します。変換されたWAVファイルを使って音声認識を行い、テキストに変換します。音声ファイルが5分以上の場合、5分ごとに分割してそれぞれ文字起こしを行い、結果を結合します。文字起こし結果をテキストファイルとして保存し、Googleドライブに保存されたファイルのパスを表示します。
      コードの詳細な説明from pydub import AudioSegment import speech_recognition as sr import os from google.colab import files # サポートされている音声フォーマット SUPPORTED_FORMATS = ['.mp3', '.wav', '.flac', '.ogg', '.aiff', '.mp4', '.aac', '.wma', '.amr', '.m4a']
      • pydubライブラリは音声ファイルの操作(読み込み、変換など)を容易にします。speech_recognitionライブラリは音声認識を行うために使用されます。osライブラリは、ファイルパスの操作に使用されます。google.colabからfilesモジュールをインポートして、ファイルのアップロードをサポートします。SUPPORTED_FORMATSリストは、サポートされている音声ファイル形式を定義します。
      # 音声ファイルをWAVファイルに変換 def convert_to_wav(audio_file, wav_file): audio = AudioSegment.from_file(audio_file) audio.export(wav_file, format="wav")
      • convert_to_wav関数は、任意の音声ファイルをWAV形式に変換します。
      # 音声ファイルを文字起こし def transcribe_audio(wav_file, start_ms=0, end_ms=None): recognizer = sr.Recognizer() audio = AudioSegment.from_wav(wav_file) if end_ms is None: end_ms = len(audio) audio_segment = audio[start_ms:end_ms] audio_segment.export("temp_segment.wav", format="wav") with sr.AudioFile("temp_segment.wav") as source: audio_data = recognizer.record(source) try: text = recognizer.recognize_google(audio_data, language="ja-JP") return text except sr.UnknownValueError: return "音声を理解できませんでした。" except sr.RequestError as e: return f"Google Speech Recognitionサービスにアクセスできませんでした; {e}"
      • transcribe_audio関数は、WAVファイルを受け取り、指定された範囲の音声をGoogle Speech Recognition APIを使って文字起こしします。start_msend_msで指定された範囲の音声を抽出し、一時的なWAVファイルに保存します。sr.Recognizersr.AudioFileを使って音声データを読み込み、Googleの音声認識サービスを使ってテキストに変換します。
      # メイン処理 uploaded_file = list(uploaded.keys())[0] # アップロードされたファイルの名前を取得 file_ext = os.path.splitext(uploaded_file)[1].lower() # ファイルの拡張子を取得 file_base = os.path.splitext(uploaded_file)[0] # ファイルのベース名を取得
      • アップロードされたファイルの名前と拡張子を取得し、ベース名(拡張子を除いた部分)を取得します。
      if file_ext in SUPPORTED_FORMATS: if file_ext == '.wav': wav_file = uploaded_file else: wav_file = file_base + ".wav" convert_to_wav(uploaded_file, wav_file) else: raise ValueError(f"サポートされていないファイル形式です: {file_ext}")
      • ファイルの拡張子がサポートされている形式かどうかをチェックします。もし.wav形式でない場合、convert_to_wav関数を使ってWAV形式に変換します。
      # 音声ファイルの長さを取得 audio = AudioSegment.from_wav(wav_file) audio_length_ms = len(audio)
      • 変換されたWAVファイルの長さ(ミリ秒単位)を取得します。
      # 5分以内のデータかどうかをチェック if audio_length_ms <= 5 * 60 * 1000: # 5分以内 full_transcription = transcribe_audio(wav_file) else: segment_length_ms = 5 * 60 * 1000 # 5分ごとに分割(300秒) transcriptions = [] for start_ms in range(0, audio_length_ms, segment_length_ms): end_ms = min(start_ms + segment_length_ms, audio_length_ms) print(f"文字起こし中: {start_ms // 1000}秒 から {end_ms // 1000}秒 まで") text = transcribe_audio(wav_file, start_ms, end_ms) transcriptions.append(text) # すべての文字起こし結果を結合 full_transcription = "\\n".join(transcriptions)
      • 音声ファイルが5分以内であれば、全体を一度に文字起こしします。5分を超える場合、5分ごとに分割して部分的に文字起こしを行い、結果を結合します。
      # 結果を表示 print(full_transcription) # 結果をテキストファイルに保存 output_file_path = f"/content/drive/My Drive/{file_base}.txt" with open(output_file_path, "w") as f: f.write(full_transcription) # Google Driveに保存されたテキストファイルのパスを表示 print(f"文字起こし結果が保存されました: {output_file_path}")
      • 最終的な文字起こし結果を表示し、テキストファイルとして保存します。Googleドライブに保存されたファイルのパスを表示します。
      使用されているライブラリの簡単な説明
      • pydub: 音声ファイルの操作(読み込み、変換、分割など)を行うためのライブラリです。speech_recognition: 音声認識を行うためのライブラリで、Google Speech Recognition APIなどを使用して音声をテキストに変換します。os: ファイルパスの操作やシステムコマンドの実行に使用される標準ライブラリです。google.colab.files: Google Colab環境でファイルのアップロードやダウンロードをサポートするモジュールです。

コード

# ライブラリのインストール
!pip install pydub speechrecognition

# ffmpegのインストール
!apt-get install ffmpeg -y

# Googledriveにマウントする
from google.colab import drive
drive.mount('/content/drive')

# 音声ファイルのアップロード
from google.colab import files
uploaded = files.upload()

for filename in uploaded.keys():
    print(f'アップロードされたファイル: {filename}')

from pydub import AudioSegment
import speech_recognition as sr
import os
from google.colab import files

# サポートされている音声フォーマット
SUPPORTED_FORMATS = ['.mp3', '.wav', '.flac', '.ogg', '.aiff', '.mp4', '.aac', '.wma', '.amr', '.m4a']

# 音声ファイルをWAVファイルに変換
def convert_to_wav(audio_file, wav_file):
    audio = AudioSegment.from_file(audio_file)
    audio.export(wav_file, format="wav")

# 音声ファイルを文字起こし
def transcribe_audio(wav_file, start_ms=0, end_ms=None):
    recognizer = sr.Recognizer()
    audio = AudioSegment.from_wav(wav_file)
    if end_ms is None:
        end_ms = len(audio)
    audio_segment = audio[start_ms:end_ms]
    audio_segment.export("temp_segment.wav", format="wav")

    with sr.AudioFile("temp_segment.wav") as source:
        audio_data = recognizer.record(source)
    try:
        text = recognizer.recognize_google(audio_data, language="ja-JP")
        return text
    except sr.UnknownValueError:
        return "音声を理解できませんでした。"
    except sr.RequestError as e:
        return f"Google Speech Recognitionサービスにアクセスできませんでした; {e}"

# メイン処理
uploaded_file = list(uploaded.keys())[0]  # アップロードされたファイルの名前を取得
file_ext = os.path.splitext(uploaded_file)[1].lower()  # ファイルの拡張子を取得
file_base = os.path.splitext(uploaded_file)[0]  # ファイルのベース名を取得

if file_ext in SUPPORTED_FORMATS:
    if file_ext == '.wav':
        wav_file = uploaded_file
    else:
        wav_file = file_base + ".wav"
        convert_to_wav(uploaded_file, wav_file)
else:
    raise ValueError(f"サポートされていないファイル形式です: {file_ext}")

# 音声ファイルの長さを取得
audio = AudioSegment.from_wav(wav_file)
audio_length_ms = len(audio)

# 5分以内のデータかどうかをチェック
if audio_length_ms <= 5 * 60 * 1000:  # 5分以内
    full_transcription = transcribe_audio(wav_file)
else:
    segment_length_ms = 5 * 60 * 1000  # 5分ごとに分割(300秒)
    transcriptions = []

    for start_ms in range(0, audio_length_ms, segment_length_ms):
        end_ms = min(start_ms + segment_length_ms, audio_length_ms)
        print(f"文字起こし中: {start_ms // 1000}秒 から {end_ms // 1000}秒 まで")
        text = transcribe_audio(wav_file, start_ms, end_ms)
        transcriptions.append(text)

    # すべての文字起こし結果を結合
    full_transcription = "\n".join(transcriptions)

# 結果を表示
print(full_transcription)

# 結果をテキストファイルに保存
output_file_path = f"/content/drive/My Drive/{file_base}.txt"
with open(output_file_path, "w") as f:
    f.write(full_transcription)

# Google Driveに保存されたテキストファイルのパスを表示
  • この記事を書いた人
  • 最新記事

花丸たすく

▸高度情報処理技術者(ITストラテジスト)
▸データアナリスト、ラーニング・アドバイザー
▸「学び直し」に挑戦する社会人を応援
▸落ちこぼれ→京大→教育関連企業→現在
▸「学び直し」から得た「気づき」こそ成長の源泉、現実を変える力
▸武器になる「学び直し」のキホン
▸資格取得・大学受験のエッセンス
▸「勉強マインド」作りへ、自分のノウハウを全部公開

-Python, なっトク!
-