chore: establish YCode replication baseline and TODO

This commit is contained in:
xiaohan.yuan committed 2026-10-17 02:43:49 +08:00
commit 6dc59f89ba
1118 files changed
+196002

No files matched your search

+19
View File
@@ -0,0 +1,19 @@
import type { GatewayConfig } from '@shared/types'
/** Native transcription adapter. A provider failure is returned to the actual voice UI. */
export async function transcribeAudio(config: GatewayConfig, payload: { audioBase64: string; mimeType: string }): Promise<{ text: string }> {
if (!config.apiKey) throw new Error('语音转写需要配置支持转写的模型服务')
if (typeof payload?.audioBase64 !== 'string' || payload.audioBase64.length > 32 * 1024 * 1024) throw new Error('录音内容无效或过大')
if (!['audio/wav', 'audio/x-wav', 'audio/webm', 'audio/ogg', 'audio/mp4'].includes(payload.mimeType)) throw new Error('录音格式不受支持')
const bytes = Buffer.from(payload.audioBase64, 'base64')
const extension = payload.mimeType.includes('wav') ? 'wav' : payload.mimeType.split('/')[1]
const form = new FormData()
form.append('file', new Blob([bytes], { type: payload.mimeType }), `recording.${extension}`)
form.append('model', config.speechModel || 'whisper-1')
const base = (config.speechBaseUrl || config.baseUrl).replace(/\/+$/, '')
const response = await fetch(`${base}/audio/transcriptions`, { method: 'POST', headers: { authorization: `Bearer ${config.apiKey}` }, body: form, signal: AbortSignal.timeout(90000) })
if (!response.ok) throw new Error(`语音转写失败(${response.status});请检查模型服务是否支持语音转写`)
const result = await response.json() as { text?: unknown }
if (typeof result.text !== 'string') throw new Error('语音服务未返回有效文本')
return { text: result.text }
}