英単語の音声ファイル(ample.mp3)から音声に含まれる単語リスト(sample.txt )と個々の単語の音声ファイル(1-man.mp3など)を作成する。
■ファイル構造
📂 プロジェクトフォルダ
│── 📄 mp3_words_note.py # Pythonコード(音声を処理するスクリプト)
│── 🎵 sample.mp3 # 入力ファイル(音声ファイル<複数の単語を含む>)
│── 📄 sample.txt # 出力ファイル(抽出した単語リスト)
│── 📂 sample_音声/ # 出力ディレクトリ(個々に分割した音声ファイルの保存)
│ ├── 🎵 1-man.mp3
│ ├── 🎵 2-people.mp3
│ ├── 🎵 3-life.mp3
│ ├── 🎵 4-child.mp3
│ ├── 🎵 5-person.mp3
PS > tree /F /A
\---プロジェクトフォルダ
| mp3_words_note.py
| mp3_words_note.py
| sample.mp3
| sample.txt
\---sample_音声
1-man.mp3
2-people.mp3
3-life.mp3
4-child.mp3
5-person.mp3
[実行]
プロジェクトフォルダに入り実行
>python mp3_words_note.py⏎
プロジェクトフォルダに入り実行
>python mp3_words_note.py⏎
・出力ファイル(sample.txt)例
1,man
2,people
3,life
4,child
5,person
6,group
7,live
8,name
9,woman
10,member
11,boy
12,family
13,girl
14,unrecognized
15,student
・ 'unrecognized'は認識できない単語を意味する。
・音声認識ができない場合、誤認識は手動で修正する。
[Tips]
PowerShellコマンドでディレクトリ内のファイルを番号順に表示する方法
PS \sample_音声> ls -Name | Sort-Object {[int]($_ -split '-')[0]}
PowerShellコマンドでディレクトリ内のファイルを番号順に表示する方法
PS \sample_音声> ls -Name | Sort-Object {[int]($_ -split '-')[0]}
Sort-Object を使って、ファイル名の左側の数字でソート 。
ポイント
{} の中は ブロック(スクリプトブロック) と呼ぶ。
$_ は パイプラインで流れてきた1つ1つの値(この場合はファイル名)。
-split '-' で ハイフン - で分割。
[0] で 分割した最初の部分(左側の数字)を取得。
[int] で 文字列から整数に変換。
全体の流れ
ls -Name でファイル名のリストを取得。
Sort-Object で、各ファイル名を - で分割。
[0] で左側の数字を取得し、[int] で整数化。
数値順にソート。
[コード例]mp3_words_note.py
注意
コード内の以下の値を適宜変更してください。音声データにより変更する必要があります。
min_silence_len=250,
コード内の以下の値を適宜変更してください。音声データにより変更する必要があります。
min_silence_len=250,
silence_thresh=sound.dBFS - 10.5,
keep_silence=1000
---以下がpythonコード例
import os
import speech_recognition as sr
from pydub import AudioSegment
from pydub.silence import split_on_silence
# 一括でファイル名を定義
mp3_file = "sample.mp3" # 英文のみの音声サンプル
basename = os.path.splitext(mp3_file)[0] # basename="sample"
wav_file = "converted.wav"
txt_file = f"{basename}.txt" #sample.txt"
# MP3ファイルをWAVに変換
sound = AudioSegment.from_mp3(mp3_file)
sound.export(wav_file, format="wav")
# 無音を作成する関数
def generate_silence(duration_sec):
return AudioSegment.silent(duration=duration_sec * 1000)# ミリ秒に変換
# 音声ファイルを無音部分で分割(無音部分で区切る)
def split_audio(file_path):
sound = AudioSegment.from_wav(file_path)
chunks = split_on_silence(
sound,
min_silence_len=250,
silence_thresh=sound.dBFS - 10.5,
keep_silence=1000
)
return chunks
# 音声認識の準備
recognizer = sr.Recognizer()
audio_chunks = split_audio(wav_file)# WAVファイルをチャンクごとに分割
recognized_words = []# 変換したテキスト(単語)を保存するリスト
# 各チャンクをテキストに変換
chunk_files = []# 生成されたチャンクファイルのリスト
# 各チャンクをテキストに変換
for i, chunk in enumerate(audio_chunks):
chunk_filename = f"chunk{i+1}.wav"
chunk.export(chunk_filename, format="wav")
chunk_files.append(chunk_filename)
with sr.AudioFile(chunk_filename) as source:
audio = recognizer.record(source)
# 音声をテキストに変換( 認識結果をリストに追加)
try:
text = recognizer.recognize_google(audio, language="en-US").strip()
recognized_words.append(f"{i+1},{text}")
except sr.UnknownValueError:
recognized_words.append(f"{i+1},unrecognized")
except sr.RequestError as e:
print(f"Googleサービスへのリクエストに失敗しました; {e}")
# TXTファイルに書き込む
with open(txt_file, "w", encoding="utf-8") as txtfile:
for line in recognized_words:
txtfile.write(line + "\n")
print(f"認識結果を {txt_file} に保存しました。")
# TXTファイルから単語リストを取得
word_dict = {}
with open(txt_file, "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split(",")
if len(parts) == 2:
word_dict[int(parts[0])] = parts[1]
# 出力ディレクトリの作成
output_dir = f"{basename}_音声" # 音声ファイルの保存ディレクトリ名
os.makedirs(output_dir, exist_ok=True)
# 各チャンクをMP3に変換して保存
for i, chunk in enumerate(audio_chunks):
word = word_dict.get(i+1, "unrecognized")
mp3_filename = f"{i+1}-{word}.mp3"
output_path = os.path.join(output_dir, mp3_filename) # ディレクトリに保存
chunk.export(output_path, format="mp3") # チャンクをMP3として保存
print(f"{output_path} に保存されました。")
# 一時ファイルの削除(生成されたWAVファイルを削除)
os.remove(wav_file)
for chunk_file in chunk_files:
os.remove(chunk_file)