見出し画像

3歳娘と一緒に20年ぶりに自作PCを作る

先日、AIで遊ぶために娘と一緒に75000円の自作PCを作ってみた。

娘と自作PC部品

AIのモデルを動かすとき、さすがにノートPCだとキツイ。whisperも遅すぎるし。そもそもマトモなGPUがない。そりゃ新型のmacbookproにRAM128Gでも搭載すれば、それなりに大きなLLMでも動かせるのだろうけど、子どもにお金がかかるし、ちょっと遊ぶのに無駄遣いはできない。

ノートPCに外付けでGPUカードの増設できないのかとも考えたが、なんかPC作るより面倒そうという理由で却下。

そこで目指すは低価格だがちょっとだけAI遊びができるデスクトップPC。しかし、残念ながらそんなものは売っていない。そこで自作パソコンの出番だ。

おっさんパパは、20年位前に自作PCを何台か作ったことがある。確かファミコンカセット(Slot1)のようなペンティアム3の自作PCが最後だった。ビデオカードはRIVA128。今のGPUと違って冷却ファンはもちろん、ヒートシンクすら付いてはいなかった。あのときゃ今を時めくnvidiaも新興メーカー。HelloPCと言う雑誌に低コスト且つ高速とあったから思わず購入した。やっぱり安くて高性能な製品を作る企業は伸びるんだなと。

それ以後はずっとノートPCで過ごしてきたから、現状の自作PCがどうなっているのかよくわからないものの、多分、適当にやれば出来るだろということで20年ぶりくらいの製作を決意。

部品選定

AI遊びなので、とにかくGPUメモリが重要。最低でも12Gは欲しい。それでも全然足りないけど、モデルを量子化とかすりゃ少しは遊べるだろう。あと、やっぱりAI遊びだしCUDAが使えるnvidiaかなと思いつつ、ビデオカード探すと高い。条件を満たす一番最低グレードの新品は最低5万円なり。円安だしどうにもならない。nvidia、今は高くて高性能だ。もう中古でいいと、RTX3060 12Gを中古で調達。

それ以外の構成は新品だが低価格な物にする。
AMDのCPU。20年前は今一な印象だったが、時は流れ、今は斜陽のインテルより良いらしいので選択。

RAMは32G、SSDは1テラ、GPUメモリは12Gと今使っているノートよりは速いだろという構成になった。価格の半分くらいがGPUという格安マシン。GPU高すぎ。中古品で調達したGPUだが結構キレイ。

自作PCの部品構成と購入時の価格

この構成なら、ゲーミングPCとは言えないものの、多少ゲームも出来そうだ。性能はPS5弱くらいか。もしかしたらこれやるかも。中国製のすごい昭和ゲーム?? という謎のネタゲーム。昭和脳にはツボに嵌るかも。

円安の今に75000円でできました。あまり性能には期待できないけど、仕方がない。多分ノートよりは速いはず。ベンチマークはHdベンチ? まだあるのか。

早速組み立て

やる事は20年前と大した違いはない。CPUつけて、メモリー刺して、HDDがSSDになってカードをマザーボードに直接刺すのがちょっと違うが簡単になっているので特に問題なし。今はFDDやCDROMとかも不要なので、老眼になって良く見えないのに30代の昔よりずっと高速で作れる。娘は30分もおっさんパパのPC組み立てに付き合ったが、途中で飽きて彼女が風呂に行っている間に完成。計60分弱。

コネクタ等も逆に刺すなんてことができないフールプルーフ仕様で老眼でも超安心。サウンドカードとかLANカードとかも要らないし。マザーボードに取りつける拡張カードはGPUだけだ。GPU内臓型のCPU使えばもっと簡単だろう。多分5歳児でも作れるのでは。

5歳児をナメてはいけない。5歳のときおっさんパパはゴミ捨て場に置いてある真空管仕様のブラウン管テレビを分解しまくって、感電したことがある。ファースト感電。1970年代。ちょうど昭和の東京オリンピックで普及した真空管テレビからトランジスタテレビへの移行期。家電リサイクル法なんてないから普通にゴミ捨て場に沢山のテレビが捨ててあった。ブラウン管の電子銃が真空管のお化けみたいで欲しかったのだ。捨ててあるテレビを分解中にあえなく感電。コンセント抜いてから時間がたっていたから大したことは無かったが。感電にもメゲず、石ころとかで無理やりブラウン管を破壊して最終的に電子銃をもぎ取った記憶がある。もちろん、刺さっていたその他真空管も全て抜いてお持ち帰り。それを真空管爆弾と称して投げつけて割って遊んでいた。昭和の子供の一般的風景である。

娘は3歳なので、取り合えずCPUの固定をしてもらったり、CPUファンのねじを締めたりしてもらう。血は争えないのか30分程度は結構喜んでやっていたが以降は飽きた。3歳児の集中力はそこまで長くは続かない。

娘にryzen 5 5500CPUを付けてもらう
娘にCPUファンを固定してもらう

キーボードは22年前に購入した東プレRealforce106。昔自作PCで使っていたやつだ。四半世紀前の骨董品。20年ぶりぐらいに引っ張り出し、令和のマザーボードにも未だにPS/2端子ついているからそのまま使う。接続したら普通に動作した。でもこれWindowsキーがない。いつからあるんだWindowsキー。

20年ぶりに使うキーボード 一生ものだろう

ケースはAmazonで購入。白っぽいやつ。
5000円位の低価格品だが、ガラス窓付で中身が見えて、ファンが動いているので娘も大喜び。20年前の安物ケースなんて加工が適当過ぎて、指をざく切りしていたが、これはちゃんと加工してあってケガする要素はない。なかなかいいが、何気にがたつく。まあこんなものか。

完成

1時間で完成 中身が見えるけど特に光らない
中身 今のGPUカードは大きい

起動させてみる

Windowsをインストールして、起動させてみるとあっけなく動作した。
まさに、あっけなく。

昔の自作PCにあった、ひたすらドライバをCDROMとかFDDでインストールする作業も自動化の波が押し寄せて今はない。Windowsがネットから勝手に拾ってきて勝手に適応している。ドライバの競合とかもない。実に簡単。ブルースクリーンとか出まくっていた20年前の自作PCは一体何だったのだろう。ディバイスマネージャーのビックリマークに一喜一憂するハラハラ感は今の自作PCには無縁だ。

唯一メモリが2600駆動になっていたので、確か3200のやつだったので、そこだけBIOSから手動で変更した。BIOSへは立ち上げ時のDELボタン連打で入れる。これも20年前とあまりかわらない。

ベンチマーク

FINAL FANTASY15ベンチをやってみる。
格安75000円PCなので、現在のPCにしては伸びない。ゲームしないからまあいいや。

FF15ベンチマーク

ちなみに、今使っているノート(2020年購入)だとこうなる。全然ダメ。

ノートパソコンのベンチ

このノートで今までWhisper動かしているのだから遅かった。ノートでもクラウドなら早いけどオンプレでやりたいのだ。

生成AI Stable Diffusionもやってみた

venvでpythonの仮想環境を作ってインストールしてみた。1000x1000の画像で大体1分弱くらい。起動するとGPUの負荷が上がっているのが確認できる。

娘とコンピューターお絵きで遊ぶ。残念ながら結構な確率で不気味な絵が出力される。猫に3本の手があるとか、一つの体に2つの頭とか。調整すれば直るのかもしれないけど、所詮遊びなので面倒だからやってない。
それでも、意外と娘にはウケがいい。こんな絵をかいてと言うのが、一発で出てくるのが子供には面白いらしい。娘に自分用のコンピュータすぐに買ってきてとせがまれた。

Stable Diffusion

音声合成ソフトをやってみる

VOICEVOXという無料の音声読み上げソフトがあるというのでやってみた。昔からある初音ミクのより進化した奴っぽい。ディープラーニングで鍛えたそうだ。CPU版とGPU版があるが、自作PCにGPU版をいれて普通に動いた。

コンピュータが話すと娘が喜ぶ。ならばと、おっさんパパは公文の問題文をPCに喋らせて何とか公文のプリントをやらせようと必死だが、娘に余裕で無視される。PCは面白くても公文はやりたくないらしい。

文字起こしAI WhisperをGPUで動かしてみる

cuda11.8を先にインストールして、pytorchはpip3でcuda11.8用を入れた。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# Whisper モデルのロード
try:
    model = whisper.load_model("large-v3", device="cuda")
    print("Whisperモデルのロードに成功しました")
except Exception as e:
    print(f"Whisperロードエラー: {e}")
    exit(1)
# 話者分離
pipeline.to(torch.device("cuda"))

try:
    diarization = pipeline({"uri": "filename", "audio": preprocessed_file})

以前のノートではCPUだけを使っていたが、自作PCではGPUがちゃんと動いている。40分程度の音声ファイルは、WhisperはCPUだと1時間以上かかっても終わらないがGPUだと2分、1~2時間はかかっていた話者分離は4分で可能に。計6分で高速になった。すごいぞGPU。20年ぶりに購入したGPUだけのことはある。

GPU100%

QwQ32B LLMで議事録としてまとめてみる

高速になったのでローカルLLMで議事録にまとめてみる。オンプレにこだわりが無ければ、クラウドのチャットGPTに突っ込んだ方がはるかに速いし質も良い。ollamaを使い、色々試した結果、性能が良かったqwq:32bモデルで起動することにする。中国のアリババが作ったモデルだそうです。75000円自作PCでも何とか実用的レベルで動作可能。

QwQ32bの性能 このレベルが75000円自作PCで動作するのは脅威

モデルはphi4でも、Gemma3でも、deepseek r1でも好きなの使ってみてください。ollamaなら簡単に導入できますし。でもLLMはコンテクストサイズが大きくても何故か長文読めないので、とにかく分割して入れてくしかないのが面倒。さらに、文章が長い程時間がかかる。しかも、32bモデルだからGPUメモリからはみ出すので余計に遅くなる。

全ローカル処理の議事録作成プログラムの全コード

import os
import shutil
import subprocess
import torch
import re
import numpy as np
import soundfile as sf
import whisper
import ollama
import torchaudio
import torchaudio.transforms as T
from datetime import timedelta
from pyannote.audio.pipelines import SpeakerDiarization

# 音声の前処理
def preprocess_audio(file_path, target_sr=16000, output_path="c:/whp/preprocessed_audio.wav"):
    waveform, sr = torchaudio.load(file_path)
    if waveform.shape[0] > 1:
        waveform = torch.mean(waveform, dim=0, keepdim=True)
    if sr != target_sr:
        waveform = T.Resample(orig_freq=sr, new_freq=target_sr)(waveform)
    waveform /= waveform.abs().max()
    torchaudio.save(output_path, waveform, target_sr)
    return output_path

# FFmpeg を用いた MP3 → WAV 変換
def convert_to_wav(input_path, output_path):
    subprocess.run(["ffmpeg", "-i", input_path, output_path, "-y"], check=True)
    return output_path

# 文字起こし
def transcribe_audio(file_path):
    model = whisper.load_model("large-v3-turbo", device="cuda")
    result = model.transcribe(file_path, fp16=False, language="ja")
    del model
    torch.cuda.empty_cache()
    return result["segments"]

# 話者分離
def diarize_audio(file_path, auth_token):
    pipeline = SpeakerDiarization.from_pretrained("pyannote/speaker-diarization", use_auth_token=auth_token)
    pipeline.to(torch.device("cuda"))
    diarization = pipeline({"uri": "filename", "audio": file_path})
    del pipeline
    torch.cuda.empty_cache()
    return [{"start": seg.start, "end": seg.end, "speaker": spk} for seg, _, spk in diarization.itertracks(yield_label=True)]

# 文字起こしと話者情報の統合
def merge_segments(transcription, diarization):
    merged = []
    for seg in transcription:
        start, end, text = seg["start"], seg["end"], seg["text"]
        speakers = [d["speaker"] for d in diarization if d["start"] < end and d["end"] > start]
        speaker = speakers[0] if speakers else "Unknown"
        if merged and merged[-1]["speaker"] == speaker:
            merged[-1]["end"] = end
            merged[-1]["text"] += " " + text
        else:
            merged.append({"speaker": speaker, "start": start, "end": end, "text": text})
    return merged

# 文章分割
def split_text(text, max_length=2000, min_length=1000):
    segments = []
    while len(text) > max_length:
        split_idx = max(
            (text.rfind(x, min_length, max_length) for x in ["。", "!", "?", "\n\n"] if text.rfind(x, min_length, max_length) != -1),
            default=-1
        )
        
        if split_idx == -1 or split_idx < min_length:
            split_idx = min(max_length, len(text))

        segments.append(text[:split_idx + 1].strip())
        text = text[split_idx + 1:].strip()

    segments.append(text)
    return segments

# 要約生成
def generate_summary(merged_segments):
    text_segments = split_text("\n".join([f"{s['speaker']}: {s['text']}" for s in merged_segments]))
    summaries = []
    for segment in text_segments:
        prompt = f"""以下の文章を日本語で要約してください。
        ### 入力
        {segment}
        ### 出力"""
        response = ollama.generate(model="qwq:32b", prompt=prompt, system="長文を正確に処理するAIです。", options={"temperature": 0.7})
        summaries.append(response["response"])
    return "\n".join(summaries)

# メイン処理
audio_path = "c:/whp/1.mp3" #会議の録音データのパス
wav_path = convert_to_wav(audio_path, "c:/whp/wavsound.wav")
preprocessed_file = preprocess_audio(wav_path)
transcription_segments = transcribe_audio(preprocessed_file)
diarization_results = diarize_audio(preprocessed_file, auth_token="アクセストークンいれてね")
merged_segments = merge_segments(transcription_segments, diarization_results)
summary_text = generate_summary(merged_segments)
clean_text = re.sub(r"<think>[\s\S]*?</think>", "",summary_text)
print("\n=== 要約 ===\n", clean_text)

文字起こし、話者分離、LLMでの議事録化まで43分の音声ファイルで全行程20~30分程度。CPU駆動のノートの時は文字起こしと話者分離で、4時間ぐらい動いていたので、それに比べればかなり速くなった。

いつものように、こちらの音声ファイルで検証してみる。

[2470.080 --> 2472.940] 今後の予定でございますけれども
[2472.940 --> 2474.980] 実施結果につきましては
[2474.980 --> 2480.440] 市民情報センター関材課各市所の地域振興課において

文字起こし

SPEAKER_02: [8:56.980 --> 8:57.980] はい。
SPEAKER_09: [8:57.980 --> 9:42.980] このイベントは、 高崎シティロックフェス実行委員会が、 音楽のある街高崎、ロックの街高崎をキャッチフレーズに、 市民、行政、企業の力を集結し、 高崎の音楽文化の発展、 さらには高崎のみならず、 群馬県、北関東の音楽シーンを進化発展させ、 フェスをきっかけに、 まちづくりを進めていきたいと思います。
SPEAKER_07: [9:42.980 --> 10:48.980] ありがとうございます。 様子が大体わかりました。 5000万円はかなり大きな金額です。

話者分離

1. **2027年大河ドラマ「小栗・大津家之助子」関連対応**
NHKが発表した大河ドラマの制作決定を受け、市は倉渕地域の活性化と観光PRの好機と位置付けました。小栗家のゆかり地である倉渕・滝川・下西田地区を含む全市的な連携を進 め、史料収集・巡礼ツアー企画・撮影支援など、ドラマ放映に向けた機運醸成に取り組む方針です。

2. **全国アマチュアミュージシャンフェスティバル**
来年度開催予定の同イベントでは、オーディションを実施し優勝者に高崎市のタゴスタジオでレコーディング機会を提供する内容が確認されました。地域発アーティストの育成に期待が寄せられています。

3. **全国小学生ドッジボール選手権大会開催**
令和7年度に高崎アリーナで開催される第34回大会には全国48チーム(都道府県代表+前年度優勝者)が参加し、約3,000人の来場が見込まれます。市内経済の活況化が期待されるイベントとして位置付けられました。

審査では、各施策を通じた観光促進・地域連携の重要性が強調され、委員から「高崎市の全国的な認知向上へ積極的に取り組むよう」との要望が示されました。

ローカルLLMで議事録にまとめる。抜粋

75000円のオンボロPCで動作するローカルLLMでこのレベルかという。いや大卒新人が記述した議事録を上回っているかも。フォーマットを指定すればTODO抽出とかも可能でした。日本語のみならず、英語でも中国語でも出力できるし。

これ、20年後の娘の食い扶持が心配になるレベル。昔も書いたけどさ、こうも具体的だとね。AGIは近いのか? 公文とかやっていていいのか悩むレベルだ。

自作PC まとめ

75000円の自作PCでも、安定性は抜群だし思い切りAIで遊べます。
今流行っているAIである、画像生成、音声合成、音声認識、チャットGPTもどきのローカルLLMなど色々と出来ます。
クラウド使わずに、ある程度のスピードで議事録をこなせるようになりました。

それにしても75000円自作PCでここまでAIが動作するとは。輸出規制された低性能チップでもdeepseek r1という優秀なAIが実現できたので、半導体の重要性が下がったとしてNVIDIAを始めとした半導体株が下落しましたが、逆でしょ。これから、バンバン格安PCにAIが搭載される時代が来たという事。AI向け半導体はあらゆるものに搭載されるでしょう。この状況、やっぱり娘の食い扶持の脅威かもね。

娘もStable Diffusionの画像生成とずんだもんの音声合成で、結構楽しんでいるようで、PCおねだりされてます。でも、PCより自転車が先かも。

いいなと思ったら応援しよう!