Skip to main content

Qwen-Audio-Realtime Node.js SDK

音声 Node.js SDK で Qwen-Audio-Realtime のセッション設定、音声の送受信、文字起こし、ツール呼び出しを行います。

SDK のインストール

Node.js 18 以降が必要です。SDK 0.1.0 パッケージをダウンロードし、プロジェクトで次を実行します。
npm install ./dashscope-sdk-nodejs-0.1.0.tgz

クイックスタート

コンソールで API キーを取得し、環境変数 DASHSCOPE_API_KEY に設定します。 サンプル音声を input.mp3 として保存し、16 kHz、16-bit、モノラル PCM に変換します。
ffmpeg -i input.mp3 -f s16le -ac 1 -ar 16000 input.pcm
次のサンプルを example.mjs として保存し、node example.mjs を実行します。
import { readFileSync, writeFileSync } from 'node:fs'
import { setTimeout as sleep } from 'node:timers/promises'
import { RealtimeClient } from 'dashscope-sdk-nodejs/realtime'

const pcm = readFileSync('input.pcm')
const client = new RealtimeClient({
  apiKey: process.env.DASHSCOPE_API_KEY,
  workspaceId: process.env.DASHSCOPE_WORKSPACE_ID,
  baseUrl: 'dashscope-intl.aliyuncs.com',
  model: 'qwen-audio-3.1-realtime-plus',
  voice: 'longanqian_v3.1',
  turnDetection: null,
  inputTranscription: { language: 'zh' },
})
const audio = []
function fail(err) {
  console.error(err.code, err.message)
  process.exitCode = 1
  client.close()
}
const timer = setTimeout(() => fail(new Error('Response timed out')), 60000)
client.on('close', () => clearTimeout(timer))
client.on('error', fail)
client.on('audio', chunk => audio.push(chunk))
client.on('inputTranscript', ({ transcript }) => console.log('User:', transcript))
client.on('outputTranscript', ({ transcript }) => console.log('Assistant:', transcript))
client.once('sessionUpdated', () => {
  ;(async () => {
    for (let offset = 0; offset < pcm.length; offset += 3200) {
      client.appendAudio(pcm.subarray(offset, offset + 3200))
      await sleep(100)
    }
    client.commit()
    client.createResponse()
  })().catch(fail)
})
client.once('responseDone', event => {
  if (event.response?.status !== 'completed') {
    fail(new Error('Response status: ' + event.response?.status))
    return
  }
  writeFileSync('output.pcm', Buffer.concat(audio))
  client.close()
})
try {
  await client.connect()
} catch (err) {
  fail(err)
}

API リファレンス

コンストラクターのオプション

RealtimeClient のコンストラクターオプション:
パラメーター型必須説明
apiKeystringいいえAPI キー。デフォルトは DASHSCOPE_API_KEY。
workspaceIdstringいいえワークスペース ID。デフォルトは DASHSCOPE_WORKSPACE_ID。
baseUrlstringいいえサービスホスト名を dashscope-intl.aliyuncs.com(シンガポール)に設定します。
modelstringはいモデル ID。
voicestringいいえ音色 ID。省略時はサービスのデフォルト音色を使用します。
instructionsstringいいえ役割やスタイルなどを指定するシステム指示。
turnDetectionTurnDetection | nullいいえデフォルトは { type: "server_vad" }。null は手動送信です。smart_turn と smart_turn_v2 にも対応します。
modalitiesArray<'text' | 'audio'>いいえ出力モダリティ。デフォルト:["text", "audio"]。
maxHistoryTurnsnumberいいえ履歴ターン数:[1,50]。サービスのデフォルト:20。
toolsToolDefinition[]いいえツール定義。アプリがツールを実行し、引数を検証します。
inputTranscription{ model?: string; language?: string } | nullいいえ入力文字起こし設定。例:{ model: "fun-asr", language: "zh" }。null で無効化します。
sessionExtrasSessionConfigいいえ追加セッション設定(speech_rate、enable_search など)。対応するトップレベル設定を上書きします。フィールドはクライアントイベントを参照してください。
connectTimeoutMsnumberいいえ接続タイムアウト(ms)。デフォルト:10000。

主なメソッド

メソッド戻り値説明
connect()Promise<void>接続して設定を送信し、sessionUpdated で反映を確認します。
updateSession(session: SessionConfig)voidセッションを更新し、sessionUpdated で確認します。
appendAudio(pcm: Buffer | Uint8Array)void16 kHz、16-bit、モノラル PCM を送信します。
commit()void手動モードで音声バッファーを確定します。
clearAudioBuffer()void未確定の音声バッファーを消去します。
createResponse(response?: Record<string, unknown>)voidモデルの応答生成を要求します。
cancelResponse()void現在の応答をキャンセルし、セッションは維持します。
createConversationItem(item: ConversationItem, previousItemId?: string)void履歴やツール結果を追加します。previousItemId で挿入位置を指定します。
submitFunctionCallOutput(callId: string, output: string, autoCreateResponse?: boolean)voidツール結果文字列を送信します。autoCreateResponse はデフォルト true で、次の応答を要求します。
deleteConversationItem(itemId: string)void指定した対話項目を削除します。
retrieveConversationItem(itemId: string)void対話項目を照会し、event で受信します。
sendEvent(event: ClientEvent)void元のクライアントイベントを送信します。
close(code?: number, reason?: string)voidセッションと WebSocket 接続を閉じます。

コールバックイベント

on(event, listener) でコールバックを登録します。全フィールドはサーバーイベントを参照してください。
イベントペイロード説明
openvoid接続が確立し、初期設定が送信されました。
sessionCreated / sessionUpdatedServerEventセッションの作成または設定の確認。
audioBufferバイナリ音声チャンク。複数回発生する場合があります。
audioTranscriptDelta{ delta: string }出力音声の文字起こしの差分テキスト。
outputTranscript{ transcript: string }出力音声の完全な文字起こし。
textDelta / textDone{ delta: string } / { text: string }テキストのみのモダリティにおける差分または完全なテキスト。
inputTranscriptDelta{ text: string; stash: string }text は確定、stash は暫定テキストです。追記せず、両者を組み合わせて表示内容を置き換えます。
inputTranscript{ transcript: string }入力音声の最終的な文字起こし。
speechStarted / speechStoppedServerEventユーザー音声の開始または停止を検出しました。
responseCreated / responseDoneServerEvent応答の開始または終了。responseDone.response.status が completed、キャンセル、失敗のいずれかを確認します。
functionCall{ callId: string; name: string; arguments: string }完全なツール呼び出し引数。アプリが arguments の JSON 文字列を解析・検証します。
ambientTranscript / ambientTranscriptCompleted{ text: string; stash: string } / { transcript: string }環境音の現在または最終的な文字起こし。会話コンテキストには追加されません。
eventServerEvent元のサービス JSON メッセージ。
errorDashScopeError接続またはサービスのエラー。
close{ code: number; reason: string }基になる接続の切断通知。