@kajidog/voicevox-client 0.4.1 → 0.6.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/LICENSE +14 -14
- package/dist/accent-utils.d.ts +93 -0
- package/dist/accent-utils.d.ts.map +1 -0
- package/dist/accent-utils.js +211 -0
- package/dist/accent-utils.js.map +1 -0
- package/dist/api.d.ts +40 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -1
- package/dist/cache-policy.d.ts +21 -0
- package/dist/cache-policy.d.ts.map +1 -0
- package/dist/cache-policy.js +31 -0
- package/dist/cache-policy.js.map +1 -0
- package/dist/client.d.ts +28 -119
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +48 -417
- package/dist/client.js.map +1 -1
- package/dist/effect/config.d.ts +43 -0
- package/dist/effect/config.d.ts.map +1 -0
- package/dist/effect/config.js +45 -0
- package/dist/effect/config.js.map +1 -0
- package/dist/effect/context.d.ts +33 -0
- package/dist/effect/context.d.ts.map +1 -0
- package/dist/effect/context.js +10 -0
- package/dist/effect/context.js.map +1 -0
- package/dist/effect/errors.d.ts +130 -0
- package/dist/effect/errors.d.ts.map +1 -0
- package/dist/effect/errors.js +121 -0
- package/dist/effect/errors.js.map +1 -0
- package/dist/effect/index.d.ts +34 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +67 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/queue-manager.d.ts +34 -0
- package/dist/effect/queue-manager.d.ts.map +1 -0
- package/dist/effect/queue-manager.js +59 -0
- package/dist/effect/queue-manager.js.map +1 -0
- package/dist/effect/services/api-service.d.ts +58 -0
- package/dist/effect/services/api-service.d.ts.map +1 -0
- package/dist/effect/services/api-service.js +90 -0
- package/dist/effect/services/api-service.js.map +1 -0
- package/dist/effect/services/audio-generator-service.d.ts +78 -0
- package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
- package/dist/effect/services/audio-generator-service.js +187 -0
- package/dist/effect/services/audio-generator-service.js.map +1 -0
- package/dist/effect/services/audio-player-service.d.ts +101 -0
- package/dist/effect/services/audio-player-service.d.ts.map +1 -0
- package/dist/effect/services/audio-player-service.js +297 -0
- package/dist/effect/services/audio-player-service.js.map +1 -0
- package/dist/effect/services/event-manager-service.d.ts +96 -0
- package/dist/effect/services/event-manager-service.d.ts.map +1 -0
- package/dist/effect/services/event-manager-service.js +208 -0
- package/dist/effect/services/event-manager-service.js.map +1 -0
- package/dist/effect/services/file-manager-service.d.ts +91 -0
- package/dist/effect/services/file-manager-service.d.ts.map +1 -0
- package/dist/effect/services/file-manager-service.js +215 -0
- package/dist/effect/services/file-manager-service.js.map +1 -0
- package/dist/effect/utils.d.ts +118 -0
- package/dist/effect/utils.d.ts.map +1 -0
- package/dist/effect/utils.js +186 -0
- package/dist/effect/utils.js.map +1 -0
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/playback/node-playback-strategy.d.ts.map +1 -1
- package/dist/playback/node-playback-strategy.js +2 -6
- package/dist/playback/node-playback-strategy.js.map +1 -1
- package/dist/player.d.ts +110 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/player.js +183 -0
- package/dist/player.js.map +1 -0
- package/dist/queue/audio-player.d.ts +44 -0
- package/dist/queue/audio-player.d.ts.map +1 -0
- package/dist/queue/audio-player.js +344 -0
- package/dist/queue/audio-player.js.map +1 -0
- package/dist/queue/file-manager.js +9 -9
- package/dist/queue/file-manager.js.map +1 -1
- package/dist/queue/manager.d.ts +134 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.js +564 -0
- package/dist/queue/manager.js.map +1 -0
- package/dist/queue/queue-service.d.ts.map +1 -1
- package/dist/queue/queue-service.js +20 -6
- package/dist/queue/queue-service.js.map +1 -1
- package/dist/queue/types.d.ts +3 -1
- package/dist/queue/types.d.ts.map +1 -1
- package/dist/queue/types.js.map +1 -1
- package/dist/services/dictionary-service.d.ts +35 -0
- package/dist/services/dictionary-service.d.ts.map +1 -0
- package/dist/services/dictionary-service.js +188 -0
- package/dist/services/dictionary-service.js.map +1 -0
- package/dist/services/speech-service.d.ts +43 -0
- package/dist/services/speech-service.d.ts.map +1 -0
- package/dist/services/speech-service.js +236 -0
- package/dist/services/speech-service.js.map +1 -0
- package/dist/shared-queue-manager.d.ts +119 -0
- package/dist/shared-queue-manager.d.ts.map +1 -0
- package/dist/shared-queue-manager.js +487 -0
- package/dist/shared-queue-manager.js.map +1 -0
- package/dist/state/queue-state-machine.d.ts.map +1 -1
- package/dist/state/queue-state-machine.js +13 -0
- package/dist/state/queue-state-machine.js.map +1 -1
- package/dist/state/types.d.ts +2 -0
- package/dist/state/types.d.ts.map +1 -1
- package/dist/state/types.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +36 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect-based VoicevoxApi service implementation
|
|
3
|
+
* Provides structured error handling and resource management for VOICEVOX API operations
|
|
4
|
+
*/
|
|
5
|
+
import { Effect, Layer } from 'effect';
|
|
6
|
+
import { VoicevoxApi } from '../../api';
|
|
7
|
+
import type { AudioQuery, Speaker } from '../../types';
|
|
8
|
+
import { type VoicevoxApiService } from '../context';
|
|
9
|
+
import { type ApiConnectionError, type QueryGenerationError, type SynthesisError } from '../errors';
|
|
10
|
+
/**
|
|
11
|
+
* Effect-based implementation of VoicevoxApi service
|
|
12
|
+
*/
|
|
13
|
+
export declare class EffectVoicevoxApiService implements VoicevoxApiService {
|
|
14
|
+
private readonly api;
|
|
15
|
+
constructor(api: VoicevoxApi);
|
|
16
|
+
getApi(): VoicevoxApi;
|
|
17
|
+
/**
|
|
18
|
+
* Generate audio query from text with Effect-based error handling
|
|
19
|
+
*/
|
|
20
|
+
generateQuery: (text: string, speaker?: number) => Effect.Effect<AudioQuery, QueryGenerationError>;
|
|
21
|
+
/**
|
|
22
|
+
* Synthesize audio from query with Effect-based error handling
|
|
23
|
+
*/
|
|
24
|
+
synthesize: (query: AudioQuery, speaker?: number) => Effect.Effect<ArrayBuffer, SynthesisError>;
|
|
25
|
+
/**
|
|
26
|
+
* Generate audio query from preset with Effect-based error handling
|
|
27
|
+
*/
|
|
28
|
+
generateQueryFromPreset: (text: string, presetId: number, coreVersion?: string) => Effect.Effect<AudioQuery, QueryGenerationError>;
|
|
29
|
+
/**
|
|
30
|
+
* Get speakers list with Effect-based error handling
|
|
31
|
+
*/
|
|
32
|
+
getSpeakers: () => Effect.Effect<Speaker[], ApiConnectionError>;
|
|
33
|
+
/**
|
|
34
|
+
* Get speaker info with Effect-based error handling
|
|
35
|
+
*/
|
|
36
|
+
getSpeakerInfo: (uuid: string) => Effect.Effect<Speaker, ApiConnectionError>;
|
|
37
|
+
/**
|
|
38
|
+
* Combined operation: generate query and synthesize in one Effect workflow
|
|
39
|
+
*/
|
|
40
|
+
generateAndSynthesize: (text: string, speaker?: number) => Effect.Effect<ArrayBuffer, QueryGenerationError | SynthesisError>;
|
|
41
|
+
/**
|
|
42
|
+
* Health check operation to verify API connectivity
|
|
43
|
+
*/
|
|
44
|
+
healthCheck: () => Effect.Effect<boolean, never>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create VoicevoxApi service instance from base URL
|
|
48
|
+
*/
|
|
49
|
+
export declare const makeVoicevoxApiService: (baseUrl: string) => Effect.Effect<VoicevoxApiService, never>;
|
|
50
|
+
/**
|
|
51
|
+
* Layer providing VoicevoxApi service from configuration
|
|
52
|
+
*/
|
|
53
|
+
export declare const VoicevoxApiServiceLive: (baseUrl: string) => Layer.Layer<VoicevoxApiService, never, never>;
|
|
54
|
+
/**
|
|
55
|
+
* Layer providing VoicevoxApi service with default configuration
|
|
56
|
+
*/
|
|
57
|
+
export declare const VoicevoxApiServiceDefault: Layer.Layer<VoicevoxApiService, never, never>;
|
|
58
|
+
//# sourceMappingURL=api-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-service.d.ts","sourceRoot":"","sources":["../../../src/effect/services/api-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAW,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EAMpB,MAAM,WAAW,CAAA;AAGlB;;GAEG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,WAAW;IAE7C,MAAM,IAAI,WAAW;IAIrB;;OAEG;IACH,aAAa,GAAI,MAAM,MAAM,EAAE,gBAAW,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAWzF;IAEH;;OAEG;IACH,UAAU,GAAI,OAAO,UAAU,EAAE,gBAAW,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAWtF;IAEH;;OAEG;IACH,uBAAuB,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,cAAc,MAAM,KACnB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAW/C;IAEH;;OAEG;IACH,WAAW,QAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAW3D;IAEH;;OAEG;IACH,cAAc,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAWxE;IAEH;;OAEG;IACH,qBAAqB,GACnB,MAAM,MAAM,EACZ,gBAAW,KACV,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,GAAG,cAAc,CAAC,CAWnE;IAED;;OAEG;IACH,WAAW,QAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAU9C;CACF;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAI5F,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,KAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAClC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,yBAAyB,+CAAmD,CAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect-based VoicevoxApi service implementation
|
|
4
|
+
* Provides structured error handling and resource management for VOICEVOX API operations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.VoicevoxApiServiceDefault = exports.VoicevoxApiServiceLive = exports.makeVoicevoxApiService = exports.EffectVoicevoxApiService = void 0;
|
|
8
|
+
const effect_1 = require("effect");
|
|
9
|
+
const api_1 = require("../../api");
|
|
10
|
+
const context_1 = require("../context");
|
|
11
|
+
const errors_1 = require("../errors");
|
|
12
|
+
const utils_1 = require("../utils");
|
|
13
|
+
/**
|
|
14
|
+
* Effect-based implementation of VoicevoxApi service
|
|
15
|
+
*/
|
|
16
|
+
class EffectVoicevoxApiService {
|
|
17
|
+
constructor(api) {
|
|
18
|
+
this.api = api;
|
|
19
|
+
/**
|
|
20
|
+
* Generate audio query from text with Effect-based error handling
|
|
21
|
+
*/
|
|
22
|
+
this.generateQuery = (text, speaker = 1) => (0, utils_1.logTimed)(`generateQuery-speaker-${speaker}`, (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.api.generateQuery(text, speaker), (error) => (0, errors_1.makeQueryGenerationError)('Failed to generate audio query', text, speaker, error)), 3, // max retries
|
|
23
|
+
1000 // base delay 1s
|
|
24
|
+
));
|
|
25
|
+
/**
|
|
26
|
+
* Synthesize audio from query with Effect-based error handling
|
|
27
|
+
*/
|
|
28
|
+
this.synthesize = (query, speaker = 1) => (0, utils_1.logTimed)(`synthesize-speaker-${speaker}`, (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.api.synthesize(query, speaker), (error) => (0, errors_1.makeSynthesisError)('Failed to synthesize audio', speaker, error)), 2, // fewer retries for synthesis
|
|
29
|
+
2000 // longer base delay 2s
|
|
30
|
+
));
|
|
31
|
+
/**
|
|
32
|
+
* Generate audio query from preset with Effect-based error handling
|
|
33
|
+
*/
|
|
34
|
+
this.generateQueryFromPreset = (text, presetId, coreVersion) => (0, utils_1.logTimed)(`generateQueryFromPreset-${presetId}`, (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.api.generateQueryFromPreset(text, presetId, coreVersion), (error) => (0, errors_1.makeQueryGenerationError)('Failed to generate query from preset', text, presetId, error)), 3, 1000));
|
|
35
|
+
/**
|
|
36
|
+
* Get speakers list with Effect-based error handling
|
|
37
|
+
*/
|
|
38
|
+
this.getSpeakers = () => (0, utils_1.logTimed)('getSpeakers', (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.api.getSpeakers(), (error) => (0, errors_1.makeApiConnectionError)('Failed to get speakers list', undefined, error)), 3, 1000));
|
|
39
|
+
/**
|
|
40
|
+
* Get speaker info with Effect-based error handling
|
|
41
|
+
*/
|
|
42
|
+
this.getSpeakerInfo = (uuid) => (0, utils_1.logTimed)(`getSpeakerInfo-${uuid}`, (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.api.getSpeakerInfo(uuid), (error) => (0, errors_1.makeApiConnectionError)('Failed to get speaker info', uuid, error)), 3, 1000));
|
|
43
|
+
/**
|
|
44
|
+
* Combined operation: generate query and synthesize in one Effect workflow
|
|
45
|
+
*/
|
|
46
|
+
this.generateAndSynthesize = (text, speaker = 1) => {
|
|
47
|
+
const self = this;
|
|
48
|
+
return effect_1.Effect.gen(function* () {
|
|
49
|
+
// Generate query first
|
|
50
|
+
const query = yield* self.generateQuery(text, speaker);
|
|
51
|
+
// Then synthesize audio
|
|
52
|
+
const audioData = yield* self.synthesize(query, speaker);
|
|
53
|
+
return audioData;
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Health check operation to verify API connectivity
|
|
58
|
+
*/
|
|
59
|
+
this.healthCheck = () => {
|
|
60
|
+
const self = this;
|
|
61
|
+
return effect_1.Effect.gen(function* () {
|
|
62
|
+
// Try to get speakers as a health check
|
|
63
|
+
const result = yield* self.getSpeakers().pipe(effect_1.Effect.map(() => true), effect_1.Effect.catchAll(() => effect_1.Effect.succeed(false)));
|
|
64
|
+
return result;
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
getApi() {
|
|
69
|
+
return this.api;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.EffectVoicevoxApiService = EffectVoicevoxApiService;
|
|
73
|
+
/**
|
|
74
|
+
* Create VoicevoxApi service instance from base URL
|
|
75
|
+
*/
|
|
76
|
+
const makeVoicevoxApiService = (baseUrl) => effect_1.Effect.sync(() => {
|
|
77
|
+
const api = new api_1.VoicevoxApi(baseUrl);
|
|
78
|
+
return new EffectVoicevoxApiService(api);
|
|
79
|
+
});
|
|
80
|
+
exports.makeVoicevoxApiService = makeVoicevoxApiService;
|
|
81
|
+
/**
|
|
82
|
+
* Layer providing VoicevoxApi service from configuration
|
|
83
|
+
*/
|
|
84
|
+
const VoicevoxApiServiceLive = (baseUrl) => effect_1.Layer.effect(context_1.VoicevoxApiContext, (0, exports.makeVoicevoxApiService)(baseUrl));
|
|
85
|
+
exports.VoicevoxApiServiceLive = VoicevoxApiServiceLive;
|
|
86
|
+
/**
|
|
87
|
+
* Layer providing VoicevoxApi service with default configuration
|
|
88
|
+
*/
|
|
89
|
+
exports.VoicevoxApiServiceDefault = (0, exports.VoicevoxApiServiceLive)('http://localhost:50021');
|
|
90
|
+
//# sourceMappingURL=api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-service.js","sourceRoot":"","sources":["../../../src/effect/services/api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect-based AudioGenerator service implementation
|
|
3
|
+
* Provides structured error handling and resource management for audio generation
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer } from 'effect';
|
|
6
|
+
import { AudioGenerator } from '../../queue/audio-generator';
|
|
7
|
+
import type { AudioQuery } from '../../types';
|
|
8
|
+
import { type AudioGeneratorService, type EffectFileManagerService, type QueueItemData, type VoicevoxApiService } from '../context';
|
|
9
|
+
import { type FileOperationError, type QueryGenerationError, type SynthesisError } from '../errors';
|
|
10
|
+
/**
|
|
11
|
+
* Enhanced AudioGenerator service with Effect-based operations
|
|
12
|
+
*/
|
|
13
|
+
export interface EffectAudioGeneratorService extends AudioGeneratorService {
|
|
14
|
+
readonly generateQueryEffect: (text: string, speaker: number) => Effect.Effect<AudioQuery, QueryGenerationError>;
|
|
15
|
+
readonly generateAudioEffect: (item: QueueItemData, updateStatus: (item: QueueItemData, status: string) => Effect.Effect<void, never>) => Effect.Effect<QueueItemData, QueryGenerationError | SynthesisError | FileOperationError, VoicevoxApiService | EffectFileManagerService>;
|
|
16
|
+
readonly generateAudioFromQueryEffect: (item: QueueItemData, updateStatus: (item: QueueItemData, status: string) => Effect.Effect<void, never>) => Effect.Effect<QueueItemData, SynthesisError | FileOperationError, VoicevoxApiService | EffectFileManagerService>;
|
|
17
|
+
readonly healthCheck: () => Effect.Effect<boolean, never>;
|
|
18
|
+
}
|
|
19
|
+
export declare const EffectAudioGeneratorContext: Context.Tag<EffectAudioGeneratorService, EffectAudioGeneratorService>;
|
|
20
|
+
/**
|
|
21
|
+
* Effect-based implementation of AudioGenerator service
|
|
22
|
+
*/
|
|
23
|
+
export declare class EffectAudioGeneratorServiceImpl implements EffectAudioGeneratorService {
|
|
24
|
+
private readonly audioGenerator;
|
|
25
|
+
constructor(audioGenerator: AudioGenerator);
|
|
26
|
+
/**
|
|
27
|
+
* Traditional generateQuery method (Promise-based)
|
|
28
|
+
*/
|
|
29
|
+
generateQuery: (text: string, speaker: number) => Promise<any>;
|
|
30
|
+
/**
|
|
31
|
+
* Traditional generateAudioFromQuery method (Promise-based)
|
|
32
|
+
*/
|
|
33
|
+
generateAudioFromQuery: (item: any, statusCallback: (item: any, status: string) => void) => Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Traditional generateAudio method (Promise-based)
|
|
36
|
+
*/
|
|
37
|
+
generateAudio: (item: any, statusCallback: (item: any, status: string) => void) => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Generate audio query with Effect-based error handling
|
|
40
|
+
*/
|
|
41
|
+
generateQueryEffect: (text: string, speaker: number) => Effect.Effect<AudioQuery, QueryGenerationError>;
|
|
42
|
+
/**
|
|
43
|
+
* Generate audio from text with Effect-based workflow
|
|
44
|
+
*/
|
|
45
|
+
generateAudioEffect: (item: QueueItemData, updateStatus: (item: QueueItemData, status: string) => Effect.Effect<void, never>) => Effect.Effect<QueueItemData, QueryGenerationError | SynthesisError | FileOperationError, VoicevoxApiService | EffectFileManagerService>;
|
|
46
|
+
/**
|
|
47
|
+
* Generate audio from existing query with Effect-based workflow
|
|
48
|
+
*/
|
|
49
|
+
generateAudioFromQueryEffect: (item: QueueItemData, updateStatus: (item: QueueItemData, status: string) => Effect.Effect<void, never>) => Effect.Effect<QueueItemData, SynthesisError | FileOperationError, VoicevoxApiService | EffectFileManagerService>;
|
|
50
|
+
/**
|
|
51
|
+
* Health check to verify audio generation capabilities
|
|
52
|
+
*/
|
|
53
|
+
healthCheck: () => Effect.Effect<boolean, never>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create AudioGenerator service instance
|
|
57
|
+
*/
|
|
58
|
+
export declare const makeEffectAudioGeneratorService: () => Effect.Effect<EffectAudioGeneratorService, never, VoicevoxApiService | EffectFileManagerService>;
|
|
59
|
+
/**
|
|
60
|
+
* Layer providing Effect AudioGenerator service
|
|
61
|
+
*/
|
|
62
|
+
export declare const EffectAudioGeneratorServiceLive: Layer.Layer<EffectAudioGeneratorService, never, VoicevoxApiService | EffectFileManagerService>;
|
|
63
|
+
/**
|
|
64
|
+
* Scoped layer that automatically manages resources
|
|
65
|
+
*/
|
|
66
|
+
export declare const EffectAudioGeneratorServiceScoped: Layer.Layer<EffectAudioGeneratorService, never, any>;
|
|
67
|
+
/**
|
|
68
|
+
* Helper functions for audio generation workflows
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Batch generate audio from multiple text inputs
|
|
72
|
+
*/
|
|
73
|
+
export declare const batchGenerateAudio: (texts: readonly string[], speaker: number, concurrency?: number) => Effect.Effect<readonly ArrayBuffer[], QueryGenerationError | SynthesisError, VoicevoxApiService>;
|
|
74
|
+
/**
|
|
75
|
+
* Generate audio with custom preprocessing
|
|
76
|
+
*/
|
|
77
|
+
export declare const generateAudioWithPreprocessing: (text: string, speaker: number, preprocessor: (query: AudioQuery) => AudioQuery) => Effect.Effect<ArrayBuffer, QueryGenerationError | SynthesisError, VoicevoxApiService>;
|
|
78
|
+
//# sourceMappingURL=audio-generator-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-generator-service.d.ts","sourceRoot":"","sources":["../../../src/effect/services/audio-generator-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect-based AudioGenerator service implementation
|
|
4
|
+
* Provides structured error handling and resource management for audio generation
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateAudioWithPreprocessing = exports.batchGenerateAudio = exports.EffectAudioGeneratorServiceScoped = exports.EffectAudioGeneratorServiceLive = exports.makeEffectAudioGeneratorService = exports.EffectAudioGeneratorServiceImpl = exports.EffectAudioGeneratorContext = void 0;
|
|
8
|
+
const effect_1 = require("effect");
|
|
9
|
+
const audio_generator_1 = require("../../queue/audio-generator");
|
|
10
|
+
const context_1 = require("../context");
|
|
11
|
+
const errors_1 = require("../errors");
|
|
12
|
+
const utils_1 = require("../utils");
|
|
13
|
+
exports.EffectAudioGeneratorContext = effect_1.Context.GenericTag('@voicevox/EffectAudioGenerator');
|
|
14
|
+
/**
|
|
15
|
+
* Effect-based implementation of AudioGenerator service
|
|
16
|
+
*/
|
|
17
|
+
class EffectAudioGeneratorServiceImpl {
|
|
18
|
+
constructor(audioGenerator) {
|
|
19
|
+
this.audioGenerator = audioGenerator;
|
|
20
|
+
/**
|
|
21
|
+
* Traditional generateQuery method (Promise-based)
|
|
22
|
+
*/
|
|
23
|
+
this.generateQuery = (text, speaker) => this.audioGenerator.generateQuery(text, speaker);
|
|
24
|
+
/**
|
|
25
|
+
* Traditional generateAudioFromQuery method (Promise-based)
|
|
26
|
+
*/
|
|
27
|
+
this.generateAudioFromQuery = (item, statusCallback) => this.audioGenerator.generateAudioFromQuery(item, statusCallback);
|
|
28
|
+
/**
|
|
29
|
+
* Traditional generateAudio method (Promise-based)
|
|
30
|
+
*/
|
|
31
|
+
this.generateAudio = (item, statusCallback) => this.audioGenerator.generateAudio(item, statusCallback);
|
|
32
|
+
/**
|
|
33
|
+
* Generate audio query with Effect-based error handling
|
|
34
|
+
*/
|
|
35
|
+
this.generateQueryEffect = (text, speaker) => (0, utils_1.logTimed)(`generateQueryEffect-speaker-${speaker}`, (0, errors_1.retryWithBackoff)((0, errors_1.safeAsync)(() => this.audioGenerator.generateQuery(text, speaker), (error) => (0, errors_1.makeQueryGenerationError)('Failed to generate audio query in audio generator', text, speaker, error)), 3, // max retries
|
|
36
|
+
1000 // base delay 1s
|
|
37
|
+
));
|
|
38
|
+
/**
|
|
39
|
+
* Generate audio from text with Effect-based workflow
|
|
40
|
+
*/
|
|
41
|
+
this.generateAudioEffect = (item, updateStatus) => {
|
|
42
|
+
const self = this;
|
|
43
|
+
return (0, utils_1.logTimed)(`generateAudioEffect-${item.id}`, effect_1.Effect.gen(function* () {
|
|
44
|
+
// Check if item is in correct status
|
|
45
|
+
if (item.status !== 'pending') {
|
|
46
|
+
return item;
|
|
47
|
+
}
|
|
48
|
+
// Update status to generating
|
|
49
|
+
yield* updateStatus(item, 'generating');
|
|
50
|
+
// Generate query
|
|
51
|
+
const query = yield* self.generateQueryEffect(item.text, item.speaker);
|
|
52
|
+
// Get services from context
|
|
53
|
+
const apiService = yield* context_1.VoicevoxApiContext;
|
|
54
|
+
const fileService = yield* context_1.EffectFileManagerContext;
|
|
55
|
+
// Synthesize audio
|
|
56
|
+
const audioData = yield* (0, errors_1.safeAsync)(() => apiService.getApi().synthesize(query, item.speaker), (error) => (0, errors_1.makeSynthesisError)('Failed to synthesize audio in audio generator', item.speaker, error));
|
|
57
|
+
// Save to temporary file
|
|
58
|
+
const tempFile = yield* fileService.saveTempAudioFile(audioData);
|
|
59
|
+
// Update item with generated data
|
|
60
|
+
const updatedItem = {
|
|
61
|
+
...item,
|
|
62
|
+
query,
|
|
63
|
+
tempFile,
|
|
64
|
+
status: 'ready',
|
|
65
|
+
};
|
|
66
|
+
// Update status to ready
|
|
67
|
+
yield* updateStatus(updatedItem, 'ready');
|
|
68
|
+
return updatedItem;
|
|
69
|
+
}));
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Generate audio from existing query with Effect-based workflow
|
|
73
|
+
*/
|
|
74
|
+
this.generateAudioFromQueryEffect = (item, updateStatus) => {
|
|
75
|
+
return (0, utils_1.logTimed)(`generateAudioFromQueryEffect-${item.id}`, effect_1.Effect.gen(function* () {
|
|
76
|
+
// Check if item is in correct status and has query
|
|
77
|
+
if (item.status !== 'pending' || !item.query) {
|
|
78
|
+
return item;
|
|
79
|
+
}
|
|
80
|
+
// Update status to generating
|
|
81
|
+
yield* updateStatus(item, 'generating');
|
|
82
|
+
// Get services from context
|
|
83
|
+
const apiService = yield* context_1.VoicevoxApiContext;
|
|
84
|
+
const fileService = yield* context_1.EffectFileManagerContext;
|
|
85
|
+
// Synthesize audio from existing query
|
|
86
|
+
const audioData = yield* (0, errors_1.safeAsync)(() => apiService.getApi().synthesize(item.query, item.speaker), (error) => (0, errors_1.makeSynthesisError)('Failed to synthesize audio from query in audio generator', item.speaker, error));
|
|
87
|
+
// Save to temporary file
|
|
88
|
+
const tempFile = yield* fileService.saveTempAudioFile(audioData);
|
|
89
|
+
// Update item with generated data
|
|
90
|
+
const updatedItem = {
|
|
91
|
+
...item,
|
|
92
|
+
tempFile,
|
|
93
|
+
status: 'ready',
|
|
94
|
+
};
|
|
95
|
+
// Update status to ready
|
|
96
|
+
yield* updateStatus(updatedItem, 'ready');
|
|
97
|
+
return updatedItem;
|
|
98
|
+
}));
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Health check to verify audio generation capabilities
|
|
102
|
+
*/
|
|
103
|
+
this.healthCheck = () => {
|
|
104
|
+
const self = this;
|
|
105
|
+
return (0, utils_1.logTimed)('audioGeneratorHealthCheck', effect_1.Effect.gen(function* () {
|
|
106
|
+
// Try to generate a simple query as health check
|
|
107
|
+
const result = yield* self.generateQueryEffect('テスト', 1).pipe(effect_1.Effect.map(() => true), effect_1.Effect.catchAll(() => effect_1.Effect.succeed(false)));
|
|
108
|
+
return result;
|
|
109
|
+
}));
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.EffectAudioGeneratorServiceImpl = EffectAudioGeneratorServiceImpl;
|
|
114
|
+
/**
|
|
115
|
+
* Create AudioGenerator service instance
|
|
116
|
+
*/
|
|
117
|
+
const makeEffectAudioGeneratorService = () => effect_1.Effect.gen(function* () {
|
|
118
|
+
const apiService = yield* context_1.VoicevoxApiContext;
|
|
119
|
+
const fileManager = yield* context_1.EffectFileManagerContext;
|
|
120
|
+
// Get the underlying VoicevoxApi instance and create a dummy AudioFileManager for the AudioGenerator
|
|
121
|
+
const api = apiService.getApi();
|
|
122
|
+
// We need to create a bridge AudioFileManager that uses our Effect-based file service
|
|
123
|
+
const bridgeFileManager = {
|
|
124
|
+
saveTempAudioFile: (audioData) => effect_1.Effect.runPromise(fileManager.saveTempAudioFile(audioData)),
|
|
125
|
+
deleteTempFile: (filePath) => effect_1.Effect.runPromise(fileManager.deleteTempFile(filePath)),
|
|
126
|
+
releaseAllBlobUrls: () => effect_1.Effect.runPromise(fileManager.releaseAllBlobUrls()),
|
|
127
|
+
createTempFilePath: () => effect_1.Effect.runPromise(fileManager.createTempFilePath()),
|
|
128
|
+
createBlobUrl: (blob) => effect_1.Effect.runPromise(fileManager.createBlobUrl(blob)),
|
|
129
|
+
releaseBlobUrl: (url) => effect_1.Effect.runPromise(fileManager.releaseBlobUrl(url)),
|
|
130
|
+
};
|
|
131
|
+
const audioGenerator = new audio_generator_1.AudioGenerator(api, bridgeFileManager);
|
|
132
|
+
return new EffectAudioGeneratorServiceImpl(audioGenerator);
|
|
133
|
+
});
|
|
134
|
+
exports.makeEffectAudioGeneratorService = makeEffectAudioGeneratorService;
|
|
135
|
+
/**
|
|
136
|
+
* Layer providing Effect AudioGenerator service
|
|
137
|
+
*/
|
|
138
|
+
exports.EffectAudioGeneratorServiceLive = effect_1.Layer.effect(exports.EffectAudioGeneratorContext, (0, exports.makeEffectAudioGeneratorService)());
|
|
139
|
+
/**
|
|
140
|
+
* Scoped layer that automatically manages resources
|
|
141
|
+
*/
|
|
142
|
+
exports.EffectAudioGeneratorServiceScoped = effect_1.Layer.scoped(exports.EffectAudioGeneratorContext, effect_1.Effect.gen(function* () {
|
|
143
|
+
const service = yield* (0, exports.makeEffectAudioGeneratorService)();
|
|
144
|
+
// AudioGenerator doesn't need explicit cleanup but we can add monitoring
|
|
145
|
+
yield* effect_1.Effect.addFinalizer(() => effect_1.Effect.log('AudioGenerator service cleaned up'));
|
|
146
|
+
return service;
|
|
147
|
+
}));
|
|
148
|
+
/**
|
|
149
|
+
* Helper functions for audio generation workflows
|
|
150
|
+
*/
|
|
151
|
+
/**
|
|
152
|
+
* Batch generate audio from multiple text inputs
|
|
153
|
+
*/
|
|
154
|
+
const batchGenerateAudio = (texts, speaker, concurrency = 3) => {
|
|
155
|
+
const apiService = context_1.VoicevoxApiContext;
|
|
156
|
+
return effect_1.Effect.gen(function* () {
|
|
157
|
+
const service = yield* apiService;
|
|
158
|
+
const api = service.getApi();
|
|
159
|
+
// Generate all audio in parallel with limited concurrency
|
|
160
|
+
const audioDataArray = yield* effect_1.Effect.all(texts.map((text) => effect_1.Effect.gen(function* () {
|
|
161
|
+
const query = yield* (0, errors_1.safeAsync)(() => api.generateQuery(text, speaker), (error) => (0, errors_1.makeQueryGenerationError)('Batch query generation failed', text, speaker, error));
|
|
162
|
+
const audioData = yield* (0, errors_1.safeAsync)(() => api.synthesize(query, speaker), (error) => (0, errors_1.makeSynthesisError)('Batch synthesis failed', speaker, error));
|
|
163
|
+
return audioData;
|
|
164
|
+
})), { concurrency });
|
|
165
|
+
return audioDataArray;
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
exports.batchGenerateAudio = batchGenerateAudio;
|
|
169
|
+
/**
|
|
170
|
+
* Generate audio with custom preprocessing
|
|
171
|
+
*/
|
|
172
|
+
const generateAudioWithPreprocessing = (text, speaker, preprocessor) => {
|
|
173
|
+
const apiService = context_1.VoicevoxApiContext;
|
|
174
|
+
return effect_1.Effect.gen(function* () {
|
|
175
|
+
const service = yield* apiService;
|
|
176
|
+
const api = service.getApi();
|
|
177
|
+
// Generate base query
|
|
178
|
+
const baseQuery = yield* (0, errors_1.safeAsync)(() => api.generateQuery(text, speaker), (error) => (0, errors_1.makeQueryGenerationError)('Failed to generate base query', text, speaker, error));
|
|
179
|
+
// Apply preprocessing
|
|
180
|
+
const processedQuery = preprocessor(baseQuery);
|
|
181
|
+
// Synthesize with processed query
|
|
182
|
+
const audioData = yield* (0, errors_1.safeAsync)(() => api.synthesize(processedQuery, speaker), (error) => (0, errors_1.makeSynthesisError)('Failed to synthesize processed audio', speaker, error));
|
|
183
|
+
return audioData;
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
exports.generateAudioWithPreprocessing = generateAudioWithPreprocessing;
|
|
187
|
+
//# sourceMappingURL=audio-generator-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-generator-service.js","sourceRoot":"","sources":["../../../src/effect/services/audio-generator-service.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mCAA+C;AAC/C,iEAA4D;AAG5D,wCAQmB;AACnB,sCASkB;AAClB,oCAAmC;AAsBtB,QAAA,2BAA2B,GAAG,gBAAO,CAAC,UAAU,CAC3D,gCAAgC,CACjC,CAAA;AAED;;GAEG;AACH,MAAa,+BAA+B;IAC1C,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;QAE3D;;WAEG;QACH,kBAAa,GAAG,CAAC,IAAY,EAAE,OAAe,EAAgB,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEjH;;WAEG;QACH,2BAAsB,GAAG,CAAC,IAAS,EAAE,cAAmD,EAAiB,EAAE,CACzG,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAElE;;WAEG;QACH,kBAAa,GAAG,CAAC,IAAS,EAAE,cAAmD,EAAiB,EAAE,CAChG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAEzD;;WAEG;QACH,wBAAmB,GAAG,CAAC,IAAY,EAAE,OAAe,EAAmD,EAAE,CACvG,IAAA,gBAAQ,EACN,+BAA+B,OAAO,EAAE,EACxC,IAAA,yBAAgB,EACd,IAAA,kBAAS,EACP,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EACtD,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAwB,EAAC,mDAAmD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAC/G,EACD,CAAC,EAAE,cAAc;QACjB,IAAI,CAAC,gBAAgB;SACtB,CACF,CAAA;QAEH;;WAEG;QACH,wBAAmB,GAAG,CACpB,IAAmB,EACnB,YAAiF,EAKjF,EAAE;YACF,MAAM,IAAI,GAAG,IAAI,CAAA;YACjB,OAAO,IAAA,gBAAQ,EACb,uBAAuB,IAAI,CAAC,EAAE,EAAE,EAChC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,qCAAqC;gBACrC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,IAAI,CAAA;gBACb,CAAC;gBAED,8BAA8B;gBAC9B,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;gBAEvC,iBAAiB;gBACjB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;gBAEtE,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,4BAAkB,CAAA;gBAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,kCAAwB,CAAA;gBAEnD,mBAAmB;gBACnB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAChC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EACzD,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAkB,EAAC,+CAA+C,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CACpG,CAAA;gBAED,yBAAyB;gBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;gBAEhE,kCAAkC;gBAClC,MAAM,WAAW,GAAkB;oBACjC,GAAG,IAAI;oBACP,KAAK;oBACL,QAAQ;oBACR,MAAM,EAAE,OAAO;iBAChB,CAAA;gBAED,yBAAyB;gBACzB,KAAK,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;gBAEzC,OAAO,WAAW,CAAA;YACpB,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED;;WAEG;QACH,iCAA4B,GAAG,CAC7B,IAAmB,EACnB,YAAiF,EAKjF,EAAE;YACF,OAAO,IAAA,gBAAQ,EACb,gCAAgC,IAAI,CAAC,EAAE,EAAE,EACzC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,mDAAmD;gBACnD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC7C,OAAO,IAAI,CAAA;gBACb,CAAC;gBAED,8BAA8B;gBAC9B,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;gBAEvC,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,4BAAkB,CAAA;gBAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,kCAAwB,CAAA;gBAEnD,uCAAuC;gBACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAChC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAC9D,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAkB,EAAC,0DAA0D,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAC/G,CAAA;gBAED,yBAAyB;gBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;gBAEhE,kCAAkC;gBAClC,MAAM,WAAW,GAAkB;oBACjC,GAAG,IAAI;oBACP,QAAQ;oBACR,MAAM,EAAE,OAAO;iBAChB,CAAA;gBAED,yBAAyB;gBACzB,KAAK,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;gBAEzC,OAAO,WAAW,CAAA;YACpB,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED;;WAEG;QACH,gBAAW,GAAG,GAAkC,EAAE;YAChD,MAAM,IAAI,GAAG,IAAI,CAAA;YACjB,OAAO,IAAA,gBAAQ,EACb,2BAA2B,EAC3B,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,iDAAiD;gBACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3D,eAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EACtB,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAC7C,CAAA;gBACD,OAAO,MAAM,CAAA;YACf,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;IA5J6D,CAAC;CA6JhE;AA9JD,0EA8JC;AAED;;GAEG;AACI,MAAM,+BAA+B,GAAG,GAI7C,EAAE,CACF,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,4BAAkB,CAAA;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,kCAAwB,CAAA;IAEnD,qGAAqG;IACrG,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAA;IAE/B,sFAAsF;IACtF,MAAM,iBAAiB,GAAG;QACxB,iBAAiB,EAAE,CAAC,SAAsB,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC1G,cAAc,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC7F,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;QAC7E,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;QAC7E,aAAa,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACjF,cAAc,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;KACpF,CAAA;IAED,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,GAAG,EAAE,iBAAwB,CAAC,CAAA;IACxE,OAAO,IAAI,+BAA+B,CAAC,cAAc,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA;AAxBS,QAAA,+BAA+B,mCAwBxC;AAEJ;;GAEG;AACU,QAAA,+BAA+B,GAIxC,cAAK,CAAC,MAAM,CAAC,mCAA2B,EAAE,IAAA,uCAA+B,GAAE,CAAC,CAAA;AAEhF;;GAEG;AACU,QAAA,iCAAiC,GAAG,cAAK,CAAC,MAAM,CAC3D,mCAA2B,EAC3B,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAA,uCAA+B,GAAE,CAAA;IAExD,yEAAyE;IACzE,KAAK,CAAC,CAAC,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAA;IAEjF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAC,CACH,CAAA;AAED;;GAEG;AAEH;;GAEG;AACI,MAAM,kBAAkB,GAAG,CAChC,KAAwB,EACxB,OAAe,EACf,WAAW,GAAG,CAAC,EACmF,EAAE;IACpG,MAAM,UAAU,GAAG,4BAAkB,CAAA;IACrC,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAE5B,0DAA0D;QAC1D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAC5B,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EACtC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAwB,EAAC,+BAA+B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAC3F,CAAA;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAChC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EACpC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAkB,EAAC,wBAAwB,EAAE,OAAO,EAAE,KAAK,CAAC,CACxE,CAAA;YAED,OAAO,SAAS,CAAA;QAClB,CAAC,CAAC,CACH,EACD,EAAE,WAAW,EAAE,CAChB,CAAA;QAED,OAAO,cAAc,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAhCY,QAAA,kBAAkB,sBAgC9B;AAED;;GAEG;AACI,MAAM,8BAA8B,GAAG,CAC5C,IAAY,EACZ,OAAe,EACf,YAA+C,EACwC,EAAE;IACzF,MAAM,UAAU,GAAG,4BAAkB,CAAA;IACrC,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAE5B,sBAAsB;QACtB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAChC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EACtC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAwB,EAAC,+BAA+B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAC3F,CAAA;QAED,sBAAsB;QACtB,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAE9C,kCAAkC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAA,kBAAS,EAChC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAkB,EAAC,sCAAsC,EAAE,OAAO,EAAE,KAAK,CAAC,CACtF,CAAA;QAED,OAAO,SAAS,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AA3BY,QAAA,8BAA8B,kCA2B1C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect-based AudioPlayer service implementation
|
|
3
|
+
* Provides structured error handling and resource management for audio playback
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer, Ref } from 'effect';
|
|
6
|
+
import { type PlaybackError } from '../errors';
|
|
7
|
+
/**
|
|
8
|
+
* Enhanced AudioPlayer service with Effect-based operations
|
|
9
|
+
*/
|
|
10
|
+
export interface EffectAudioPlayerService {
|
|
11
|
+
readonly playAudio: (filePath: string) => Promise<void>;
|
|
12
|
+
readonly playAudioEffect: (filePath: string) => Effect.Effect<void, PlaybackError>;
|
|
13
|
+
readonly playAudioWithTimeout: (filePath: string, timeoutMs: number) => Effect.Effect<void, PlaybackError>;
|
|
14
|
+
readonly playAudioWithRetry: (filePath: string, maxRetries?: number) => Effect.Effect<void, PlaybackError>;
|
|
15
|
+
readonly isPlaying: () => Effect.Effect<boolean, never>;
|
|
16
|
+
readonly stopPlayback: () => Effect.Effect<void, never>;
|
|
17
|
+
readonly healthCheck: () => Effect.Effect<boolean, never>;
|
|
18
|
+
readonly cleanup: () => Effect.Effect<void, never>;
|
|
19
|
+
}
|
|
20
|
+
export declare const EffectAudioPlayerContext: Context.Tag<EffectAudioPlayerService, EffectAudioPlayerService>;
|
|
21
|
+
/**
|
|
22
|
+
* Audio playback state for tracking
|
|
23
|
+
*/
|
|
24
|
+
interface AudioPlayerState {
|
|
25
|
+
readonly isPlaying: boolean;
|
|
26
|
+
readonly currentFilePath?: string;
|
|
27
|
+
readonly playbackStartTime?: Date;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Effect-based implementation of AudioPlayer service
|
|
31
|
+
*/
|
|
32
|
+
export declare class EffectAudioPlayerServiceImpl implements EffectAudioPlayerService {
|
|
33
|
+
private readonly playerState;
|
|
34
|
+
private readonly audioCommand;
|
|
35
|
+
constructor(playerState: Ref.Ref<AudioPlayerState>);
|
|
36
|
+
/**
|
|
37
|
+
* Traditional playAudio method (Promise-based)
|
|
38
|
+
*/
|
|
39
|
+
playAudio: (filePath: string) => Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Play audio with Effect-based error handling and state management
|
|
42
|
+
*/
|
|
43
|
+
playAudioEffect: (filePath: string) => Effect.Effect<void, PlaybackError>;
|
|
44
|
+
/**
|
|
45
|
+
* Play audio with timeout protection
|
|
46
|
+
*/
|
|
47
|
+
playAudioWithTimeout: (filePath: string, timeoutMs: number) => Effect.Effect<void, PlaybackError>;
|
|
48
|
+
/**
|
|
49
|
+
* Play audio with retry logic
|
|
50
|
+
*/
|
|
51
|
+
playAudioWithRetry: (filePath: string, maxRetries?: number) => Effect.Effect<void, PlaybackError>;
|
|
52
|
+
/**
|
|
53
|
+
* Check if audio is currently playing
|
|
54
|
+
*/
|
|
55
|
+
isPlaying: () => Effect.Effect<boolean, never>;
|
|
56
|
+
/**
|
|
57
|
+
* Stop current playback (best effort, may not work on all platforms)
|
|
58
|
+
*/
|
|
59
|
+
stopPlayback: () => Effect.Effect<void, never>;
|
|
60
|
+
/**
|
|
61
|
+
* Health check to verify audio playback capabilities
|
|
62
|
+
*/
|
|
63
|
+
healthCheck: () => Effect.Effect<boolean, never>;
|
|
64
|
+
/**
|
|
65
|
+
* Clean up audio player resources
|
|
66
|
+
*/
|
|
67
|
+
cleanup: () => Effect.Effect<void, never>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create AudioPlayer service instance
|
|
71
|
+
*/
|
|
72
|
+
export declare const makeEffectAudioPlayerService: () => Effect.Effect<EffectAudioPlayerService, never>;
|
|
73
|
+
/**
|
|
74
|
+
* Layer providing Effect AudioPlayer service
|
|
75
|
+
*/
|
|
76
|
+
export declare const EffectAudioPlayerServiceLive: Layer.Layer<EffectAudioPlayerService, never>;
|
|
77
|
+
/**
|
|
78
|
+
* Scoped layer that automatically cleans up resources on scope close
|
|
79
|
+
*/
|
|
80
|
+
export declare const EffectAudioPlayerServiceScoped: Layer.Layer<EffectAudioPlayerService, never, never>;
|
|
81
|
+
/**
|
|
82
|
+
* Helper functions for audio playback workflows
|
|
83
|
+
*/
|
|
84
|
+
/**
|
|
85
|
+
* Play multiple audio files in sequence
|
|
86
|
+
*/
|
|
87
|
+
export declare const playAudioSequence: (filePaths: readonly string[]) => Effect.Effect<void, PlaybackError, EffectAudioPlayerService>;
|
|
88
|
+
/**
|
|
89
|
+
* Play multiple audio files in parallel (useful for sound effects)
|
|
90
|
+
*/
|
|
91
|
+
export declare const playAudioParallel: (filePaths: readonly string[], concurrency?: number) => Effect.Effect<void, PlaybackError, EffectAudioPlayerService>;
|
|
92
|
+
/**
|
|
93
|
+
* Play audio with progress monitoring
|
|
94
|
+
*/
|
|
95
|
+
export declare const playAudioWithProgress: (filePath: string, onProgress?: (elapsed: number) => void) => Effect.Effect<void, PlaybackError, EffectAudioPlayerService>;
|
|
96
|
+
/**
|
|
97
|
+
* Create a managed audio player that automatically stops on scope exit
|
|
98
|
+
*/
|
|
99
|
+
export declare const withManagedAudioPlayer: <A, E>(program: Effect.Effect<A, E, EffectAudioPlayerService>) => Effect.Effect<A, E, EffectAudioPlayerService>;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=audio-player-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-player-service.d.ts","sourceRoot":"","sources":["../../../src/effect/services/audio-player-service.ts"],"names":[],"mappings":"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"}
|