Skip to content

Commit

Permalink
✨ feat: update OpenAITTS api
Browse files Browse the repository at this point in the history
  • Loading branch information
arvinxx committed Nov 17, 2023
1 parent 0796dcb commit 1a14f4b
Show file tree
Hide file tree
Showing 5 changed files with 224 additions and 31 deletions.
41 changes: 19 additions & 22 deletions docs/api/edge-speech-tts.zh-CN.md
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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 包即可。

Expand All @@ -59,11 +65,6 @@ import WebSocket from 'ws';
global.WebSocket = WebSocket;
```

## 属性

- `locale`: 字符串,表示实例化时指定的语音区域设置。
- `BACKEND_URL`: 字符串,表示后端服务的 URL。

## 静态属性

- `localeOptions`: 获取所有支持的语音区域选项。
Expand All @@ -75,13 +76,9 @@ global.WebSocket = WebSocket;

### `voiceOptions`

获取当前实例的语音选项,这些选项基于实例化时指定的 `locale`

#### 返回值

返回一个包含当前可用语音选项的对象。
获取当前实例的语音选项,这些选项基于实例化时指定的 `locale`。 返回一个包含当前可用语音选项的对象。

### `create(payload: EdgeSpeechPayload): Promise<AudioBuffer>`
### `createAudio(payload: EdgeSpeechPayload): Promise<AudioBuffer>`

使用给定的请求负载创建语音合成。

Expand Down
102 changes: 102 additions & 0 deletions docs/api/microsoft-speech-tts.zh-CN.md
Original file line number Diff line number Diff line change
@@ -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<Response>`

使用给定的请求负载创建语音合成。

#### 参数

- `payload`: `MicrosoftSpeechPayload` 类型,包含语音合成请求的必要信息。

#### 返回值

返回一个 `Promise`,该 `Promise` 解析为 `Response` 对象,包含合成的语音数据。

### `createAudio(payload: MicrosoftSpeechPayload): Promise<AudioBuffer>`

使用给定的请求负载创建语音合成,并将其转换为 `AudioBuffer` 对象。

#### 参数

- `payload`: `MicrosoftSpeechPayload` 类型,包含语音合成请求的必要信息。

#### 返回值

返回一个 `Promise`,该 `Promise` 解析为 `AudioBuffer` 对象,包含合成的音频数据。
88 changes: 88 additions & 0 deletions docs/api/openai-tts.zh-CN.md
Original file line number Diff line number Diff line change
@@ -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<AudioBuffer>`

使用给定的请求负载创建语音合成。

#### 参数

- `payload`: `OpenAITTSPayload` 类型,包含语音合成请求的必要信息。

#### 返回值

返回一个 `Promise`,该 `Promise` 解析为 `AudioBuffer` 对象,包含合成的音频数据。
22 changes: 14 additions & 8 deletions src/core/OpenAITTS/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,20 @@ 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 {
private OPENAI_BASE_URL: string;
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() {
Expand All @@ -65,13 +65,19 @@ export class OpenAITTS {
});
};

create = async (payload: OpenAITTSPayload): Promise<AudioBuffer> => {
create = async (payload: OpenAITTSPayload): Promise<Response> => {
const response = await this.fetch(payload);

if (!response.ok) {
throw new Error('Network response was not ok');
}

return response;
};

createAudio = async (payload: OpenAITTSPayload): Promise<AudioBuffer> => {
const response = await this.create(payload);

const arrayBuffer = await response.arrayBuffer();
return await arrayBufferConvert(arrayBuffer);
};
Expand Down
2 changes: 1 addition & 1 deletion src/react/useOpenAITTS/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
);
Expand Down

0 comments on commit 1a14f4b

Please sign in to comment.