diff --git a/model/core.js b/model/core.js index 28c6306..c5ffdb7 100644 --- a/model/core.js +++ b/model/core.js @@ -434,6 +434,14 @@ class Core { await redis.set(`CHATGPT:CONVERSATION_CREATER_ID:${sendMessageResult.conversationId}`, e.sender.user_id) await redis.set(`CHATGPT:CONVERSATION_CREATER_NICK_NAME:${sendMessageResult.conversationId}`, e.sender.card) } + (async () => { + let audio = await this.chatGPTApi.synthesis(sendMessageResult) + if (audio) { + await e.reply(segment.record(audio)) + } + })().catch(err => { + logger.warn('发送语音失败', err) + }) return sendMessageResult } else if (use === 'chatglm') { const cacheOptions = { diff --git a/utils/message.js b/utils/message.js index 8f13d01..40ee87d 100644 --- a/utils/message.js +++ b/utils/message.js @@ -164,4 +164,35 @@ export class OfficialChatGPTClient { return await this.sendMessage(prompt, opts, retry - 1) } } + + voices = ['ember', 'cove', + 'juniper', 'sky', 'breeze' + // '__internal_only_shimmer', + // '__internal_only_santa' + ] + + async synthesis (opts = {}) { + const { messageId, conversationId } = opts + let url = this._apiReverseUrl.replace('/conversation', '/synthesize') + let randomVoice = this.voices[Math.floor(Math.random() * this.voices.length)] + url = `${url}?message_id=${messageId}&conversation_id=${conversationId}?voice=${randomVoice}` + let res = await fetch(url, { + method: 'GET', + headers: { + accept: 'audio/mpeg', + 'x-openai-assistant-app-id': '', + authorization: this._accessToken ? `Bearer ${this._accessToken}` : '', + referer: 'https://chat.openai.com/chat', + library: 'chatgpt-plugin' + } + }) + if (res.status !== 200) { + throw new Error(await res.text()) + } + if (res.headers.get('content-type') !== 'audio/mpeg') { + throw new Error('invalid content type') + } + let buffer = await res.arrayBuffer() + return Buffer.from(buffer) + } }