パソコンの音を録音して、無料で文字起こしする方法|Windows

こんにちは!アントロンのNaokoです。
オンラインの打ち合わせや勉強会の音声を、あとから文字で見返したいと思ったことはありませんか?
自分が参加した打ち合わせや、録音の許可をもらった勉強会の音声なら、パソコンで流れている音をそのまま録音できます。私はWindowsで、スピーカーに出ている音を録音し、無料のソフトで文字にしています。
この記事では、その手順を紹介します。説明には、架空の勉強会の音声(約83秒)を見本に使い、この記事のために録音から文字起こしまで実際に通しました。
先に結論です。
- パソコンで流れている音は、そのパソコンだけで録音して、無料で文字にできる
- Windowsなら、スピーカーに出ている音を、短いPythonのスクリプト(処理の手順を書いたファイル)で録音できる
- 文字起こしは、無料の faster-whisper を使って自分のパソコンでできる
- 約90分の音声の文字起こしに143.5分かかった。聞き違いがあるので、名前などは元の音声で確かめる
録音してよいかを、先に確かめる
録音してよいかは、主催者の規約や許可によります。「録画・録音はご遠慮ください」と書かれている場では使いません。分からなければ、先に主催者に確かめてください。打ち合わせなら、相手に録音してよいかを聞いてから始めます。
録音したものは、自分で見返すためだけに使い、人に配りません。
使ったもの
どれも無料で使えます。
- Python 3.13(私のパソコンには入っていました。入っていなければ、Pythonの公式サイト python.org から Windows 用のインストーラーを入れます)
- faster-whisper(音声を文字にするライブラリ)
- PyAudioWPatch(Windowsで、スピーカーに出ている音を録音するためのライブラリ)
- numpy(録音した音の変換に使う)
パソコンはWindowsで、GPUなし、CPUは8コアです。
PowerShell(Windowsでコマンドを入力する画面)で次のコマンドを実行して、ライブラリを入れました。
python -m pip install faster-whisper pyaudiowpatch
入ったかどうかは、python -m pip list の一覧で確かめられます。
numpy が入っていない場合は、同じように python -m pip install numpy で入れてください。
録音と文字起こしのスクリプトは、AIの Claude Code に頼んで書いてもらいました。
手順1 音が出ている出力デバイスを確かめる
録音のスクリプトは、Windowsで既定になっている出力デバイス(スピーカーやヘッドホン)の音を録ります。Windowsのサウンド設定で、いま音が出ている出力デバイスを確かめておきます。

手順2 音を流しながら録音する
録音には、WASAPIのループバック(スピーカーに出ている音を、そのまま録る仕組み)を使いました。次の内容を loopback-record.py という名前で保存します。
"""PC で鳴っている音(既定のスピーカー)をそのまま録って WAV にする。
使い方: python loopback-record.py <出力.wav> <秒数>
- Windows の WASAPI ループバックで録る(PyAudioWPatch)
- 16kHz・モノラルに落として保存する(文字起こし用。1時間で約115MB)
"""
import sys, wave, time
import numpy as np
import pyaudiowpatch as pa
out, seconds = sys.argv[1], float(sys.argv[2])
p = pa.PyAudio()
wasapi = p.get_host_api_info_by_type(pa.paWASAPI)
spk = p.get_device_info_by_index(wasapi["defaultOutputDevice"])
dev = next(d for d in p.get_loopback_device_info_generator() if d["name"].startswith(spk["name"]))
rate, ch = int(dev["defaultSampleRate"]), dev["maxInputChannels"]
step = rate // 16000
w = wave.open(out, "wb")
w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000)
stream = p.open(format=pa.paInt16, channels=ch, rate=rate, input=True,
input_device_index=dev["index"], frames_per_buffer=rate // 10)
end = time.time() + seconds
peak = 0
while time.time() < end:
data = np.frombuffer(stream.read(rate // 10, exception_on_overflow=False), dtype=np.int16)
mono = data.reshape(-1, ch).mean(axis=1)
mono = mono[: len(mono) // step * step].reshape(-1, step).mean(axis=1).astype(np.int16)
peak = max(peak, int(np.abs(mono).max()) if len(mono) else 0)
w.writeframes(mono.tobytes())
stream.stop_stream(); stream.close(); p.terminate(); w.close()
print("saved", out, "peak", peak, flush=True)既定の出力デバイスを調べて、それに対応するループバックの録音デバイスを選んでいます。録った音は、文字起こし用に16kHz・モノラルに変換して、WAVファイルに保存します。1時間で約115MBです。
使うときは、保存するファイル名と、録音する秒数を渡します。見本では、約83秒の音声に対して95秒を指定しました。
python loopback-record.py 録音_勉強会.wav 95コマンドを実行してから、録りたい音声を再生します。見本では、Windowsの「メディア プレーヤー」で音声ファイルを流しました。
再生が終わってもコマンドが終わらないときは、通知音などの短い音を1回鳴らすと終わります(理由は次の節で書きます)。

再生が終わっても、録音が止まらなかった
95秒を指定したのに、音声の再生が終わったあとも、コマンドが終わりませんでした。
「音が鳴っていない間は、WASAPIのループバックからデータが届かず、スクリプトが待ち続けているのでは」と考えました。そうなら、何か音を1回鳴らせばすぐ終わるはずです。Windowsの通知音を1回鳴らしたところ、1秒ほどで終わり、「saved」と表示されました。

できたファイルは約82.8秒で、見本の音声とほぼ同じ長さでした。コマンドを実行してから再生を始めるまでの約5秒は、ファイルに入っていませんでした。
分かったことは2つです。
- 音が鳴っていない間は、録音されない。録音の時刻と、元の音声の時刻がずれることがある
- 指定した秒数より先に音が止まると、スクリプトが終わらない。何か短い音を鳴らすと終わる
約90分の録音では、ほかに次のことが分かりました。
- パソコンの音量を31%から10%に下げても、録音された音の大きさは変わりませんでした
- ミュートにすると、無音で録音されます
- ファイルの大きさは174MBでした
手順3 文字起こしする
文字起こしのスクリプトは、faster-whisper のモデル「medium」(文字起こしに使う学習済みのデータ)をCPUで動かします。言語は日本語を指定しています。次の内容を transcribe.py という名前で保存します。
"""動画・音声を faster-whisper で文字にして、同じ場所に .md で置く。
使い方: python transcribe.py <ファイル> [<ファイル> ...] [--model medium]
- 出力は <ファイル名>.md(すでにあれば飛ばす)。1行 = 1区切り、頭に [時:分:秒]
- CPU で動かす(int8)。モデルは初回だけ Hugging Face から落ちてくる
"""
import sys, os, time
from faster_whisper import WhisperModel
args = sys.argv[1:]
model_name = "medium"
if "--model" in args:
i = args.index("--model")
model_name = args[i + 1]
del args[i:i + 2]
model = WhisperModel(model_name, device="cpu", compute_type="int8")
def hms(t):
t = int(t)
return f"{t // 3600}:{t % 3600 // 60:02d}:{t % 60:02d}"
for path in args:
out = os.path.splitext(path)[0] + ".md"
if os.path.exists(out):
print("skip", out, flush=True)
continue
start = time.time()
segments, info = model.transcribe(path, language="ja", vad_filter=True, beam_size=5)
lines = [f"# {os.path.basename(os.path.splitext(path)[0])}(文字起こし)", "",
f"- 元:{os.path.basename(path)}({hms(info.duration)})",
f"- faster-whisper {model_name} で自動で文字にしたもの。聞き違い・固有名詞の誤りがありうる", ""]
for s in segments:
lines.append(f"[{hms(s.start)}] {s.text.strip()}")
tmp = out + ".part"
with open(tmp, "w", encoding="utf-8") as f:
f.write("\n".join(lines) + "\n")
os.replace(tmp, out)
print("done", out, f"{(time.time() - start) / 60:.1f}min", flush=True)使うときは、録音したファイルを渡します。
python transcribe.py 録音_勉強会.wav初回だけ、モデル(約1.5GB)がダウンロードされます。保存先は C:\Users\(ユーザー名)\.cache\huggingface\ です。Windowsではシンボリックリンク(ファイルの別名)を使うには開発者モードが要る、という内容の英語の警告が出ましたが、そのまま動きました。

終わると、同じ場所に同じ名前の .md ファイル(この例では 録音_勉強会.md)ができます。1行が1区切りで、行の頭に [0:00:00] の形で時刻が付きます。

かかった時間は次のとおりです。
- 約90分の音声(90.655分):143.5分。2,340行になりました
- 見本の録音(約82.8秒):2.8分
目安は、音声の長さの約1.6〜2倍です。90分の音声なら、録音と文字起こしを合わせて4時間ほどみておきます。
見本の音声で、元の原稿と比べた
見本は、架空の勉強会「みどり町商店会 ホームページ勉強会 第3回」です。原稿を書き、Windowsの読み上げ音声で約83秒の音声にしました。この音声を録音して文字起こしし、元の原稿と並べました。
違っていたのは次の所です。
原稿 | 文字起こし |
|---|---|
みどり町商店会 | 緑町商店会 |
お知らせを載せる | お知らせを乗せる |
写っていないかを | 映っていない顔 |
いちばん/ひとつ/お客さま | 一番/一つ/お客様 |
句読点(、。) | 入らず、区切りは空白 |
「24店舗のうち17店舗」「最後の10分」などの数字は、原稿どおりでした。
今回の見本では、地名の表記が変わり、「写っていないかを」は意味の違う言葉になりました。人の名前や会社名、サービス名を使うときは、元の音声で確かめてください。
録音に入らないもの
録音できるのは、パソコンから出ている音だけです。
- 画面共有の資料
- チャット
これらは文字起こしにも残りません。資料の内容が必要なら、別に控えておきます。
まずは短い音声で試してみてください
まずは1〜2分の音声で、録音から文字起こしまで通してみてください。できたファイルを開いて、時刻と文字が並んでいれば成功です。
AIを仕事に取り入れたい方は、AI導入支援のページもご覧ください。ご相談はお問い合わせフォームからどうぞ。
最後まで読んでくださりありがとうございました!




コメント