会議音声のテキスト化をChatGPT-GPT5の指示に従いやってみました

先日OpenAIからGPT-5がリリースされ、それに伴い、ChatGPTもGPT-5ベースになりました。
ネットでは、良くない評判も色々ありますが、実際に浸かってみないとと思っていました。
たまたま、Youtubeを開くと、「人工知能研究の第一人者らが国会で参考人質疑 松尾豊教授・生貝直人教授・さくらインターネット田中邦裕社長・AIあんの安野貴博氏|国会中継 衆議院 内閣委員会「AI推進法」~令和7年4月16日~」の動画の紹介が出てきました。
とりあえず、どんな話か視聴してみました。
視聴ついでに、字幕を出してみました。すると、結構字幕は正しくない文字になっているではありませんか。
字幕部分を.srt形式のテキストにしてみましたが、細切れのデータなので、あまり読みやすいものではありません。
動画に、文字を表示するためのファイルなので、当然ですね。
3
00:00:04,359 –> 00:00:07,470
はい、これより会議を開きます。内閣提出
人口知能関連技術の研究開発及び活用の4
00:00:07,470 –> 00:00:07,480
人口知能関連技術の研究開発及び活用の5
00:00:07,480 –> 00:00:10,790
人口知能関連技術の研究開発及び活用の
推進に関する法律案を議題といたします。6
00:00:10,790 –> 00:00:10,800
推進に関する法律案を議題といたします。7
00:00:10,800 –> 00:00:14,549
推進に関する法律案を議題といたします。
本日は本案審査のため参考人として東京8
00:00:14,549 –> 00:00:14,559
本日は本案審査のため参考人として東京9
00:00:14,559 –> 00:00:19,790
本日は本案審査のため参考人として東京
大学院工学系研究家技術経営戦略学先行10
00:00:19,790 –> 00:00:19,800
大学院工学系研究家技術経営戦略学先行11
00:00:19,800 –> 00:00:25,349
大学院工学系研究家技術経営戦略学先行
人口物工学研究センター教授松尾豊君大学12
00:00:25,349 –> 00:00:25,359
人口物工学研究センター教授松尾豊君大学13
00:00:25,359 –> 00:00:29,310
人口物工学研究センター教授松尾豊君大学
院法学研究家教授池外
こんな感じなので、その情報をAIで整理するにしても、もう少し繋がった文章にしてみたくなりました。
以前、動画(mp4)ファイルから音声(wav)を抽出し、その音声を、短い時間に分割し、それをGoogle Speech-to-text2で音声をテキストへ変換する実験を、あのフジテレビの記者会見で実験していました。
その時は、短い時間に分割したことで、その分割の時刻で音声が切れる問題への対応で、分割時刻を数秒重なりをもってテキスト化し、その後、テキストの重なり部分を除去する形でテキストを生成する実験を行ったことがあります。
この方法では、音声を分割の関係で結構面倒だったので、今回できるだけ簡単に行う方法がないかを調べてみました。
条件は、できるだけ音声認識部分は無料で行うということで進めました。
ChatGPT(GPT-5)にやり方を聞いてみました。
プロンプト
mp4で録音された国会参考人質疑があります。録音時間は、2時間45分程度です。
これを、テキスト化を、Google Colaboratoryで行うための手順と、コードをステップバイステップで提示してください。
ChatGPTの応答
いいですね。Colabで“2時間45分のMP4(国会参考人質疑)”を文字起こしする実践手順を、用途別に2通り用意しました。どちらもそのままノートブックに貼って動きます。
A. オフライン(無料):Whisper系(faster‑whisper)をColabのGPUで実行
→ 費用ゼロ・精度高・日本語強い。処理時間はGPU性能と音声長に比例。
B. Google Cloud Speech‑to‑Text v2(バッチ認識)
→ GCSに置いた音声をサーバ側で長時間処理。話者分離(誰が話したかのラベル)も公式にサポート。結果をJSONで取得してSRT/テキスト生成。
Google Cloud
+1
とりあえず、「A. オフライン(無料):Whisper系(faster‑whisper)」で行いましたので、その部分だけ掲載します。
A. Colabで「faster‑whisper」を使う(費用ゼロ・おすすめ)
手順(コピペOK)
1) GPUを有効化&環境セットアップ
Colab メニュー「ランタイム」→「ランタイムのタイプを変更」→ ハードウェア アクセラレータ = GPU(T4/A100等)
python
コピーする
編集する
# GPU確認(任意)
!nvidia-smi
# 依存関係インストール
!pip -q install faster-whisper==1.0.3 ffmpeg-python==0.2.0 pydub==0.25.1
# ffmpeg 本体(音声抽出に使用)
!apt -y install ffmpeg
2) MP4の配置
Google Driveに DietAudio/video.mp4 などで置く想定です(Colab左のフォルダからでもOK)。
python
コピーする
編集する
from google.colab import drive
drive.mount('/content/drive')
INPUT_MP4 = "/content/drive/MyDrive/DietAudio/video.mp4" # ←あなたのパスに変更
3) 音声だけ取り出して軽量化(16kHz/mono/PCM)
WhisperはMP4のままでも読めますが、長時間ではWAVへ変換した方が安定&高速です。
python
コピーする
編集する
!ffmpeg -y -i "$INPUT_MP4" -ac 1 -ar 16000 -vn -c:a pcm_s16le /content/audio.wav
4) 文字起こし本体(Whisper large-v3)
日本語の精度重視。GPUメモリが厳しい場合は compute_type="int8_float16" に。
python
コピーする
編集する
from faster_whisper import WhisperModel
MODEL_SIZE = "large-v3" # 精度重視(他: "medium", "large-v2" など)
model = WhisperModel(MODEL_SIZE, device="cuda", compute_type="float16")
segments, info = model.transcribe(
"/content/audio.wav",
language="ja",
vad_filter=True, # 無音区間で切る
vad_parameters=dict(min_silence_duration_ms=500),
condition_on_previous_text=True,
initial_prompt="これは日本の国会参考人質疑の議事録です。敬体・常用漢字を基本に整えます。"
)
# TXT, SRT, VTT を保存
import math, os, json
os.makedirs("/content/out", exist_ok=True)
txt_path = "/content/out/transcript.txt"
srt_path = "/content/out/transcript.srt"
vtt_path = "/content/out/transcript.vtt"
json_path = "/content/out/transcript.json"
def to_timestamp(t):
h = int(t//3600); m = int((t%3600)//60); s = t%60
return f"{h:02d}:{m:02d}:{s:06.3f}".replace('.', ',')
all_segments = []
with open(txt_path, "w", encoding="utf-8") as ft, \
open(srt_path, "w", encoding="utf-8") as fs, \
open(vtt_path, "w", encoding="utf-8") as fv:
fv.write("WEBVTT\n\n")
for i, seg in enumerate(segments, start=1):
all_segments.append(
dict(id=i, start=seg.start, end=seg.end, text=seg.text.strip())
)
# TXT
ft.write(seg.text.strip() + "\n")
# SRT
fs.write(f"{i}\n{to_timestamp(seg.start)} --> {to_timestamp(seg.end)}\n{seg.text.strip()}\n\n")
# VTT
fv.write(f"{to_timestamp(seg.start).replace(',','.')} --> {to_timestamp(seg.end).replace(',','.')}\n{seg.text.strip()}\n\n")
# JSON(タイムスタンプ付き)
with open(json_path, "w", encoding="utf-8") as fj:
json.dump({"language": info.language, "segments": all_segments}, fj, ensure_ascii=False, indent=2)
print("出力:", txt_path, srt_path, vtt_path, json_path)
補足
長時間ファイルでも自動で分割して処理します。精度をさらに上げたい場合は temperature=[0.0, 0.2, 0.4] を指定すると安定化することがあります。
話者分離(誰が話したか)はWhisper単体では弱いので、後述のB案(Google Cloudの話者分離)か、WhisperX+pyannoteで対応可能です(pyannoteはHugging Faceトークンが必要)。
GitHub
+1
ChatGPTの回答をそのまま、Google Colaboratoryで実行しました
ChatGPTの指示どおりにGoogle Colaboratoryにコピペして実行してみました。
なんと、エラーは全くなく、25分でテキスト化ができました。
実際に生成されたテキストは、次のようなものです。
はい、これより会議を開きます。
内閣提出人工知能関連技術の研究開発及び活用の推進に関する法律案を議題といたします。
本日は本案審査のため、参考人として、東京大学大学院工学系研究科技術経営戦略学専攻人工物工学研究センター教授松尾豊君、
一橋大学大学院工学研究科教授池貝直人君、一般社団法人ソフトウェア協会会長桜インターネット株式会社代表取締役社長田中邦博君、
一般財団法人ガブテック東京アドバイザー庵野貴博君、以上の4名の方々からご意見を受けたまることにいたしております。
この際、参考人各位に一言ご挨拶を申し上げます。
本日はお忙しいところです。
本日はお忙しいところ、内閣委員会にお運びくださいまして、本当にありがとうございました。
本日、様々な質疑があるかと思いますが、期間のないご意見をいただきたいと思います。
この法案の審議の参考とさせていただきたいと思いますので、どうかよろしくお願いいたします。
次に、議事の順序について申し上げます。
まず、松尾参考人、池貝参考人、田中参考人、庵野参考人の順に、お一人10分程度のご意見をお述べいただき、
その後、委員の質疑に対して、
お答えをいただきたいと思います。
全文はこのファイルを解凍してください。
Google Colaboratoryの実行画面は以下のとおりです。
おわりに
Whisper系(faster‑whisper)の存在を知らなかったというのは、本当に不覚でした。
こんなに簡単に、文字起こしができたので、少し驚きましたが、話者特定は、議事録には必要です。
たしか、以前のGoogle Speech-to-text2では、話者を認識できていたように思います。
そのあたりが自動でできると、情報の整理などにも道が拓けるのでしょう。
私が良い方法を知らないだけでしょうが、そういう情報も、対話AIが拓いてくれるかもしれません。
余談ですが、この国会中継 衆議院内閣委員会「AI推進法」の参考人質疑のやり取りを聞いていると、AIを日常で使っている人は、簡潔に質問に答えている印象を受けました。
質問している議員も、多分ChatGPTなども使っているのでしょう?質問も簡潔で、とても予算委員会での、自論を披露する演説のようなこともなく、揚げ足を取るため、意図のわからない質問などもなかったように思います。
この委員会でも、参考人が言われていた、AIを上手に使うために、プロンプトを完結に与えることは、上司が部下に簡潔に指示を与えることにもつながる。人の伝え方が理解を誤らないような言い方になっていく。
そんなことを言われていたことが、実際にそうなのだろうと思ったことです。
おまけ(議事録にできました)
ChatGPTの手順にはもう少しおまけがありました。
テキスト化時に、その他の情報も収集していました。
それらの情報を使い、議事録に整形するというコードです。
# === 国会参考人質疑:議事録体裁 整形ワンセル・スクリプト ==========================
# 入力:.txt(素の文字列) / .srt / .vtt / .json(faster-whisper A案のJSON例)
# 出力:Markdown議事録(章見出し・発言者見出し・時刻見出し)、プレーンテキスト、SRT(再生成)
# -----------------------------------------------------------------------------
# 使い方:
# 1) 下の INPUT_PATH をあなたのファイルに変更(Driveやアップロード可)
# 2) names/aliases/agenda を必要に応じて追記(ASR誤認補正にも使える)
# 3) ▶ 実行 → /content/out 以下に .md / .txt / .srt を生成
# -----------------------------------------------------------------------------
import os, re, json, math, pathlib
from datetime import timedelta
# ========= 設定 =========
INPUT_PATH = "/content/transcript.txt" # 例: Driveに置いた場合 "/content/drive/MyDrive/DietAudio/transcript.txt"
ESTIMATE_TOTAL_SECONDS = 2*60*60 + 45*60 # テキストのみの時:全体の長さの推定(2時間45分=9900秒)。SRT/JSONがあれば無視。
MIN_BLOCK_CHARS = 30 # 1ブロックの最小文字数(短すぎる行は前後に結合)
MAX_BLOCK_CHARS = 280 # 1ブロックの最大目安(越えたら句点・読点等で分割)
TIME_PER_CHAR = None # Noneなら ESTIMATE_TOTAL_SECONDS から均等割。固定したい場合は秒/文字を指定(例: 0.4)
# 既知の役職・肩書→省略形(見出し表示用)
ROLE_MAP = {
"参考人": "参考人",
"委員長": "委員長",
"理事": "理事",
"委員": "委員",
"大臣": "大臣",
"副大臣": "副大臣",
"政務官": "政務官",
}
# ASR誤認の"別名→正名"(必要に応じて追加)
ALIASES = {
"池外": "池貝", # 添付テキストに多い誤認
"ジーニアック": "GENIAC",
"ガードレール": "ガードレール",
}
# 優先的に見出し化したいアジェンダ・章(語が現れた時点のタイムスタンプで章見出しを打つ)
AGENDA_CUES = [
("開会", ["会議を開きます", "開会"]),
("議題", ["議題", "本日は", "本案"]),
("参考人意見陳述", ["それでは、", "お願いいたします。", "ご意見を", "意見を述べ"]),
("質疑", ["質疑に入ります", "質疑"]),
]
# 発言者のパターン(国会っぽい言い回しを正規表現で検出)
SPEAKER_PATTERNS = [
# 「松尾参考人、お願いいたします。」/「松尾参考人、ありがとうございました。」
r"(?P<name>[\u4E00-\u9FFF々〆ヵヶ一-龠ぁ-ゖァ-ヺーA-Za-z0-9・\.]+)\s*参考人",
# 「○○委員長」「○○委員」「○○理事」「○○大臣」など(末尾に「君。」呼びも)
r"(?P<name>[\u4E00-\u9FFF々〆ヵヶ一-龠ぁ-ゖァ-ヺーA-Za-z0-9・\.]+)\s*(?P<role>委員長|委員|理事|大臣|副大臣|政務官)\b",
r"(?P<name>[\u4E00-\u9FFF々〆ヵヶ一-龠ぁ-ゖァ-ヺーA-Za-z0-9・\.]+)君。", # 呼び出し
# 冒頭の自己紹介(大学/肩書+氏名)
r"(?:東京大学|一橋大学|庵野|田中|松尾|池[貝外])[\s ]*(?P<name>松尾|池[貝外]|田中|庵野)[\u4E00-\u9FFF]+",
]
# ========= ユーティリティ =========
def ts_from_seconds(sec: float) -> str:
if sec is None: sec = 0
td = timedelta(seconds=max(0, sec))
h = td.seconds//3600 + td.days*24
m = (td.seconds%3600)//60
s = td.seconds%60 + td.microseconds/1e6
return f"{h:02d}:{m:02d}:{s:06.3f}"
def srt_ts(sec: float) -> str:
return ts_from_seconds(sec).replace('.', ',')
def normalize_text(s: str) -> str:
# 軽い正規化:全角空白→半角、重空白削除、連続句点の整形、誤認修正
s = s.replace('\u3000',' ').strip()
s = re.sub(r'[ \t]+', ' ', s)
s = re.sub(r' ?([、。])', r'\1', s)
for a,b in ALIASES.items():
s = s.replace(a, b)
return s
def read_any(path: str):
ext = pathlib.Path(path).suffix.lower()
with open(path, 'r', encoding='utf-8') as f:
data = f.read()
data = data.strip()
if ext == ".json":
obj = json.loads(data)
# 期待JSON: {"language": "...", "segments":[{"id":..,"start":..,"end":..,"text":..}, ...]}
if "segments" in obj and isinstance(obj["segments"], list) and "start" in obj["segments"][0]:
segs = [{"start": s["start"], "end": s["end"], "text": normalize_text(s["text"])} for s in obj["segments"]]
return "segments", segs
if ext in (".srt", ".vtt"):
# 粗パーサ(依存ゼロでざっくり)
lines = data.splitlines()
blocks, cur = [], []
for line in lines:
if line.strip()=="" and cur:
blocks.append(cur); cur=[]
else:
cur.append(line)
if cur: blocks.append(cur)
segs=[]
for b in blocks:
tline = None
texts=[]
for ln in b:
if '-->' in ln:
tline = ln
elif re.match(r'^\d+$', ln.strip()):
continue
else:
texts.append(ln)
if not tline: continue
m = re.search(r'(\d{2}:\d{2}:\d{2}[,\.]\d{3})\s*-->\s*(\d{2}:\d{2}:\d{2}[,\.]\d{3})', tline)
if not m: continue
def to_sec(ts):
ts = ts.replace(',', '.')
h,m,s = ts.split(':')
return int(h)*3600 + int(m)*60 + float(s)
ssec, esec = to_sec(m.group(1)), to_sec(m.group(2))
segs.append({"start": ssec, "end": esec, "text": normalize_text(" ".join(texts))})
return "segments", segs
# プレーンテキスト
txt = normalize_text(data)
return "text", txt
def split_into_blocks_from_text(txt: str):
# 行区切り→連結→句点や「。」で適度に分割
lines = [l.strip() for l in txt.splitlines() if l.strip()]
merged=[]
buf=""
for l in lines:
if not buf: buf = l
elif len(buf)+1+len(l) < MAX_BLOCK_CHARS:
buf += (" " if not buf.endswith(("、","。")) else "") + l
else:
merged.append(buf); buf=l
if buf: merged.append(buf)
# まだ長いものは句点・読点・接続で再分割
blocks=[]
for m in merged:
if len(m)<=MAX_BLOCK_CHARS:
blocks.append(m); continue
parts = re.split(r"(。|\n|!|?)", m)
tmp=""
for p in parts:
if p in ("。","!","?"): tmp += p; continue
if not p: continue
if len(tmp)+len(p) > MAX_BLOCK_CHARS and tmp:
blocks.append(tmp.strip()); tmp=p
else:
tmp = (tmp + p).strip()
if tmp: blocks.append(tmp.strip())
# 極端に短いものは前後に吸収
final=[]
for b in blocks:
if final and len(b)<MIN_BLOCK_CHARS:
final[-1] = (final[-1] + (" " if not final[-1].endswith(("、","。")) else "") + b).strip()
else:
final.append(b)
return final
def assign_times_equally(blocks, total_seconds: float):
# 文字数に比例配分(より自然)
total_chars = sum(len(b) for b in blocks)
if total_chars==0: total_chars=1
t=0.0
segs=[]
for b in blocks:
dur = max(1.0, total_seconds * (len(b)/total_chars))
segs.append({"start": t, "end": t+dur, "text": b})
t += dur
return segs
def detect_speaker(text: str):
for pat in SPEAKER_PATTERNS:
m = re.search(pat, text)
if m:
name = m.groupdict().get("name")
role = m.groupdict().get("role")
if name:
# alias補正
for a,b in ALIASES.items():
name = name.replace(a,b)
# 苗字だけなら代表的敬称を補う
if not role and "参考人" in text:
role = "参考人"
return (name.strip(), role)
if role:
return (role, role)
# 冒頭の「委員長」単独
if "委員長" in text and len(text) < 30:
return ("委員長", "委員長")
return (None, None)
def agenda_hit(text: str):
for title, cues in AGENDA_CUES:
for cue in cues:
if cue in text:
return title
return None
def build_minutes(segs):
# segs: [{"start","end","text"}]
minutes=[]
current_speaker=None
current_role=None
pending_agenda=None
for s in segs:
text = s["text"].strip()
# 章見出し(アジェンダ)
ag = agenda_hit(text)
if ag:
minutes.append({"type":"section", "title": ag, "time": s["start"]})
# 発言者検出
spk, role = detect_speaker(text)
# 「〜お願いします/ありがとうございました」で明確に切り替え
if spk or ("お願いいたします" in text) or ("ありがとうございました" in text) or ("質疑に入ります" in text):
current_speaker, current_role = spk or current_speaker, role or current_role
if current_speaker:
minutes.append({"type":"speaker", "name": current_speaker, "role": current_role, "time": s["start"]})
# 本文
minutes.append({"type":"para", "time": s["start"], "text": text})
return minutes
def render_markdown(minutes, title="内閣委員会 参考人質疑 議事録(自動整形)"):
md=[]
md.append(f"# {title}\n")
last_time_header=None
for it in minutes:
if it["type"]=="section":
md.append(f"\n## {it['title']} [{ts_from_seconds(it['time'])}]\n")
last_time_header = it['time']
elif it["type"]=="speaker":
role = it.get("role")
role_s = f"({ROLE_MAP.get(role, role)})" if role else ""
md.append(f"\n### {it['name']}{role_s} [{ts_from_seconds(it['time'])}]\n")
elif it["type"]=="para":
md.append(it["text"]+"\n")
return "\n".join(md).strip()
def render_plain(minutes):
lines=[]
for it in minutes:
if it["type"]=="section":
lines.append(f"[{ts_from_seconds(it['time'])}] <{it['title']}>")
elif it["type"]=="speaker":
role = it.get("role")
role_s = f"({ROLE_MAP.get(role, role)})" if role else ""
lines.append(f"[{ts_from_seconds(it['time'])}] ◆{it['name']}{role_s}")
elif it["type"]=="para":
lines.append(it["text"])
return "\n".join(lines)
def render_srt(minutes):
# 各段落をSRTに(speaker/sectionは行頭記号で表示)
srt=[]
idx=1
prev_time=None
for it in minutes:
if it["type"] in ("section","speaker","para"):
start = it["time"]
# 終了は次の要素の開始時刻に近い値を自動推定(固定+2秒のバッファ)
# 次のtimeが無い場合は+4秒
# ※精密なSRTが必要ならSRT/JSON入力を使う運用を推奨
end = start + 4.0
# 次のtimeを探す
# (この軽量実装では厳密に見ない)
# 実用上十分
text = it.get("text","")
if it["type"]=="section":
text = f"<{it['title']}>"
elif it["type"]=="speaker":
role = it.get("role")
role_s = f"({ROLE_MAP.get(role, role)})" if role else ""
text = f"{it['name']}{role_s}"
srt.append(str(idx))
srt.append(f"{srt_ts(start)} --> {srt_ts(end)}")
srt.append(text.strip())
srt.append("")
idx+=1
return "\n".join(srt)
# ========= 実行 =========
kind, payload = read_any(INPUT_PATH)
if kind == "segments":
segs = payload
else:
blocks = split_into_blocks_from_text(payload)
if TIME_PER_CHAR is None:
# 全体長さ×文字割合
total_chars = sum(len(b) for b in blocks)
TIME_PER_CHAR = (ESTIMATE_TOTAL_SECONDS / max(1,total_chars))
# 均等割り(文字数比)
segs = []
t=0.0
for b in blocks:
dur = max(1.0, len(b)*TIME_PER_CHAR)
segs.append({"start": t, "end": t+dur, "text": b})
t += dur
minutes = build_minutes(segs)
os.makedirs("/content/out", exist_ok=True)
md = render_markdown(minutes)
txt = render_plain(minutes)
srt = render_srt(minutes)
with open("/content/out/minutes.md", "w", encoding="utf-8") as f: f.write(md)
with open("/content/out/minutes.txt","w", encoding="utf-8") as f: f.write(txt)
with open("/content/out/minutes.srt","w", encoding="utf-8") as f: f.write(srt)
print("生成しました:")
print("/content/out/minutes.md")
print("/content/out/minutes.txt")
print("/content/out/minutes.srt")
# =============================================================================
これを実行すると、次のような議事録に整形できました。
# 内閣委員会 参考人質疑 議事録(自動整形)
## 開会 [00:00:00.000]
はい、これより会議を開きます。内閣提出人工知能関連技術の研究開発及び活用の推進に関する法律案を議題といたします。本日は本案審査のため、参考人として、東京大学大学院工学系研究科技術経営戦略学専攻人工物工学研究センター教授松尾豊君、一橋大学大学院工学研究科教授池貝直人君、一般社団法人ソフトウェア協会会長桜インターネット株式会社代表取締役社長田中邦博君、一般財団法人ガブテック東京アドバイザー庵野貴博君、以上の4名の方々からご意見を受けたまることにいたしております。この際、参考人各位に一言ご挨拶を申し上げます。本日はお忙しいところです。
## 議題 [00:00:43.081]
### 松尾(参考人) [00:00:43.081]
本日はお忙しいところ、内閣委員会にお運びくださいまして、本当にありがとうございました。本日、様々な質疑があるかと思いますが、期間のないご意見をいただきたいと思います。この法案の審議の参考とさせていただきたいと思いますので、どうかよろしくお願いいたします。次に、議事の順序について申し上げます。まず、松尾参考人、池貝参考人、田中参考人、庵野参考人の順に、お一人10分程度のご意見をお述べいただき、その後、委員の質疑に対して、お答えをいただきたいと思います。なお、参考人各位に申し上げますが、
## 議題 [00:01:22.450]
### 松尾(参考人) [00:01:22.450]
ご発言の際には、その都度委員長の許可を得てご発言くださいますようお願い申し上げます。また、参考人は、委員に対して質疑をすることができないということになっておりますので、あらかじめご承知をおき、願いたいと思います。それでは、松尾参考人、お願いいたします。はい、東京大学の松尾と申します。AI戦略会議において座長を務めさせていただいております。本日は、本法案に関しまして、①AIの利活用及び開発力の強化、②人材育成の重要性、③イノベーションの促進とリスク対応の両立の3点について、意見を述べさせていただきます。それに先立ちまして、
今、現在の日本を取り巻くAIの状況についてお話ししたいと思います。2022年11月に出たChatGPT以降、世界は、生成AIをめぐって大きく変化しています。生成AIは次々と新しいサービスを出し、GarFamと呼ばれるGoogleなどの米国企業は、生成AIに多額の投資をしています。中国でも最近、DeepSeekと呼ばれるサービスが注目を集めましたが、アリババ、テンセントなどの企業も非常に高い技術力を持っています。生成AIの開発にはGPUという半導体が不可欠ですが、これを提供するNVIDIAは世界一の時価総額となりました。一方で、
日本は、デジタル分野でここ20年、後陣を這いしてきました。皆様がお使いのスマホ、検索サービス、eコマース、会議アプリなど、多くのものが海外製です。そうした海外の企業が、AIに巨額の投資をしていますから、日本は、AIの分野においても非常に苦しい状況にあります。まず、普通にやって勝てない状況にある、と思っていただいて良いと思います。日本のデジタルワークサービスは、日本のデジタルワークサービスの中で最も大きく膨らんでいることは、皆様もよくご存知のところかと思います。そういった状況の中で、これまでのAIに関しての国の動きはどうか、
全文は、以下におきます。
ダウンロードのファイル名の拡張子を、.mdにしてご利用ください。