Created
January 5, 2025 05:06
-
-
Save GOROman/81992860bb1f657a589e66f40320c5ad to your computer and use it in GitHub Desktop.
OpenAI Realtime API - node.js で音声のストリーム再生とWAV保存
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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("メッセージ送信完了"); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Speaker
https://www.npmjs.com/package/speaker