sample_mic_record.hsp

sample\iron\sample_mic_record.hsp » Plain Format

;============================================================
;  sample_mic_record.hsp — マイク録音 → WAV 保存 → クラウド文字起こし
;
;  hspmfcam.dll の audio-only API を使ってマイク単独録音を行い、
;  保存した WAV ファイルを iron_speech (cloud whisper) で文字起こし
;  するワンセットデモ。
;
;  使い方:
;    1. マイクデバイスインデックスを選ぶ (デフォルト 0)
;    2. Record ボタン → 5 秒間録音 → mic_record.wav に保存
;    3. (任意) Transcribe ボタンで文字起こし
;       → Groq の API キーが必要 (sample_speech.hsp と同じ)
;============================================================

#include "hsp3_net_64.as"
#include "iron_camera_mf.hsp"
#include "iron_speech.hsp"

	title "sample_mic_record — マイク録音 + 文字起こし"
	screen 0, 720, 540
	font "MS Gothic", 14

	; ----- マイクデバイス列挙 -----
	mes "==== マイク録音 + 文字起こしデモ ===="
	mes ""
	n_mic = iron_cam_audio_count()
	mes "接続オーディオデバイス: " + n_mic + " 個"
	repeat n_mic
		iron_cam_audio_name cnt, mic_name
		iron_cam_audio_id   cnt, mic_id
		mes strf("  [%d] %s", cnt, mic_name)
	loop
	mes ""

	; ----- iron_speech 設定 (cloud whisper) -----
	iron_speech_set_backend SPEECH_BACKEND_CLOUD
	iron_speech_set_endpoint "https://api.groq.com/openai/v1"
	iron_speech_set_model    "whisper-large-v3"
	iron_speech_set_key      "gsk_REPLACE_ME"     ; ← Groq の API キー
	iron_speech_open

	; ----- UI -----
	pos 10, 130
	mes "デバイス番号:"
	pos 100, 128
	objsize 60, 24
	dev_idx = 0
	input dev_idx, 4, 4, 24

	pos 10, 160
	objsize 100, 28
	button gosub "Record (5s)", *do_record

	pos 120, 160
	objsize 100, 28
	button gosub "Transcribe", *do_transcribe

	pos 230, 160
	objsize 100, 28
	button gosub "Read PCM", *do_read_pcm

	pos 10, 200
	mes "----- 結果 -----"
	pos 10, 225
	sdim log_text, 32768
	log_text = ""
	mesbox log_text, 700, 290, 4

	stop

;------------------------------------------------------------
*do_record
	objprm 0, dev_idx
	log_text = log_text + "[recording] device=" + dev_idx + ", 48kHz/16bit/mono...\n"
	objprm 4, log_text
	await 50

	hmic = iron_mic_open(dev_idx, 16000, 1, 16)   ; whisper 推奨は 16kHz mono
	if hmic < 0 {
		log_text = log_text + "[error] iron_mic_open failed\n\n"
		objprm 4, log_text
		return
	}

	; 実際に得られた format を確認
	iron_mic_get_format hmic, sr, ch, bits
	log_text = log_text + "  実 format: " + sr + "Hz / " + ch + "ch / " + bits + "bit\n"

	; WAV 録音開始
	iron_mic_save_wav hmic, "mic_record.wav"
	log_text = log_text + "  WAV 書き込み開始 → mic_record.wav\n"
	objprm 4, log_text

	; 5 秒待つ (worker thread が裏でフレーム取得 → リング + WAV 書き込み)
	wait 500

	iron_mic_save_wav_stop hmic
	iron_mic_close hmic

	; ファイルサイズ確認
	exist "mic_record.wav"
	log_text = log_text + "  完了 → " + strsize + " bytes\n\n"
	objprm 4, log_text
	return

*do_transcribe
	exist "mic_record.wav"
	if strsize < 0 {
		log_text = log_text + "[error] mic_record.wav が無い (先に Record してください)\n\n"
		objprm 4, log_text
		return
	}

	log_text = log_text + "[transcribing] mic_record.wav → cloud whisper...\n"
	objprm 4, log_text
	await 50

	sdim text, 16384
	iron_speech_transcribe "mic_record.wav", text
	if stat ! SPEECH_OK {
		log_text = log_text + "[error] transcribe failed: " + stat + " (API キーを確認)\n\n"
		objprm 4, log_text
		return
	}

	log_text = log_text + "[結果] " + text + "\n\n"
	objprm 4, log_text
	return

*do_read_pcm
	; リングバッファから 1 秒分の PCM を取り出すデモ
	objprm 0, dev_idx
	hmic = iron_mic_open(dev_idx, 16000, 1, 16)
	if hmic < 0 {
		log_text = log_text + "[error] iron_mic_open failed\n\n"
		objprm 4, log_text
		return
	}
	wait 100   ; 1 秒間バッファに溜める

	avail = iron_mic_avail(hmic)
	log_text = log_text + "[PCM] 1 秒経過、リング = " + avail + " bytes\n"

	; max 32000 byte (16k * 1ch * 2byte) = 1 秒分まで読み出し
	sdim pcm_buf, 33000
	iron_mic_read hmic, pcm_buf, 32000
	read_n = stat
	log_text = log_text + "  read = " + read_n + " bytes\n"

	; 簡単な振幅統計 (絶対値の最大)
	max_amp = 0
	repeat read_n / 2
		s = wpeek(pcm_buf, cnt * 2)
		if s > 32767 : s = s - 65536
		if s < 0 : s = -s
		if s > max_amp : max_amp = s
	loop
	log_text = log_text + "  max amplitude = " + max_amp + " (16bit signed)\n\n"
	objprm 4, log_text

	iron_mic_close hmic
	return