@speech-sdk/core 0.0.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/dist/providers/openai/index.d.ts +6 -1
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +38 -2
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/openai/instructions.d.ts +5 -0
- package/dist/providers/openai/instructions.d.ts.map +1 -0
- package/dist/providers/openai/instructions.js +61 -0
- package/dist/providers/openai/instructions.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -109,20 +109,22 @@ console.log(result.warnings); // undefined — eleven_v3 supports all tags
|
|
|
109
109
|
|
|
110
110
|
| Provider | Behavior |
|
|
111
111
|
|---|---|
|
|
112
|
+
| OpenAI (`gpt-4o-mini-tts`) | Tags mapped to the `instructions` field for expressive delivery control |
|
|
112
113
|
| ElevenLabs (`eleven_v3`) | All `[tag]` passed through natively |
|
|
113
114
|
| Cartesia (`sonic-3`) | Emotion tags (`[happy]`, `[sad]`, `[angry]`, etc.) converted to SSML; `[laughter]` passed through; unknown tags stripped |
|
|
114
115
|
| All others | Tags stripped and warnings returned |
|
|
115
116
|
|
|
116
117
|
```ts
|
|
117
|
-
//
|
|
118
|
+
// OpenAI gpt-4o-mini-tts — tags are mapped to the `instructions` field
|
|
118
119
|
const result = await generateSpeech({
|
|
119
120
|
model: 'openai/gpt-4o-mini-tts',
|
|
120
|
-
text: '[
|
|
121
|
+
text: '[cheerfully] Hi John how are you? [soft] I\'m feeling great',
|
|
121
122
|
voice: 'alloy',
|
|
122
123
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
//
|
|
124
|
+
// Sent to OpenAI:
|
|
125
|
+
// input: "Hi John how are you? I'm feeling great"
|
|
126
|
+
// instructions: "Delivery shifts through the text in order: begin cheerfully, then soft."
|
|
127
|
+
console.log(result.warnings); // undefined
|
|
126
128
|
```
|
|
127
129
|
|
|
128
130
|
## Voice Cloning
|
|
@@ -12,7 +12,7 @@ export declare class OpenAISpeechProvider implements SpeechProvider<string, stri
|
|
|
12
12
|
readonly id: "gpt-4o-mini-tts";
|
|
13
13
|
readonly languages: readonly ["af", "ar", "bg", "bn", "bs", "ca", "cs", "cy", "da", "de", "el", "en", "es", "et", "fi", "fr", "gl", "gu", "he", "hi", "hr", "hu", "id", "is", "it", "ja", "jv", "ka", "kk", "km", "kn", "ko", "lo", "lt", "lv", "mk", "ml", "mn", "mr", "ms", "my", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "si", "sk", "sl", "so", "sq", "sr", "su", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "zh"];
|
|
14
14
|
readonly releaseDate: "2025-03-20";
|
|
15
|
-
readonly audioTags:
|
|
15
|
+
readonly audioTags: true;
|
|
16
16
|
readonly openSource: false;
|
|
17
17
|
readonly inlineVoiceCloning: false;
|
|
18
18
|
}, {
|
|
@@ -34,6 +34,11 @@ export declare class OpenAISpeechProvider implements SpeechProvider<string, stri
|
|
|
34
34
|
private readonly baseURL;
|
|
35
35
|
private readonly fetchFn;
|
|
36
36
|
constructor(config: OpenAISpeechProviderConfig);
|
|
37
|
+
private buildRequestInput;
|
|
38
|
+
processAudioTags(text: string, modelId: string): {
|
|
39
|
+
text: string;
|
|
40
|
+
warnings: string[];
|
|
41
|
+
};
|
|
37
42
|
generate(options: {
|
|
38
43
|
modelId: string;
|
|
39
44
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG9E,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,oBAAqB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IACzE,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,YAAY,qBAAqB;IAE1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAoEtB;IAEX,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;OAyBJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,0BAA0B;IAM9C,OAAO,CAAC,iBAAiB;IA8BzB,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAUjC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,UAAU,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CAwCH;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,0BAA+B,IAG3C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMhE"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { stripAudioTags } from "../../audio-tags.js";
|
|
1
2
|
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
3
|
+
import { buildOpenAIInstructionsFromTags } from "./instructions.js";
|
|
2
4
|
export class OpenAISpeechProvider {
|
|
3
5
|
id = "openai";
|
|
4
6
|
defaultModel = "gpt-4o-mini-tts";
|
|
@@ -76,7 +78,7 @@ export class OpenAISpeechProvider {
|
|
|
76
78
|
id: "gpt-4o-mini-tts",
|
|
77
79
|
languages: OpenAISpeechProvider.LANGUAGES,
|
|
78
80
|
releaseDate: "2025-03-20",
|
|
79
|
-
audioTags:
|
|
81
|
+
audioTags: true,
|
|
80
82
|
openSource: false,
|
|
81
83
|
inlineVoiceCloning: false,
|
|
82
84
|
},
|
|
@@ -105,13 +107,47 @@ export class OpenAISpeechProvider {
|
|
|
105
107
|
this.baseURL = config.baseURL ?? "https://api.openai.com/v1";
|
|
106
108
|
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
107
109
|
}
|
|
110
|
+
buildRequestInput(modelId, text, providerOptions) {
|
|
111
|
+
if (modelId !== "gpt-4o-mini-tts") {
|
|
112
|
+
return { input: text, instructions: undefined };
|
|
113
|
+
}
|
|
114
|
+
const { text: cleaned, instructions: derived } = buildOpenAIInstructionsFromTags(text);
|
|
115
|
+
const userInstructions = providerOptions?.instructions;
|
|
116
|
+
const userInstructionsStr = typeof userInstructions === "string" && userInstructions.length > 0
|
|
117
|
+
? userInstructions
|
|
118
|
+
: undefined;
|
|
119
|
+
let instructions;
|
|
120
|
+
if (userInstructionsStr && derived) {
|
|
121
|
+
instructions = `${userInstructionsStr}\n\n${derived}`;
|
|
122
|
+
}
|
|
123
|
+
else if (userInstructionsStr) {
|
|
124
|
+
instructions = userInstructionsStr;
|
|
125
|
+
}
|
|
126
|
+
else if (derived) {
|
|
127
|
+
instructions = derived;
|
|
128
|
+
}
|
|
129
|
+
return { input: cleaned, instructions };
|
|
130
|
+
}
|
|
131
|
+
processAudioTags(text, modelId) {
|
|
132
|
+
// Models with audioTags flag support the SDK audio tag syntax.
|
|
133
|
+
// Leave raw tags in place so `generate()` can extract them and
|
|
134
|
+
// build the instructions string in a single pass.
|
|
135
|
+
if (this.models.some((m) => m.id === modelId && m.audioTags)) {
|
|
136
|
+
return { text, warnings: [] };
|
|
137
|
+
}
|
|
138
|
+
return stripAudioTags(text, `openai/${modelId}`);
|
|
139
|
+
}
|
|
108
140
|
async generate(options) {
|
|
141
|
+
const { input, instructions } = this.buildRequestInput(options.modelId, options.text, options.providerOptions);
|
|
109
142
|
const body = {
|
|
110
143
|
...options.providerOptions,
|
|
111
144
|
model: options.modelId,
|
|
112
|
-
input
|
|
145
|
+
input,
|
|
113
146
|
voice: options.voice,
|
|
114
147
|
};
|
|
148
|
+
if (instructions !== undefined) {
|
|
149
|
+
body.instructions = instructions;
|
|
150
|
+
}
|
|
115
151
|
const url = `${this.baseURL}/audio/speech`;
|
|
116
152
|
const response = await this.fetchFn(url, {
|
|
117
153
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/instructions.ts"],"names":[],"mappings":"AAOA,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,GAAG;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAqEA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const TAG_REGEX = /\[([^\]]+)\]/g;
|
|
2
|
+
export function buildOpenAIInstructionsFromTags(input) {
|
|
3
|
+
// Tokenize into an alternating list of text chunks and tag runs.
|
|
4
|
+
// Each Segment holds the tag(s) that apply to the text following them.
|
|
5
|
+
// A leading text chunk (before any tag) becomes a segment with tags: [].
|
|
6
|
+
const segments = [];
|
|
7
|
+
let current = { tags: [], text: "" };
|
|
8
|
+
let lastIndex = 0;
|
|
9
|
+
for (const match of input.matchAll(TAG_REGEX)) {
|
|
10
|
+
const matchIndex = match.index ?? 0;
|
|
11
|
+
current.text += input.slice(lastIndex, matchIndex);
|
|
12
|
+
lastIndex = matchIndex + match[0].length;
|
|
13
|
+
// If the current segment already has text, close it and start a new one.
|
|
14
|
+
// Otherwise (consecutive tags, or tag at position 0), keep accumulating
|
|
15
|
+
// tags onto the same segment.
|
|
16
|
+
if (current.text.length > 0) {
|
|
17
|
+
segments.push(current);
|
|
18
|
+
current = { tags: [], text: "" };
|
|
19
|
+
}
|
|
20
|
+
current.tags.push(match[1].trim().toLowerCase());
|
|
21
|
+
}
|
|
22
|
+
current.text += input.slice(lastIndex);
|
|
23
|
+
segments.push(current);
|
|
24
|
+
// Normalize whitespace in each segment's text.
|
|
25
|
+
for (const seg of segments) {
|
|
26
|
+
seg.text = seg.text.replace(/\s+/g, " ").trim();
|
|
27
|
+
}
|
|
28
|
+
// Build cleaned text: concatenate all segment texts with spaces.
|
|
29
|
+
const cleanedText = segments
|
|
30
|
+
.map((s) => s.text)
|
|
31
|
+
.filter((t) => t.length > 0)
|
|
32
|
+
.join(" ")
|
|
33
|
+
.replace(/\s+/g, " ")
|
|
34
|
+
.trim();
|
|
35
|
+
// No tags anywhere → no instructions.
|
|
36
|
+
if (segments.every((s) => s.tags.length === 0)) {
|
|
37
|
+
return { text: cleanedText, instructions: undefined };
|
|
38
|
+
}
|
|
39
|
+
// Build the ordered list of delivery "positions".
|
|
40
|
+
const positions = [];
|
|
41
|
+
for (let i = 0; i < segments.length; i++) {
|
|
42
|
+
const seg = segments[i];
|
|
43
|
+
if (seg.tags.length === 0) {
|
|
44
|
+
// Leading untagged text contributes "neutrally" only if it has content.
|
|
45
|
+
if (i === 0 && seg.text.length > 0) {
|
|
46
|
+
positions.push("neutrally");
|
|
47
|
+
}
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
positions.push(seg.tags.join(", "));
|
|
51
|
+
}
|
|
52
|
+
// Single-position case: "Speak X."
|
|
53
|
+
if (positions.length === 1 && positions[0] !== "neutrally") {
|
|
54
|
+
return { text: cleanedText, instructions: `Speak ${positions[0]}.` };
|
|
55
|
+
}
|
|
56
|
+
// Multiple positions → ordered shift directive.
|
|
57
|
+
const parts = positions.map((p, i) => (i === 0 ? `begin ${p}` : `then ${p}`));
|
|
58
|
+
const instructions = `Delivery shifts through the text in order: ${parts.join(", ")}.`;
|
|
59
|
+
return { text: cleanedText, instructions };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/providers/openai/instructions.ts"],"names":[],"mappings":"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"}
|