diff --git a/docs/api/edge-speech-tts.zh-CN.md b/docs/api/edge-speech-tts.zh-CN.md index a05c210..e7dfb4b 100644 --- a/docs/api/edge-speech-tts.zh-CN.md +++ b/docs/api/edge-speech-tts.zh-CN.md @@ -1,26 +1,28 @@ --- group: TTS title: EdgeSpeechTTS +apiHeader: + pkg: '@lobehub/tts' --- -# EdgeSpeechTTS +`EdgeSpeechTTS` 是一个基于 Edge 语音服务的文本转语音方法类。 -## `constructor(options: EdgeSpeechAPI & { locale?: string }): EdgeSpeechTTS` +该类支持将文本转换为语音,并提供了一系列方法来获取语音选项,创建语音合成请求。 -`EdgeSpeechTTS` 类是一个用于将文本转换为语音的工具,它可以在边缘运行时环境中使用。该类提供了一系列方法来获取语音选项,创建语音合成请求,并处理返回的音频数据。 +```ts +constructor(options: EdgeSpeechAPI & { locale?: string }): EdgeSpeechTTS +``` -### 参数 +## 参数 - `options`: 对象,可选。 - - `backendUrl`: 字符串,指定后端服务的 URL。如果提供,将使用此 URL 发送请求。 + - `serviceUrl`: 字符串,指定 Edge 语音服务的 URL。如果提供,将使用此 URL 发送请求。 - `locale`: 字符串,指定要使用的语音区域设置。如果提供,将用于过滤可用语音列表。 -### 示例 - -使用 Bun 直接运行 `EdgeSpeechTTS`: +## 示例 ```js -// bun index.js +// index.js import { EdgeSpeechTTS } from '@lobehub/tts'; import { Buffer } from 'buffer'; import fs from 'fs'; @@ -46,9 +48,13 @@ const mp3Buffer = Buffer.from(await response.arrayBuffer()); fs.writeFileSync(speechFile, mp3Buffer); ``` -在此示例中,首先实例化了 `EdgeSpeechTTS` 类,并指定了后端服务的 URL 和语音区域设置。然后创建了一个包含文本和语音选项的请求负载。最后,通过调用 `create` 方法并传入负载来合成语音。如果合成成功,将返回一个包含音频数据的 `AudioBuffer` 对象。如果出现错误,将捕获并处理。 +使用 Bun 运行: -在 Node.js 中运行 +```shell +$ bun index.js +``` + +在 Node.js 中运行: 由于 Nodejs 环境缺少 `WebSocket` 实例,所以我们需要 polyfill WebSocket。通过引入 ws 包即可。 @@ -59,11 +65,6 @@ import WebSocket from 'ws'; global.WebSocket = WebSocket; ``` -## 属性 - -- `locale`: 字符串,表示实例化时指定的语音区域设置。 -- `BACKEND_URL`: 字符串,表示后端服务的 URL。 - ## 静态属性 - `localeOptions`: 获取所有支持的语音区域选项。 @@ -75,13 +76,9 @@ global.WebSocket = WebSocket; ### `voiceOptions` -获取当前实例的语音选项,这些选项基于实例化时指定的 `locale`。 - -#### 返回值 - -返回一个包含当前可用语音选项的对象。 +获取当前实例的语音选项,这些选项基于实例化时指定的 `locale`。 返回一个包含当前可用语音选项的对象。 -### `create(payload: EdgeSpeechPayload): Promise` +### `createAudio(payload: EdgeSpeechPayload): Promise` 使用给定的请求负载创建语音合成。 diff --git a/docs/api/microsoft-speech-tts.zh-CN.md b/docs/api/microsoft-speech-tts.zh-CN.md new file mode 100644 index 0000000..f494f90 --- /dev/null +++ b/docs/api/microsoft-speech-tts.zh-CN.md @@ -0,0 +1,102 @@ +--- +group: TTS +title: MicrosoftSpeechTTS +apiHeader: + pkg: '@lobehub/tts' +--- + +`MicrosoftSpeechTTS` 是一个基于 Microsoft 语音服务的文本转语音方法类。 + +该类支持将文本转换为语音,并提供了一系列方法来获取语音选项,创建语音合成请求。 + +```ts +constructor(options: MicrosoftSpeechAPI & { locale?: string }): MicrosoftSpeechTTS +``` + +## 参数 + +- `options`: 对象,可选。 + - `serviceUrl`: 字符串,指定 Microsoft 语音服务的 URL。如果提供,将使用此 URL 发送请求。 + - `locale`: 字符串,指定要使用的语音区域设置。如果提供,将用于过滤可用语音列表。 + +## 示例 + +```js +// index.js +import { MicrosoftSpeechTTS } from '@lobehub/tts'; + +// 实例化 MicrosoftSpeechTTS +const tts = new MicrosoftSpeechTTS({ locale: 'zh-CN' }); + +// 创建语音合成请求负载 +const payload: MicrosoftSpeechPayload = { + input: '这是一段语音演示', + options: { + voice: 'yue-CN-XiaoMinNeural', + style: 'embarrassed', + }, +}; + +const speechFile = path.resolve('./speech.mp3'); + +// 调用 create 方法来合成语音 +const response = await tts.create(payload); +const mp3Buffer = Buffer.from(await response.arrayBuffer()); + +fs.writeFileSync(speechFile, mp3Buffer); +``` + +使用 Bun 运行: + +```shell +$ bun index.js +``` + +在 Node.js 中运行: + +由于 Nodejs 环境缺少 `WebSocket` 实例,所以我们需要 polyfill WebSocket。通过引入 ws 包即可。 + +```js +// 在文件顶部引入 +import WebSocket from 'ws'; + +global.WebSocket = WebSocket; +``` + +## 静态属性 + +- `localeOptions`: 获取所有支持的语音区域选项。 +- `voiceList`: 包含所有可用语音的列表。 +- `voiceName`: 包含所有语音名称的对象。 +- `styleList`: 包含所有可用语音风格的列表。 +- `createRequest`: 用于创建语音合成请求的静态方法。 + +## 方法 + +### `voiceOptions` + +获取当前实例的语音选项,这些选项基于实例化时指定的 `locale`。 返回一个包含当前可用语音选项的对象。 + +### `create(payload: MicrosoftSpeechPayload): Promise` + +使用给定的请求负载创建语音合成。 + +#### 参数 + +- `payload`: `MicrosoftSpeechPayload` 类型,包含语音合成请求的必要信息。 + +#### 返回值 + +返回一个 `Promise`,该 `Promise` 解析为 `Response` 对象,包含合成的语音数据。 + +### `createAudio(payload: MicrosoftSpeechPayload): Promise` + +使用给定的请求负载创建语音合成,并将其转换为 `AudioBuffer` 对象。 + +#### 参数 + +- `payload`: `MicrosoftSpeechPayload` 类型,包含语音合成请求的必要信息。 + +#### 返回值 + +返回一个 `Promise`,该 `Promise` 解析为 `AudioBuffer` 对象,包含合成的音频数据。 diff --git a/docs/api/openai-tts.zh-CN.md b/docs/api/openai-tts.zh-CN.md new file mode 100644 index 0000000..50acd02 --- /dev/null +++ b/docs/api/openai-tts.zh-CN.md @@ -0,0 +1,88 @@ +--- +group: TTS +title: OpenAITTS +apiHeader: + pkg: '@lobehub/tts' +--- + +`OpenAITTS` 是一个基于 OpenAI 语音服务的文本转语音方法类。 + +该类支持将文本转换为语音,并提供了一系列方法来获取语音选项,创建语音合成请求。 + +```ts +constructor(options: OpenAITTSAPI): OpenAITTS +``` + +## 参数 + +- `options`: 对象,可选。 + - `OPENAI_PROXY_URL`: 字符串,指定 OpenAI 代理 URL。如果提供,将使用此 URL 发送请求。 + - `OPENAI_API_KEY`: 字符串,指定 OpenAI API 密钥。如果提供,将用于身份验证。 + - `serviceUrl`: 字符串,指定要使用的 OpenAI 语音服务的 URL。如果提供,将用于发送请求。 + +## 示例 + +```js +// index.js +import { OpenAITTS } from '@lobehub/tts'; +import { Buffer } from 'buffer'; +import fs from 'fs'; +import path from 'path'; + +// 实例化 OpenAITTS +const tts = new OpenAITTS({ OPENAI_API_KEY: 'your-api-key' }); + +// 创建语音合成请求负载 +const payload = { + input: 'This is a voice synthesis demo', + options: { + model: 'tts-1', + voice: 'alloy', + }, +}; + +const speechFile = path.resolve('./speech.mp3'); + +// 调用 create 方法来合成语音 +const response = await tts.create(payload); +const mp3Buffer = Buffer.from(await response.arrayBuffer()); + +fs.writeFileSync(speechFile, mp3Buffer); +``` + +使用 Bun 运行: + +```shell +$ bun index.js +``` + +在 Node.js 中运行: + +```js +// 在文件顶部引入 +import WebSocket from 'ws'; + +global.WebSocket = WebSocket; +``` + +## 静态属性 + +- `voiceList`: 包含所有可用语音的列表。 + +## 方法 + +### `voiceOptions` + +获取当前实例的语音选项,这些选项基于实例化时指定的 `serviceUrl`。 返回一个包含当前可用语音选项的对象。 + +### `createAudio(payload: OpenAITTSPayload): Promise` + +使用给定的请求负载创建语音合成。 + +#### 参数 + +- `payload`: `OpenAITTSPayload` 类型,包含语音合成请求的必要信息。 + +#### 返回值 + +返回一个 `Promise`,该 `Promise` 解析为 `AudioBuffer` 对象,包含合成的音频数据。 diff --git a/src/core/OpenAITTS/index.ts b/src/core/OpenAITTS/index.ts index b62ef0c..b81cff7 100644 --- a/src/core/OpenAITTS/index.ts +++ b/src/core/OpenAITTS/index.ts @@ -25,9 +25,9 @@ export interface OpenAITTSPayload { } export interface OpenAITTSAPI { - apiKey?: string; - backendUrl?: string; - baseUrl?: string; + OPENAI_API_KEY?: string; + OPENAI_PROXY_URL?: string; + serviceUrl?: string; } export class OpenAITTS { @@ -35,10 +35,10 @@ export class OpenAITTS { private OPENAI_API_KEY: string | undefined; private BACKEND_URL: string | undefined; - constructor({ baseUrl, apiKey, backendUrl }: OpenAITTSAPI = {}) { - this.OPENAI_BASE_URL = baseUrl || OPENAI_BASE_URL; - this.OPENAI_API_KEY = apiKey; - this.BACKEND_URL = backendUrl; + constructor({ OPENAI_PROXY_URL, OPENAI_API_KEY, serviceUrl }: OpenAITTSAPI = {}) { + this.OPENAI_BASE_URL = OPENAI_PROXY_URL || OPENAI_BASE_URL; + this.OPENAI_API_KEY = OPENAI_API_KEY; + this.BACKEND_URL = serviceUrl; } get voiceOptions() { @@ -65,13 +65,19 @@ export class OpenAITTS { }); }; - create = async (payload: OpenAITTSPayload): Promise => { + create = async (payload: OpenAITTSPayload): Promise => { const response = await this.fetch(payload); if (!response.ok) { throw new Error('Network response was not ok'); } + return response; + }; + + createAudio = async (payload: OpenAITTSPayload): Promise => { + const response = await this.create(payload); + const arrayBuffer = await response.arrayBuffer(); return await arrayBufferConvert(arrayBuffer); }; diff --git a/src/react/useOpenAITTS/index.ts b/src/react/useOpenAITTS/index.ts index 0b10273..eb0fd3c 100644 --- a/src/react/useOpenAITTS/index.ts +++ b/src/react/useOpenAITTS/index.ts @@ -16,7 +16,7 @@ export const useOpenAITTS = (defaultText: string, config: OpenAITTSOptions) => { (segmentText: string) => { const instance = new OpenAITTS(api); - return instance.create({ input: segmentText, options }); + return instance.createAudio({ input: segmentText, options }); }, swrConfig, );