@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.
Files changed (114) hide show
  1. package/LICENSE +14 -14
  2. package/dist/accent-utils.d.ts +93 -0
  3. package/dist/accent-utils.d.ts.map +1 -0
  4. package/dist/accent-utils.js +211 -0
  5. package/dist/accent-utils.js.map +1 -0
  6. package/dist/api.d.ts +40 -2
  7. package/dist/api.d.ts.map +1 -1
  8. package/dist/api.js +90 -0
  9. package/dist/api.js.map +1 -1
  10. package/dist/cache-policy.d.ts +21 -0
  11. package/dist/cache-policy.d.ts.map +1 -0
  12. package/dist/cache-policy.js +31 -0
  13. package/dist/cache-policy.js.map +1 -0
  14. package/dist/client.d.ts +28 -119
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +48 -417
  17. package/dist/client.js.map +1 -1
  18. package/dist/effect/config.d.ts +43 -0
  19. package/dist/effect/config.d.ts.map +1 -0
  20. package/dist/effect/config.js +45 -0
  21. package/dist/effect/config.js.map +1 -0
  22. package/dist/effect/context.d.ts +33 -0
  23. package/dist/effect/context.d.ts.map +1 -0
  24. package/dist/effect/context.js +10 -0
  25. package/dist/effect/context.js.map +1 -0
  26. package/dist/effect/errors.d.ts +130 -0
  27. package/dist/effect/errors.d.ts.map +1 -0
  28. package/dist/effect/errors.js +121 -0
  29. package/dist/effect/errors.js.map +1 -0
  30. package/dist/effect/index.d.ts +34 -0
  31. package/dist/effect/index.d.ts.map +1 -0
  32. package/dist/effect/index.js +67 -0
  33. package/dist/effect/index.js.map +1 -0
  34. package/dist/effect/queue-manager.d.ts +34 -0
  35. package/dist/effect/queue-manager.d.ts.map +1 -0
  36. package/dist/effect/queue-manager.js +59 -0
  37. package/dist/effect/queue-manager.js.map +1 -0
  38. package/dist/effect/services/api-service.d.ts +58 -0
  39. package/dist/effect/services/api-service.d.ts.map +1 -0
  40. package/dist/effect/services/api-service.js +90 -0
  41. package/dist/effect/services/api-service.js.map +1 -0
  42. package/dist/effect/services/audio-generator-service.d.ts +78 -0
  43. package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
  44. package/dist/effect/services/audio-generator-service.js +187 -0
  45. package/dist/effect/services/audio-generator-service.js.map +1 -0
  46. package/dist/effect/services/audio-player-service.d.ts +101 -0
  47. package/dist/effect/services/audio-player-service.d.ts.map +1 -0
  48. package/dist/effect/services/audio-player-service.js +297 -0
  49. package/dist/effect/services/audio-player-service.js.map +1 -0
  50. package/dist/effect/services/event-manager-service.d.ts +96 -0
  51. package/dist/effect/services/event-manager-service.d.ts.map +1 -0
  52. package/dist/effect/services/event-manager-service.js +208 -0
  53. package/dist/effect/services/event-manager-service.js.map +1 -0
  54. package/dist/effect/services/file-manager-service.d.ts +91 -0
  55. package/dist/effect/services/file-manager-service.d.ts.map +1 -0
  56. package/dist/effect/services/file-manager-service.js +215 -0
  57. package/dist/effect/services/file-manager-service.js.map +1 -0
  58. package/dist/effect/utils.d.ts +118 -0
  59. package/dist/effect/utils.d.ts.map +1 -0
  60. package/dist/effect/utils.js +186 -0
  61. package/dist/effect/utils.js.map +1 -0
  62. package/dist/error.js.map +1 -1
  63. package/dist/index.d.ts +3 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/playback/node-playback-strategy.d.ts.map +1 -1
  68. package/dist/playback/node-playback-strategy.js +2 -6
  69. package/dist/playback/node-playback-strategy.js.map +1 -1
  70. package/dist/player.d.ts +110 -0
  71. package/dist/player.d.ts.map +1 -0
  72. package/dist/player.js +183 -0
  73. package/dist/player.js.map +1 -0
  74. package/dist/queue/audio-player.d.ts +44 -0
  75. package/dist/queue/audio-player.d.ts.map +1 -0
  76. package/dist/queue/audio-player.js +344 -0
  77. package/dist/queue/audio-player.js.map +1 -0
  78. package/dist/queue/file-manager.js +9 -9
  79. package/dist/queue/file-manager.js.map +1 -1
  80. package/dist/queue/manager.d.ts +134 -0
  81. package/dist/queue/manager.d.ts.map +1 -0
  82. package/dist/queue/manager.js +564 -0
  83. package/dist/queue/manager.js.map +1 -0
  84. package/dist/queue/queue-service.d.ts.map +1 -1
  85. package/dist/queue/queue-service.js +20 -6
  86. package/dist/queue/queue-service.js.map +1 -1
  87. package/dist/queue/types.d.ts +3 -1
  88. package/dist/queue/types.d.ts.map +1 -1
  89. package/dist/queue/types.js.map +1 -1
  90. package/dist/services/dictionary-service.d.ts +35 -0
  91. package/dist/services/dictionary-service.d.ts.map +1 -0
  92. package/dist/services/dictionary-service.js +188 -0
  93. package/dist/services/dictionary-service.js.map +1 -0
  94. package/dist/services/speech-service.d.ts +43 -0
  95. package/dist/services/speech-service.d.ts.map +1 -0
  96. package/dist/services/speech-service.js +236 -0
  97. package/dist/services/speech-service.js.map +1 -0
  98. package/dist/shared-queue-manager.d.ts +119 -0
  99. package/dist/shared-queue-manager.d.ts.map +1 -0
  100. package/dist/shared-queue-manager.js +487 -0
  101. package/dist/shared-queue-manager.js.map +1 -0
  102. package/dist/state/queue-state-machine.d.ts.map +1 -1
  103. package/dist/state/queue-state-machine.js +13 -0
  104. package/dist/state/queue-state-machine.js.map +1 -1
  105. package/dist/state/types.d.ts +2 -0
  106. package/dist/state/types.d.ts.map +1 -1
  107. package/dist/state/types.js.map +1 -1
  108. package/dist/types.d.ts +28 -0
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/utils.d.ts +16 -0
  111. package/dist/utils.d.ts.map +1 -1
  112. package/dist/utils.js +36 -0
  113. package/dist/utils.js.map +1 -1
  114. 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":"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"}
@@ -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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"}