Skip to content

Instantly share code, notes, and snippets.

@GOROman
Created January 5, 2025 05:06
Show Gist options
  • Save GOROman/81992860bb1f657a589e66f40320c5ad to your computer and use it in GitHub Desktop.
Save GOROman/81992860bb1f657a589e66f40320c5ad to your computer and use it in GitHub Desktop.
OpenAI Realtime API - node.js で音声のストリーム再生とWAV保存
import { RealtimeClient } from '@openai/realtime-api-beta';
import fs from 'fs';
import wav from 'wav';
import Speaker from 'speaker';
import { PassThrough } from 'stream';
const client = new RealtimeClient({
apiKey: process.env.OPENAI_API_KEY,
model: 'gpt-4o-mini-realtime-preview-2024-12-17', // モデルを指定
});
// WAV ファイルの準備
const wavFile = 'output.wav';
const fileStream = fs.createWriteStream(wavFile);
// WAV エンコーダの初期化
const wavEncoder = new wav.Writer({
channels: 1,
sampleRate: 24000,
bitDepth: 16,
});
wavEncoder.pipe(fileStream);
// スピーカーとバッファ管理
const audioBufferStream = new PassThrough(); // 音声データ用のストリーム
const speaker = new Speaker({
channels: 1,
bitDepth: 16,
sampleRate: 24000,
});
speaker.on('close', () => {
console.log('再生が終了しました。');
cleanupAndExit();
});
// スピーカーにデータを流す
audioBufferStream.pipe(speaker);
// イベント処理
client.on('conversation.updated', (event) => {
const { delta } = event;
const { item } = event;
if (delta && delta.audio) {
console.log("音声データを処理します...");
const audioBuffer = Buffer.from(delta.audio.buffer);
// スピーカーにデータを渡す
audioBufferStream.write(audioBuffer);
// WAV エンコーダにデータを書き込む
wavEncoder.write(audioBuffer);
}
const role = item.role;
const status = item.status;
console.log(event);
console.log(role);
console.log(status);
// 応答が完了したら終了
if (status == "completed" && role == "assistant") {
console.log("応答が完了しました。接続を終了します...");
audioBufferStream.end();
}
});
// リソースを解放して終了する関数
function cleanupAndExit() {
wavEncoder.end(); // WAV エンコーダ終了
audioBufferStream.end(); // ストリーム終了
speaker.close(); // スピーカー終了
client.disconnect(); // OpenAI 接続を切断
console.log("すべてのリソースを解放しました。");
process.exit(0); // プログラム終了
}
// API への接続
await client.connect();
console.log("接続完了");
// メッセージ送信
client.sendUserMessageContent([{ type: 'input_text', text: `おっす!おら天津飯!` }]);
console.log("メッセージ送信完了");
@GOROman
Copy link
Author

GOROman commented Jan 5, 2025

@GOROman
Copy link
Author

GOROman commented Jan 5, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment