@kajidog/voicevox-client 0.4.1 → 0.5.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/api.d.ts +36 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +76 -0
- package/dist/api.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -0
- 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/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/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 +16 -4
- package/dist/queue/queue-service.js.map +1 -1
- 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/types.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect-based error handling infrastructure
|
|
4
|
+
* Provides structured error types and handling utilities
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.fromPromise = exports.toPromise = exports.makeGeneralError = exports.GeneralError = exports.retryWithJitter = exports.retryWithBackoff = exports.safeSync = exports.safeAsync = exports.makeQueueOperationError = exports.makePlaybackError = exports.makeFileOperationError = exports.makeSynthesisError = exports.makeQueryGenerationError = exports.makeApiConnectionError = exports.QueueOperationError = exports.PlaybackError = exports.FileOperationError = exports.SynthesisError = exports.QueryGenerationError = exports.ApiConnectionError = exports.VoicevoxEffectError = void 0;
|
|
8
|
+
const effect_1 = require("effect");
|
|
9
|
+
const error_1 = require("../error");
|
|
10
|
+
/**
|
|
11
|
+
* Base error class for all VOICEVOX Effect errors
|
|
12
|
+
*/
|
|
13
|
+
class VoicevoxEffectError extends effect_1.Data.TaggedError('VoicevoxEffectError') {
|
|
14
|
+
get name() {
|
|
15
|
+
return 'VoicevoxEffectError';
|
|
16
|
+
}
|
|
17
|
+
getDetailedMessage() {
|
|
18
|
+
let details = `${this.message} [${this.code}]`;
|
|
19
|
+
if (this.originalError instanceof Error) {
|
|
20
|
+
details += `\nOriginal Error: ${this.originalError.message}`;
|
|
21
|
+
if (this.originalError.stack) {
|
|
22
|
+
details += `\nStack: ${this.originalError.stack}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return details;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.VoicevoxEffectError = VoicevoxEffectError;
|
|
29
|
+
/**
|
|
30
|
+
* Specific error types for different operation categories
|
|
31
|
+
*/
|
|
32
|
+
class ApiConnectionError extends effect_1.Data.TaggedError('ApiConnectionError') {
|
|
33
|
+
}
|
|
34
|
+
exports.ApiConnectionError = ApiConnectionError;
|
|
35
|
+
class QueryGenerationError extends effect_1.Data.TaggedError('QueryGenerationError') {
|
|
36
|
+
}
|
|
37
|
+
exports.QueryGenerationError = QueryGenerationError;
|
|
38
|
+
class SynthesisError extends effect_1.Data.TaggedError('SynthesisError') {
|
|
39
|
+
}
|
|
40
|
+
exports.SynthesisError = SynthesisError;
|
|
41
|
+
class FileOperationError extends effect_1.Data.TaggedError('FileOperationError') {
|
|
42
|
+
}
|
|
43
|
+
exports.FileOperationError = FileOperationError;
|
|
44
|
+
class PlaybackError extends effect_1.Data.TaggedError('PlaybackError') {
|
|
45
|
+
}
|
|
46
|
+
exports.PlaybackError = PlaybackError;
|
|
47
|
+
class QueueOperationError extends effect_1.Data.TaggedError('QueueOperationError') {
|
|
48
|
+
}
|
|
49
|
+
exports.QueueOperationError = QueueOperationError;
|
|
50
|
+
/**
|
|
51
|
+
* Error constructors for easier creation
|
|
52
|
+
*/
|
|
53
|
+
const makeApiConnectionError = (message, url, originalError) => new ApiConnectionError({ message, url, originalError });
|
|
54
|
+
exports.makeApiConnectionError = makeApiConnectionError;
|
|
55
|
+
const makeQueryGenerationError = (message, text, speakerId, originalError) => new QueryGenerationError({ message, text, speakerId, originalError });
|
|
56
|
+
exports.makeQueryGenerationError = makeQueryGenerationError;
|
|
57
|
+
const makeSynthesisError = (message, speakerId, originalError) => new SynthesisError({ message, speakerId, originalError });
|
|
58
|
+
exports.makeSynthesisError = makeSynthesisError;
|
|
59
|
+
const makeFileOperationError = (message, operation, filePath, originalError) => new FileOperationError({ message, filePath, operation, originalError });
|
|
60
|
+
exports.makeFileOperationError = makeFileOperationError;
|
|
61
|
+
const makePlaybackError = (message, filePath, originalError) => new PlaybackError({ message, filePath, originalError });
|
|
62
|
+
exports.makePlaybackError = makePlaybackError;
|
|
63
|
+
const makeQueueOperationError = (message, operation, itemId, originalError) => new QueueOperationError({ message, itemId, operation, originalError });
|
|
64
|
+
exports.makeQueueOperationError = makeQueueOperationError;
|
|
65
|
+
/**
|
|
66
|
+
* Effect utilities for error handling
|
|
67
|
+
*/
|
|
68
|
+
/**
|
|
69
|
+
* Safely execute an async operation with error mapping
|
|
70
|
+
*/
|
|
71
|
+
const safeAsync = (asyncFn, errorMapper) => effect_1.Effect.tryPromise({
|
|
72
|
+
try: asyncFn,
|
|
73
|
+
catch: errorMapper,
|
|
74
|
+
});
|
|
75
|
+
exports.safeAsync = safeAsync;
|
|
76
|
+
/**
|
|
77
|
+
* Safely execute a sync operation with error mapping
|
|
78
|
+
*/
|
|
79
|
+
const safeSync = (syncFn, errorMapper) => effect_1.Effect.try({
|
|
80
|
+
try: syncFn,
|
|
81
|
+
catch: errorMapper,
|
|
82
|
+
});
|
|
83
|
+
exports.safeSync = safeSync;
|
|
84
|
+
/**
|
|
85
|
+
* Retry an effect with exponential backoff
|
|
86
|
+
*/
|
|
87
|
+
const retryWithBackoff = (effect, maxRetries = 3, baseDelay = 100) => effect.pipe(effect_1.Effect.retry(effect_1.Schedule.exponential(baseDelay).pipe(effect_1.Schedule.compose(effect_1.Schedule.recurs(maxRetries)))));
|
|
88
|
+
exports.retryWithBackoff = retryWithBackoff;
|
|
89
|
+
/**
|
|
90
|
+
* Retry an effect with jitter to prevent thundering herd
|
|
91
|
+
*/
|
|
92
|
+
const retryWithJitter = (effect, maxRetries = 3, baseDelay = 100) => effect.pipe(effect_1.Effect.retry(effect_1.Schedule.exponential(baseDelay)
|
|
93
|
+
.pipe(effect_1.Schedule.compose(effect_1.Schedule.recurs(maxRetries)))
|
|
94
|
+
.pipe(effect_1.Schedule.jittered)));
|
|
95
|
+
exports.retryWithJitter = retryWithJitter;
|
|
96
|
+
/**
|
|
97
|
+
* General error for common operations
|
|
98
|
+
*/
|
|
99
|
+
class GeneralError extends effect_1.Data.TaggedError('GeneralError') {
|
|
100
|
+
}
|
|
101
|
+
exports.GeneralError = GeneralError;
|
|
102
|
+
const makeGeneralError = (message, originalError) => new GeneralError({ message, originalError });
|
|
103
|
+
exports.makeGeneralError = makeGeneralError;
|
|
104
|
+
/**
|
|
105
|
+
* Convert an Effect error to a Promise rejection for compatibility
|
|
106
|
+
*/
|
|
107
|
+
const toPromise = (effect) => effect_1.Effect.runPromise(effect);
|
|
108
|
+
exports.toPromise = toPromise;
|
|
109
|
+
/**
|
|
110
|
+
* Convert a Promise to an Effect with proper error handling
|
|
111
|
+
*/
|
|
112
|
+
const fromPromise = (promise, errorMapper = (error) => new VoicevoxEffectError({
|
|
113
|
+
code: error_1.VoicevoxErrorCode.UNKNOWN_ERROR,
|
|
114
|
+
message: error instanceof Error ? error.message : String(error),
|
|
115
|
+
originalError: error,
|
|
116
|
+
})) => effect_1.Effect.tryPromise({
|
|
117
|
+
try: () => promise,
|
|
118
|
+
catch: errorMapper,
|
|
119
|
+
});
|
|
120
|
+
exports.fromPromise = fromPromise;
|
|
121
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/effect/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect.ts infrastructure for VOICEVOX
|
|
3
|
+
*
|
|
4
|
+
* This module provides a complete Effect-based foundation for:
|
|
5
|
+
* - Structured error handling with detailed error types
|
|
6
|
+
* - Dependency injection through Context system
|
|
7
|
+
* - Resource management with automatic cleanup
|
|
8
|
+
* - Async operation coordination with fibers
|
|
9
|
+
* - Configuration management
|
|
10
|
+
* - Logging and observability
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { Effect } from 'effect'
|
|
15
|
+
* import { AppLayer, VoicevoxApiContext, safeAsync } from './effect'
|
|
16
|
+
*
|
|
17
|
+
* const program = Effect.gen(function* () {
|
|
18
|
+
* const api = yield* VoicevoxApiContext
|
|
19
|
+
* // ... your Effect-based logic
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* Effect.runPromise(program.pipe(Effect.provide(AppLayer)))
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export * from './config';
|
|
26
|
+
export * from './errors';
|
|
27
|
+
export * from './context';
|
|
28
|
+
export * from './utils';
|
|
29
|
+
export * from './queue-manager';
|
|
30
|
+
export * from './services/api-service';
|
|
31
|
+
export * from './services/file-manager-service';
|
|
32
|
+
export * from './services/audio-player-service';
|
|
33
|
+
export { Effect, Context, Layer, Scope, Logger, Schedule, Duration, Option, Either } from 'effect';
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,cAAc,UAAU,CAAA;AAGxB,cAAc,UAAU,CAAA;AAGxB,cAAc,WAAW,CAAA;AAGzB,cAAc,SAAS,CAAA;AAGvB,cAAc,iBAAiB,CAAA;AAG/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iCAAiC,CAAA;AAG/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect.ts infrastructure for VOICEVOX
|
|
4
|
+
*
|
|
5
|
+
* This module provides a complete Effect-based foundation for:
|
|
6
|
+
* - Structured error handling with detailed error types
|
|
7
|
+
* - Dependency injection through Context system
|
|
8
|
+
* - Resource management with automatic cleanup
|
|
9
|
+
* - Async operation coordination with fibers
|
|
10
|
+
* - Configuration management
|
|
11
|
+
* - Logging and observability
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Effect } from 'effect'
|
|
16
|
+
* import { AppLayer, VoicevoxApiContext, safeAsync } from './effect'
|
|
17
|
+
*
|
|
18
|
+
* const program = Effect.gen(function* () {
|
|
19
|
+
* const api = yield* VoicevoxApiContext
|
|
20
|
+
* // ... your Effect-based logic
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* Effect.runPromise(program.pipe(Effect.provide(AppLayer)))
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
29
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
30
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(o, k2, desc);
|
|
33
|
+
}) : (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
o[k2] = m[k];
|
|
36
|
+
}));
|
|
37
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
38
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.Either = exports.Option = exports.Duration = exports.Schedule = exports.Logger = exports.Scope = exports.Layer = exports.Context = exports.Effect = void 0;
|
|
42
|
+
// Configuration and setup
|
|
43
|
+
__exportStar(require("./config"), exports);
|
|
44
|
+
// Error handling
|
|
45
|
+
__exportStar(require("./errors"), exports);
|
|
46
|
+
// Context definitions for dependency injection
|
|
47
|
+
__exportStar(require("./context"), exports);
|
|
48
|
+
// Utility functions and common patterns
|
|
49
|
+
__exportStar(require("./utils"), exports);
|
|
50
|
+
// Speech synthesis management
|
|
51
|
+
__exportStar(require("./queue-manager"), exports);
|
|
52
|
+
// Service layers
|
|
53
|
+
__exportStar(require("./services/api-service"), exports);
|
|
54
|
+
__exportStar(require("./services/file-manager-service"), exports);
|
|
55
|
+
__exportStar(require("./services/audio-player-service"), exports);
|
|
56
|
+
// Re-export commonly used Effect modules for convenience
|
|
57
|
+
var effect_1 = require("effect");
|
|
58
|
+
Object.defineProperty(exports, "Effect", { enumerable: true, get: function () { return effect_1.Effect; } });
|
|
59
|
+
Object.defineProperty(exports, "Context", { enumerable: true, get: function () { return effect_1.Context; } });
|
|
60
|
+
Object.defineProperty(exports, "Layer", { enumerable: true, get: function () { return effect_1.Layer; } });
|
|
61
|
+
Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return effect_1.Scope; } });
|
|
62
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return effect_1.Logger; } });
|
|
63
|
+
Object.defineProperty(exports, "Schedule", { enumerable: true, get: function () { return effect_1.Schedule; } });
|
|
64
|
+
Object.defineProperty(exports, "Duration", { enumerable: true, get: function () { return effect_1.Duration; } });
|
|
65
|
+
Object.defineProperty(exports, "Option", { enumerable: true, get: function () { return effect_1.Option; } });
|
|
66
|
+
Object.defineProperty(exports, "Either", { enumerable: true, get: function () { return effect_1.Either; } });
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;;;;;AAEH,0BAA0B;AAC1B,2CAAwB;AAExB,iBAAiB;AACjB,2CAAwB;AAExB,+CAA+C;AAC/C,4CAAyB;AAEzB,wCAAwC;AACxC,0CAAuB;AAEvB,8BAA8B;AAC9B,kDAA+B;AAE/B,iBAAiB;AACjB,yDAAsC;AACtC,kEAA+C;AAC/C,kEAA+C;AAE/C,yDAAyD;AACzD,iCAAkG;AAAzF,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,gGAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified Effect-based voice synthesis manager
|
|
3
|
+
* Replaces complex queue system with direct Effect-based processing
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer } from 'effect';
|
|
6
|
+
import type { PlaybackOptions, SpeechSegment } from './context';
|
|
7
|
+
import { type VoicevoxApiService } from './context';
|
|
8
|
+
import type { FileOperationError, PlaybackError } from './errors';
|
|
9
|
+
/**
|
|
10
|
+
* Speech synthesis service interface
|
|
11
|
+
*/
|
|
12
|
+
export interface SpeechSynthesisService {
|
|
13
|
+
readonly speak: (segments: readonly SpeechSegment[], options?: PlaybackOptions) => Effect.Effect<string, PlaybackError | FileOperationError, VoicevoxApiService>;
|
|
14
|
+
readonly generateAudioFile: (text: string, outputPath: string, speaker?: number, speedScale?: number) => Effect.Effect<string, PlaybackError | FileOperationError, VoicevoxApiService>;
|
|
15
|
+
readonly clearQueue: () => Effect.Effect<void, never>;
|
|
16
|
+
}
|
|
17
|
+
export declare const SpeechSynthesisContext: Context.Tag<SpeechSynthesisService, SpeechSynthesisService>;
|
|
18
|
+
/**
|
|
19
|
+
* Simple speech synthesis implementation
|
|
20
|
+
*/
|
|
21
|
+
export declare class SpeechSynthesisServiceImpl implements SpeechSynthesisService {
|
|
22
|
+
speak: (segments: readonly SpeechSegment[], options?: PlaybackOptions) => Effect.Effect<string, PlaybackError | FileOperationError, VoicevoxApiService>;
|
|
23
|
+
generateAudioFile: (text: string, outputPath: string, speaker?: number, speedScale?: number) => Effect.Effect<string, PlaybackError | FileOperationError, VoicevoxApiService>;
|
|
24
|
+
clearQueue: () => Effect.Effect<void, never>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create speech synthesis service
|
|
28
|
+
*/
|
|
29
|
+
export declare const makeSpeechSynthesisService: () => Effect.Effect<SpeechSynthesisService, never>;
|
|
30
|
+
/**
|
|
31
|
+
* Layer providing speech synthesis service
|
|
32
|
+
*/
|
|
33
|
+
export declare const SpeechSynthesisServiceLive: Layer.Layer<SpeechSynthesisService, never, VoicevoxApiService>;
|
|
34
|
+
//# sourceMappingURL=queue-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-manager.d.ts","sourceRoot":"","sources":["../../src/effect/queue-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC/D,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIjE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;IAChK,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;IACtL,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;CACtD;AAED,eAAO,MAAM,sBAAsB,6DAA0E,CAAA;AAE7G;;GAEG;AACH,qBAAa,0BAA2B,YAAW,sBAAsB;IAEvE,KAAK,GAAI,UAAU,SAAS,aAAa,EAAE,EAAE,UAAU,eAAe,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,EAAE,kBAAkB,CAAC,CAgBrJ;IAED,iBAAiB,GAAI,MAAM,MAAM,EAAE,YAAY,MAAM,EAAE,UAAU,MAAM,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,EAAE,kBAAkB,CAAC,CAkB3K;IAED,UAAU,QAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAO1C;CACF;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,QAAO,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,CACpC,CAAA;AAErD;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,EAAE,kBAAkB,CAGrG,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simplified Effect-based voice synthesis manager
|
|
4
|
+
* Replaces complex queue system with direct Effect-based processing
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SpeechSynthesisServiceLive = exports.makeSpeechSynthesisService = exports.SpeechSynthesisServiceImpl = exports.SpeechSynthesisContext = void 0;
|
|
8
|
+
const effect_1 = require("effect");
|
|
9
|
+
const context_1 = require("./context");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
exports.SpeechSynthesisContext = effect_1.Context.GenericTag('@voicevox/SpeechSynthesis');
|
|
12
|
+
/**
|
|
13
|
+
* Simple speech synthesis implementation
|
|
14
|
+
*/
|
|
15
|
+
class SpeechSynthesisServiceImpl {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.speak = (segments, options) => {
|
|
18
|
+
return (0, utils_1.logTimed)('speechSynthesis-speak', effect_1.Effect.gen(function* () {
|
|
19
|
+
const api = yield* context_1.VoicevoxApiContext;
|
|
20
|
+
// Process segments sequentially
|
|
21
|
+
const results = [];
|
|
22
|
+
for (const segment of segments) {
|
|
23
|
+
const result = `音声合成処理: "${segment.text}" (話者: ${segment.speaker || 1})`;
|
|
24
|
+
results.push(result);
|
|
25
|
+
}
|
|
26
|
+
return `音声合成完了: ${results.length} セグメント処理`;
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
this.generateAudioFile = (text, outputPath, speaker, speedScale) => {
|
|
30
|
+
return (0, utils_1.logTimed)(`speechSynthesis-generateFile-${outputPath}`, effect_1.Effect.gen(function* () {
|
|
31
|
+
const api = yield* context_1.VoicevoxApiContext;
|
|
32
|
+
// Generate query and synthesize audio
|
|
33
|
+
const query = yield* api.generateQuery(text, speaker);
|
|
34
|
+
if (speedScale) {
|
|
35
|
+
query.speedScale = speedScale;
|
|
36
|
+
}
|
|
37
|
+
const audioData = yield* api.synthesize(query, speaker);
|
|
38
|
+
// For now, return success message
|
|
39
|
+
return `音声ファイル生成完了: ${outputPath}`;
|
|
40
|
+
}));
|
|
41
|
+
};
|
|
42
|
+
this.clearQueue = () => {
|
|
43
|
+
return (0, utils_1.logTimed)('speechSynthesis-clearQueue', effect_1.Effect.sync(() => {
|
|
44
|
+
// Simple implementation - no queue to clear
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.SpeechSynthesisServiceImpl = SpeechSynthesisServiceImpl;
|
|
50
|
+
/**
|
|
51
|
+
* Create speech synthesis service
|
|
52
|
+
*/
|
|
53
|
+
const makeSpeechSynthesisService = () => effect_1.Effect.sync(() => new SpeechSynthesisServiceImpl());
|
|
54
|
+
exports.makeSpeechSynthesisService = makeSpeechSynthesisService;
|
|
55
|
+
/**
|
|
56
|
+
* Layer providing speech synthesis service
|
|
57
|
+
*/
|
|
58
|
+
exports.SpeechSynthesisServiceLive = effect_1.Layer.effect(exports.SpeechSynthesisContext, (0, exports.makeSpeechSynthesisService)());
|
|
59
|
+
//# sourceMappingURL=queue-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../../src/effect/queue-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mCAA+C;AAG/C,uCAAuE;AAGvE,mCAAkC;AAWrB,QAAA,sBAAsB,GAAG,gBAAO,CAAC,UAAU,CAAyB,2BAA2B,CAAC,CAAA;AAE7G;;GAEG;AACH,MAAa,0BAA0B;IAAvC;QAEE,UAAK,GAAG,CAAC,QAAkC,EAAE,OAAyB,EAAiF,EAAE;YACvJ,OAAO,IAAA,gBAAQ,EACb,uBAAuB,EACvB,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,4BAAkB,CAAA;gBAErC,gCAAgC;gBAChC,MAAM,OAAO,GAAa,EAAE,CAAA;gBAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAG,YAAY,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,CAAA;oBACxE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACtB,CAAC;gBAED,OAAO,WAAW,OAAO,CAAC,MAAM,UAAU,CAAA;YAC5C,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,sBAAiB,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE,OAAgB,EAAE,UAAmB,EAAiF,EAAE;YAC7K,OAAO,IAAA,gBAAQ,EACb,gCAAgC,UAAU,EAAE,EAC5C,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,4BAAkB,CAAA;gBAErC,sCAAsC;gBACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBACrD,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,CAAC,UAAU,GAAG,UAAU,CAAA;gBAC/B,CAAC;gBAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;gBAEvD,kCAAkC;gBAClC,OAAO,eAAe,UAAU,EAAE,CAAA;YACpC,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,eAAU,GAAG,GAA+B,EAAE;YAC5C,OAAO,IAAA,gBAAQ,EACb,4BAA4B,EAC5B,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,4CAA4C;YAC9C,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;IACH,CAAC;CAAA;AAhDD,gEAgDC;AAED;;GAEG;AACI,MAAM,0BAA0B,GAAG,GAAiD,EAAE,CAC3F,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAA;AADxC,QAAA,0BAA0B,8BACc;AAErD;;GAEG;AACU,QAAA,0BAA0B,GAAmE,cAAK,CAAC,MAAM,CACpH,8BAAsB,EACtB,IAAA,kCAA0B,GAAE,CAC7B,CAAA"}
|
|
@@ -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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"}
|