speechflow 1.6.6 → 1.6.7
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/CHANGELOG.md +7 -0
- package/package.json +4 -4
- package/speechflow-cli/dst/speechflow-main-cli.js +2 -2
- package/speechflow-cli/dst/speechflow-main-cli.js.map +1 -1
- package/speechflow-cli/dst/speechflow-main-graph.js +4 -3
- package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node.js +1 -1
- package/speechflow-cli/dst/speechflow-node.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-audio.js +1 -1
- package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -1
- package/speechflow-cli/etc/oxlint.jsonc +2 -1
- package/speechflow-cli/package.json +17 -17
- package/speechflow-cli/src/speechflow-main-cli.ts +2 -2
- package/speechflow-cli/src/speechflow-main-graph.ts +4 -3
- package/speechflow-cli/src/speechflow-node.ts +1 -1
- package/speechflow-cli/src/speechflow-util-audio.ts +1 -1
- package/speechflow-ui-db/dst/app-font-fa-brands-400.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-regular-400.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-solid-900.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-v4compatibility.woff2 +0 -0
- package/speechflow-ui-db/dst/index.css +1 -1
- package/speechflow-ui-db/dst/index.js +21 -18
- package/speechflow-ui-db/package.json +12 -12
- package/speechflow-ui-st/dst/app-font-fa-brands-400.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-regular-400.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-solid-900.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-v4compatibility.woff2 +0 -0
- package/speechflow-ui-st/dst/index.css +1 -1
- package/speechflow-ui-st/dst/index.js +133 -47
- package/speechflow-ui-st/package.json +13 -13
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2-wt.d.ts +0 -1
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2-wt.js +0 -149
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2-wt.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2.d.ts +0 -13
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2.js +0 -202
- package/speechflow-cli/dst/speechflow-node-a2a-pitch2.js.map +0 -1
|
@@ -20,16 +20,16 @@
|
|
|
20
20
|
"@opensumi/reconnecting-websocket": "4.4.0",
|
|
21
21
|
"axios": "1.12.2",
|
|
22
22
|
"typopro-web": "4.2.7",
|
|
23
|
-
"@fortawesome/fontawesome-free": "7.0
|
|
24
|
-
"patch-package": "8.0.
|
|
23
|
+
"@fortawesome/fontawesome-free": "7.1.0",
|
|
24
|
+
"patch-package": "8.0.1",
|
|
25
25
|
"@rse/stx": "1.1.2",
|
|
26
|
-
"animejs": "4.
|
|
26
|
+
"animejs": "4.2.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"vite": "7.1.
|
|
30
|
-
"typescript-eslint": "8.
|
|
31
|
-
"@typescript-eslint/eslint-plugin": "8.
|
|
32
|
-
"@typescript-eslint/parser": "8.
|
|
29
|
+
"vite": "7.1.9",
|
|
30
|
+
"typescript-eslint": "8.45.0",
|
|
31
|
+
"@typescript-eslint/eslint-plugin": "8.45.0",
|
|
32
|
+
"@typescript-eslint/parser": "8.45.0",
|
|
33
33
|
"@vitejs/plugin-vue": "6.0.1",
|
|
34
34
|
"@rollup/plugin-yaml": "4.1.2",
|
|
35
35
|
"vite-plugin-node-polyfills": "0.24.0",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
|
|
40
40
|
"@vue/eslint-config-typescript": "14.6.0",
|
|
41
41
|
"vue-eslint-parser": "10.2.0",
|
|
42
|
-
"eslint": "9.
|
|
43
|
-
"@eslint/js": "9.
|
|
42
|
+
"eslint": "9.37.0",
|
|
43
|
+
"@eslint/js": "9.37.0",
|
|
44
44
|
"neostandard": "0.12.2",
|
|
45
45
|
"eslint-plugin-import": "2.32.0",
|
|
46
46
|
"eslint-plugin-vue": "10.5.0",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
"nodemon": "3.1.10",
|
|
52
52
|
"shx": "0.4.0",
|
|
53
|
-
"stylelint": "16.
|
|
53
|
+
"stylelint": "16.25.0",
|
|
54
54
|
"stylelint-config-html": "1.1.0",
|
|
55
55
|
"stylelint-config-recommended-vue": "1.6.1",
|
|
56
56
|
"stylelint-config-standard": "39.0.0",
|
|
@@ -58,10 +58,10 @@
|
|
|
58
58
|
"stylelint-stylus": "1.0.0",
|
|
59
59
|
"postcss-html": "1.8.0",
|
|
60
60
|
"stylus": "0.64.0",
|
|
61
|
-
"typescript": "5.9.
|
|
62
|
-
"vue-tsc": "3.0
|
|
61
|
+
"typescript": "5.9.3",
|
|
62
|
+
"vue-tsc": "3.1.0",
|
|
63
63
|
"delay-cli": "2.0.0",
|
|
64
|
-
"cross-env": "10.
|
|
64
|
+
"cross-env": "10.1.0",
|
|
65
65
|
"serve": "14.2.5",
|
|
66
66
|
|
|
67
67
|
"@types/luxon": "3.7.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
** SpeechFlow - Speech Processing Flow Graph
|
|
4
|
-
** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
|
-
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
/* pitch shifter audio worklet processor */
|
|
9
|
-
class PitchShifterProcessor extends AudioWorkletProcessor {
|
|
10
|
-
/* internal state */
|
|
11
|
-
shift;
|
|
12
|
-
frameSize;
|
|
13
|
-
overlap;
|
|
14
|
-
hopSize;
|
|
15
|
-
inputBuffer;
|
|
16
|
-
outputBuffer;
|
|
17
|
-
overlapBuffer;
|
|
18
|
-
windowFunction;
|
|
19
|
-
windowedBuffer;
|
|
20
|
-
shiftedBuffer;
|
|
21
|
-
inputPos = 0;
|
|
22
|
-
outputPos = 0;
|
|
23
|
-
/* worklet construction */
|
|
24
|
-
constructor(options) {
|
|
25
|
-
super();
|
|
26
|
-
/* get configuration from options */
|
|
27
|
-
const processorOptions = options.processorOptions ?? {};
|
|
28
|
-
this.shift = processorOptions.shift ?? 1.0;
|
|
29
|
-
this.frameSize = processorOptions.frameSize ?? 2048;
|
|
30
|
-
this.overlap = processorOptions.overlap ?? 0.5;
|
|
31
|
-
this.hopSize = Math.floor(this.frameSize * (1 - this.overlap));
|
|
32
|
-
/* initialize buffers */
|
|
33
|
-
this.inputBuffer = new Float32Array(this.frameSize * 2);
|
|
34
|
-
this.outputBuffer = new Float32Array(this.frameSize * 2);
|
|
35
|
-
this.overlapBuffer = new Float32Array(this.frameSize);
|
|
36
|
-
this.windowFunction = new Float32Array(this.frameSize);
|
|
37
|
-
this.windowedBuffer = new Float32Array(this.frameSize);
|
|
38
|
-
this.shiftedBuffer = new Float32Array(this.frameSize);
|
|
39
|
-
/* initialize Hann window */
|
|
40
|
-
for (let i = 0; i < this.frameSize; i++)
|
|
41
|
-
this.windowFunction[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (this.frameSize - 1)));
|
|
42
|
-
}
|
|
43
|
-
/* static parameter descriptors */
|
|
44
|
-
static get parameterDescriptors() {
|
|
45
|
-
return [{
|
|
46
|
-
name: "shift",
|
|
47
|
-
defaultValue: 1.0,
|
|
48
|
-
minValue: 0.25,
|
|
49
|
-
maxValue: 4.0
|
|
50
|
-
}];
|
|
51
|
-
}
|
|
52
|
-
/* process audio frame */
|
|
53
|
-
process(inputs, outputs, parameters) {
|
|
54
|
-
/* get input and output arrays */
|
|
55
|
-
const input = inputs[0];
|
|
56
|
-
const output = outputs[0];
|
|
57
|
-
if (!input || !output || input.length === 0 || output.length === 0)
|
|
58
|
-
return true;
|
|
59
|
-
/* update shift parameter if provided */
|
|
60
|
-
const shiftParam = parameters.shift;
|
|
61
|
-
if (shiftParam && shiftParam.length > 0)
|
|
62
|
-
this.shift = shiftParam[0];
|
|
63
|
-
/* determine sizes */
|
|
64
|
-
const frameCount = input[0]?.length ?? 0;
|
|
65
|
-
const channelCount = Math.min(input.length, output.length);
|
|
66
|
-
if (frameCount === 0)
|
|
67
|
-
return true;
|
|
68
|
-
/* process each channel independently */
|
|
69
|
-
for (let ch = 0; ch < channelCount; ch++) {
|
|
70
|
-
const inputChannel = input[ch];
|
|
71
|
-
const outputChannel = output[ch];
|
|
72
|
-
/* bypass processing if no pitch shift needed */
|
|
73
|
-
/*
|
|
74
|
-
if (Math.abs(this.shift - 1.0) < 0.001) {
|
|
75
|
-
for (let i = 0; i < frameCount; i++)
|
|
76
|
-
outputChannel[i] = inputChannel[i]
|
|
77
|
-
continue
|
|
78
|
-
}
|
|
79
|
-
*/
|
|
80
|
-
/* process each sample */
|
|
81
|
-
for (let i = 0; i < frameCount; i++) {
|
|
82
|
-
/* accumulate input samples */
|
|
83
|
-
this.inputBuffer[this.inputPos++] = inputChannel[i];
|
|
84
|
-
/* process when we have enough input */
|
|
85
|
-
if (this.inputPos >= this.frameSize) {
|
|
86
|
-
this.processFrame();
|
|
87
|
-
/* shift input buffer by hop size */
|
|
88
|
-
for (let j = 0; j < this.frameSize - this.hopSize; j++)
|
|
89
|
-
this.inputBuffer[j] = this.inputBuffer[j + this.hopSize];
|
|
90
|
-
this.inputPos -= this.hopSize;
|
|
91
|
-
}
|
|
92
|
-
/* output processed samples */
|
|
93
|
-
if (this.outputPos < this.hopSize)
|
|
94
|
-
outputChannel[i] = this.outputBuffer[this.outputPos++];
|
|
95
|
-
else
|
|
96
|
-
outputChannel[i] = 0;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
/* process a single frame with pitch shifting */
|
|
102
|
-
processFrame() {
|
|
103
|
-
/* apply window to input */
|
|
104
|
-
for (let i = 0; i < this.frameSize; i++)
|
|
105
|
-
this.windowedBuffer[i] = this.inputBuffer[i] * this.windowFunction[i];
|
|
106
|
-
/* pitch shift using time-domain resampling */
|
|
107
|
-
const shifted = this.pitchShiftTimeDomain(this.windowedBuffer);
|
|
108
|
-
/* overlap-add synthesis - copy current overlap buffer to output */
|
|
109
|
-
for (let i = 0; i < this.hopSize; i++)
|
|
110
|
-
this.outputBuffer[i] = this.overlapBuffer[i];
|
|
111
|
-
/* add new frame contribution to overlap buffer */
|
|
112
|
-
for (let i = 0; i < this.frameSize; i++) {
|
|
113
|
-
if (i < this.hopSize)
|
|
114
|
-
this.outputBuffer[i] += shifted[i];
|
|
115
|
-
else
|
|
116
|
-
this.overlapBuffer[i - this.hopSize] = shifted[i];
|
|
117
|
-
}
|
|
118
|
-
/* reset output position */
|
|
119
|
-
this.outputPos = 0;
|
|
120
|
-
}
|
|
121
|
-
/* time-domain pitch shifting using resampling */
|
|
122
|
-
pitchShiftTimeDomain(frame) {
|
|
123
|
-
const output = this.shiftedBuffer;
|
|
124
|
-
if (Math.abs(this.shift - 1.0) < 0.001)
|
|
125
|
-
/* no pitch shift needed */
|
|
126
|
-
output.set(frame);
|
|
127
|
-
else {
|
|
128
|
-
/* resample with linear interpolation */
|
|
129
|
-
const stretchFactor = 1.0 / this.shift;
|
|
130
|
-
for (let i = 0; i < this.frameSize; i++) {
|
|
131
|
-
const sourcePos = i * stretchFactor;
|
|
132
|
-
const idx0 = Math.floor(sourcePos);
|
|
133
|
-
const idx1 = Math.min(idx0 + 1, this.frameSize - 1);
|
|
134
|
-
const frac = sourcePos - idx0;
|
|
135
|
-
if (idx0 < this.frameSize)
|
|
136
|
-
output[i] = frame[idx0] * (1 - frac) + frame[idx1] * frac;
|
|
137
|
-
else
|
|
138
|
-
output[i] = 0;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/* apply window to output */
|
|
142
|
-
for (let i = 0; i < this.frameSize; i++)
|
|
143
|
-
output[i] *= this.windowFunction[i];
|
|
144
|
-
return output;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/* register the processor */
|
|
148
|
-
registerProcessor("pitch-shifter", PitchShifterProcessor);
|
|
149
|
-
//# sourceMappingURL=speechflow-node-a2a-pitch2-wt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2a-pitch2-wt.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-pitch2-wt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import SpeechFlowNode from "./speechflow-node";
|
|
2
|
-
export default class SpeechFlowNodeA2APitch2 extends SpeechFlowNode {
|
|
3
|
-
static name: string;
|
|
4
|
-
private closing;
|
|
5
|
-
private pitchShifter;
|
|
6
|
-
constructor(id: string, cfg: {
|
|
7
|
-
[id: string]: any;
|
|
8
|
-
}, opts: {
|
|
9
|
-
[id: string]: any;
|
|
10
|
-
}, args: any[]);
|
|
11
|
-
open(): Promise<void>;
|
|
12
|
-
close(): Promise<void>;
|
|
13
|
-
}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
** SpeechFlow - Speech Processing Flow Graph
|
|
4
|
-
** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
|
-
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
-
};
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
/* standard dependencies */
|
|
45
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
46
|
-
const node_stream_1 = __importDefault(require("node:stream"));
|
|
47
|
-
/* external dependencies */
|
|
48
|
-
const node_web_audio_api_1 = require("node-web-audio-api");
|
|
49
|
-
/* internal dependencies */
|
|
50
|
-
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
51
|
-
const util = __importStar(require("./speechflow-util"));
|
|
52
|
-
/* audio pitch shifter class using WebAudio */
|
|
53
|
-
class AudioPitchShifter extends util.WebAudio {
|
|
54
|
-
/* internal state */
|
|
55
|
-
pitchNode = null;
|
|
56
|
-
config;
|
|
57
|
-
/* construct object */
|
|
58
|
-
constructor(sampleRate, channels, config = {}) {
|
|
59
|
-
super(sampleRate, channels);
|
|
60
|
-
this.config = {
|
|
61
|
-
shift: config.shift ?? 1.0,
|
|
62
|
-
frameSize: config.frameSize ?? 2048,
|
|
63
|
-
overlap: config.overlap ?? 0.5
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
/* setup object */
|
|
67
|
-
async setup() {
|
|
68
|
-
await super.setup();
|
|
69
|
-
/* add pitch shifter worklet module */
|
|
70
|
-
const url = node_path_1.default.resolve(__dirname, "speechflow-node-a2a-pitch2-wt.js");
|
|
71
|
-
await this.audioContext.audioWorklet.addModule(url);
|
|
72
|
-
/* create pitch shifter worklet node */
|
|
73
|
-
this.pitchNode = new node_web_audio_api_1.AudioWorkletNode(this.audioContext, "pitch-shifter", {
|
|
74
|
-
numberOfInputs: 1,
|
|
75
|
-
numberOfOutputs: 1,
|
|
76
|
-
outputChannelCount: [this.channels],
|
|
77
|
-
processorOptions: {
|
|
78
|
-
shift: this.config.shift,
|
|
79
|
-
frameSize: this.config.frameSize,
|
|
80
|
-
overlap: this.config.overlap
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
/* connect nodes: source -> pitch -> capture */
|
|
84
|
-
this.sourceNode.connect(this.pitchNode);
|
|
85
|
-
this.pitchNode.connect(this.captureNode);
|
|
86
|
-
/* configure initial pitch shift */
|
|
87
|
-
const currentTime = this.audioContext.currentTime;
|
|
88
|
-
const params = this.pitchNode.parameters;
|
|
89
|
-
params.get("shift")?.setValueAtTime(this.config.shift, currentTime);
|
|
90
|
-
}
|
|
91
|
-
/* update pitch shift value */
|
|
92
|
-
setShift(shift) {
|
|
93
|
-
if (this.pitchNode !== null) {
|
|
94
|
-
const currentTime = this.audioContext.currentTime;
|
|
95
|
-
const params = this.pitchNode.parameters;
|
|
96
|
-
params.get("shift")?.setTargetAtTime(shift, currentTime, 0.01);
|
|
97
|
-
}
|
|
98
|
-
this.config.shift = shift;
|
|
99
|
-
}
|
|
100
|
-
/* destroy the pitch shifter */
|
|
101
|
-
async destroy() {
|
|
102
|
-
/* disconnect pitch node */
|
|
103
|
-
if (this.pitchNode !== null) {
|
|
104
|
-
this.pitchNode.disconnect();
|
|
105
|
-
this.pitchNode = null;
|
|
106
|
-
}
|
|
107
|
-
/* destroy parent */
|
|
108
|
-
await super.destroy();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/* SpeechFlow node for pitch adjustment using WebAudio */
|
|
112
|
-
class SpeechFlowNodeA2APitch2 extends speechflow_node_1.default {
|
|
113
|
-
/* declare official node name */
|
|
114
|
-
static name = "a2a-pitch2";
|
|
115
|
-
/* internal state */
|
|
116
|
-
closing = false;
|
|
117
|
-
pitchShifter = null;
|
|
118
|
-
/* construct node */
|
|
119
|
-
constructor(id, cfg, opts, args) {
|
|
120
|
-
super(id, cfg, opts, args);
|
|
121
|
-
/* declare node configuration parameters */
|
|
122
|
-
this.configure({
|
|
123
|
-
shift: { type: "number", val: 1.0, match: (n) => n >= 0.25 && n <= 4.0 },
|
|
124
|
-
frameSize: { type: "number", val: 2048, match: (n) => n >= 256 && n <= 8192 && (n & (n - 1)) === 0 },
|
|
125
|
-
overlap: { type: "number", val: 0.5, match: (n) => n >= 0.0 && n <= 0.9 }
|
|
126
|
-
});
|
|
127
|
-
/* declare node input/output format */
|
|
128
|
-
this.input = "audio";
|
|
129
|
-
this.output = "audio";
|
|
130
|
-
}
|
|
131
|
-
/* open node */
|
|
132
|
-
async open() {
|
|
133
|
-
/* clear destruction flag */
|
|
134
|
-
this.closing = false;
|
|
135
|
-
/* setup pitch shifter */
|
|
136
|
-
this.pitchShifter = new AudioPitchShifter(this.config.audioSampleRate, this.config.audioChannels, {
|
|
137
|
-
shift: this.params.shift,
|
|
138
|
-
frameSize: this.params.frameSize,
|
|
139
|
-
overlap: this.params.overlap
|
|
140
|
-
});
|
|
141
|
-
await this.pitchShifter.setup();
|
|
142
|
-
/* establish a transform stream */
|
|
143
|
-
const self = this;
|
|
144
|
-
this.stream = new node_stream_1.default.Transform({
|
|
145
|
-
readableObjectMode: true,
|
|
146
|
-
writableObjectMode: true,
|
|
147
|
-
decodeStrings: false,
|
|
148
|
-
transform(chunk, encoding, callback) {
|
|
149
|
-
if (self.closing) {
|
|
150
|
-
callback(new Error("stream already destroyed"));
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (!Buffer.isBuffer(chunk.payload))
|
|
154
|
-
callback(new Error("invalid chunk payload type"));
|
|
155
|
-
else {
|
|
156
|
-
/* shift pitch of audio chunk */
|
|
157
|
-
const payload = util.convertBufToI16(chunk.payload, self.config.audioLittleEndian);
|
|
158
|
-
self.pitchShifter?.process(payload).then((result) => {
|
|
159
|
-
if (self.closing)
|
|
160
|
-
throw new Error("stream already destroyed");
|
|
161
|
-
/* take over pitch-shifted data */
|
|
162
|
-
const outputPayload = util.convertI16ToBuf(result, self.config.audioLittleEndian);
|
|
163
|
-
/* final check before pushing to avoid race condition */
|
|
164
|
-
if (self.closing)
|
|
165
|
-
throw new Error("stream already destroyed");
|
|
166
|
-
chunk.payload = outputPayload;
|
|
167
|
-
this.push(chunk);
|
|
168
|
-
callback();
|
|
169
|
-
}).catch((error) => {
|
|
170
|
-
if (!self.closing)
|
|
171
|
-
callback(util.ensureError(error, "pitch shifting failed"));
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
final(callback) {
|
|
176
|
-
if (self.closing) {
|
|
177
|
-
callback();
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
this.push(null);
|
|
181
|
-
callback();
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
/* close node */
|
|
186
|
-
async close() {
|
|
187
|
-
/* indicate closing */
|
|
188
|
-
this.closing = true;
|
|
189
|
-
/* destroy pitch shifter */
|
|
190
|
-
if (this.pitchShifter !== null) {
|
|
191
|
-
await this.pitchShifter.destroy();
|
|
192
|
-
this.pitchShifter = null;
|
|
193
|
-
}
|
|
194
|
-
/* shutdown stream */
|
|
195
|
-
if (this.stream !== null) {
|
|
196
|
-
await util.destroyStream(this.stream);
|
|
197
|
-
this.stream = null;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
exports.default = SpeechFlowNodeA2APitch2;
|
|
202
|
-
//# sourceMappingURL=speechflow-node-a2a-pitch2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2a-pitch2.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-pitch2.ts"],"names":[],"mappings":"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"}
|