un tronc
生成AI

パソコンの音を録音して、無料で文字起こしする方法|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
PowerShellでライブラリを入れ、pip list で入ったことを確かめた画面

入ったかどうかは、python -m pip list の一覧で確かめられます。

numpy が入っていない場合は、同じように python -m pip install numpy で入れてください。

録音と文字起こしのスクリプトは、AIの Claude Code に頼んで書いてもらいました。

手順1 音が出ている出力デバイスを確かめる

録音のスクリプトは、Windowsで既定になっている出力デバイス(スピーカーやヘッドホン)の音を録ります。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回鳴らすと終わります(理由は次の節で書きます)。

メディア プレーヤーで見本の音声を流しながら、PowerShellで録音している画面

再生が終わっても、録音が止まらなかった

95秒を指定したのに、音声の再生が終わったあとも、コマンドが終わりませんでした。

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

録音が終わり、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ではシンボリックリンク(ファイルの別名)を使うには開発者モードが要る、という内容の英語の警告が出ましたが、そのまま動きました。

文字起こしが終わり、done と、かかった時間が表示された画面

終わると、同じ場所に同じ名前の .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導入支援のページもご覧ください。ご相談はお問い合わせフォームからどうぞ。

最後まで読んでくださりありがとうございました!

コメント