@coeiro-operator/audio 1.2.5 → 1.2.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coeiro-operator/audio",
3
- "version": "1.2.5",
3
+ "version": "1.2.6",
4
4
  "description": "Audio synthesis and playback module for COEIRO Operator",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,26 +0,0 @@
1
- /**
2
- * voice-resolver.ts: 音声設定の解決を担当
3
- */
4
- import { OperatorManager, ConfigManager, CharacterInfoService } from '@coeiro-operator/core';
5
- import { AudioSynthesizer } from './audio-synthesizer.js';
6
- import type { VoiceConfig } from './types.js';
7
- export declare class VoiceResolver {
8
- private configManager;
9
- private operatorManager;
10
- private characterInfoService;
11
- private audioSynthesizer;
12
- constructor(configManager: ConfigManager, operatorManager: OperatorManager, characterInfoService: CharacterInfoService, audioSynthesizer: AudioSynthesizer);
13
- /**
14
- * 現在のオペレータの音声設定を取得
15
- */
16
- getCurrentVoiceConfig(styleName?: string | null): Promise<VoiceConfig | null>;
17
- /**
18
- * CharacterIdからVoiceConfigを生成
19
- */
20
- resolveCharacterToConfig(characterId: string, styleName?: string | null): Promise<VoiceConfig>;
21
- /**
22
- * 音声設定を解決
23
- */
24
- resolveVoiceConfig(voice: string | VoiceConfig | null | undefined, style?: string, allowFallback?: boolean): Promise<VoiceConfig>;
25
- }
26
- //# sourceMappingURL=voice-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-resolver.d.ts","sourceRoot":"","sources":["../src/voice-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,aAAa;IAEtB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,gBAAgB;gBAHhB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,oBAAoB,EAAE,oBAAoB,EAC1C,gBAAgB,EAAE,gBAAgB;IAG5C;;OAEG;IACG,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAwEnF;;OAEG;IACG,wBAAwB,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,WAAW,CAAC;IA0EvB;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,EAC9C,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,WAAW,CAAC;CAuDxB"}
@@ -1,201 +0,0 @@
1
- /**
2
- * voice-resolver.ts: 音声設定の解決を担当
3
- */
4
- import { logger } from '@coeiro-operator/common';
5
- export class VoiceResolver {
6
- configManager;
7
- operatorManager;
8
- characterInfoService;
9
- audioSynthesizer;
10
- constructor(configManager, operatorManager, characterInfoService, audioSynthesizer) {
11
- this.configManager = configManager;
12
- this.operatorManager = operatorManager;
13
- this.characterInfoService = characterInfoService;
14
- this.audioSynthesizer = audioSynthesizer;
15
- }
16
- /**
17
- * 現在のオペレータの音声設定を取得
18
- */
19
- async getCurrentVoiceConfig(styleName) {
20
- try {
21
- const currentStatus = await this.operatorManager.showCurrentOperator();
22
- if (!currentStatus.characterId) {
23
- return null;
24
- }
25
- const character = await this.characterInfoService.getCharacterInfo(currentStatus.characterId);
26
- if (character && character.speakerId) {
27
- // 保存されたセッション情報からスタイルを取得
28
- const session = await this.operatorManager.getCurrentOperatorSession();
29
- let selectedStyle;
30
- // デバッグ: セッション情報を確認
31
- logger.debug('VoiceResolver.getCurrentVoiceConfig()', {
32
- styleName,
33
- session,
34
- 'session?.styleId': session?.styleId,
35
- 'session?.styleId !== undefined': session?.styleId !== undefined,
36
- });
37
- if (styleName) {
38
- // 明示的にスタイルが指定された場合はそれを使用
39
- logger.debug('分岐: 明示的スタイル指定');
40
- selectedStyle = this.characterInfoService.selectStyle(character, styleName);
41
- }
42
- else if (session?.styleId !== undefined) {
43
- // セッションに保存されたスタイルIDがある場合はそれを使用
44
- logger.debug('分岐: セッションからスタイル取得');
45
- const savedStyle = character.styles?.[session.styleId];
46
- if (savedStyle) {
47
- selectedStyle = savedStyle;
48
- logger.debug(`保存されたスタイルを使用: ${savedStyle.styleName} (ID:${session.styleId})`);
49
- }
50
- else {
51
- // 保存されたスタイルが見つからない場合はデフォルトを使用
52
- logger.debug('保存されたスタイルが見つからない、デフォルト使用');
53
- selectedStyle = this.characterInfoService.selectStyle(character, null);
54
- }
55
- }
56
- else {
57
- // セッション情報がない場合はデフォルトスタイルを使用
58
- logger.debug('分岐: セッション情報なし、デフォルト使用');
59
- selectedStyle = this.characterInfoService.selectStyle(character, null);
60
- }
61
- // 新しいstyles構造からstyleMorasPerSecondを生成
62
- const styleMorasPerSecond = {};
63
- if (character.styles) {
64
- Object.entries(character.styles).forEach(([styleId, config]) => {
65
- if (config.morasPerSecond !== undefined) {
66
- styleMorasPerSecond[Number(styleId)] = config.morasPerSecond;
67
- }
68
- });
69
- }
70
- return {
71
- speaker: null, // 廃止予定: character.speaker は削除されたため
72
- selectedStyleId: selectedStyle.styleId,
73
- speakerId: character.speakerId,
74
- styleMorasPerSecond,
75
- };
76
- }
77
- return null;
78
- }
79
- catch (error) {
80
- logger.error(`オペレータ音声取得エラー: ${error.message}`);
81
- return null;
82
- }
83
- }
84
- /**
85
- * CharacterIdからVoiceConfigを生成
86
- */
87
- async resolveCharacterToConfig(characterId, styleName) {
88
- try {
89
- // ConfigManagerからCharacter設定を取得
90
- const characterConfig = await this.configManager.getCharacterConfig(characterId);
91
- if (!characterConfig) {
92
- throw new Error(`Character not found: ${characterId}`);
93
- }
94
- // speakerIdからspeaker情報を取得(COEIROINKサーバーから)
95
- const speakers = await this.audioSynthesizer.getSpeakers();
96
- const speaker = speakers.find(s => s.speakerUuid === characterConfig.speakerId);
97
- if (!speaker) {
98
- throw new Error(`Speaker '${characterConfig.speakerId}' not found for character '${characterId}'`);
99
- }
100
- // スタイル選択
101
- let selectedStyle;
102
- if (styleName) {
103
- // スタイル名が指定された場合、characterConfig.stylesから対応するstyleIdを探す
104
- const styleEntry = Object.entries(characterConfig.styles).find(([_, config]) => config.styleName === styleName);
105
- if (styleEntry) {
106
- const styleId = Number(styleEntry[0]);
107
- selectedStyle = speaker.styles.find(s => s.styleId === styleId);
108
- }
109
- }
110
- // デフォルトスタイルを使用
111
- if (!selectedStyle) {
112
- selectedStyle = speaker.styles.find(s => s.styleId === characterConfig.defaultStyleId);
113
- }
114
- // それでも見つからない場合は最初のスタイルを使用
115
- if (!selectedStyle) {
116
- selectedStyle = speaker.styles[0];
117
- }
118
- // スタイルが見つからない場合はエラー
119
- if (!selectedStyle) {
120
- throw new Error(`No valid style found for character '${characterId}'${styleName ? ` with style '${styleName}'` : ''}`);
121
- }
122
- // speaker-provider.Speakerからoperator.Speakerへ変換
123
- const operatorSpeaker = {
124
- speakerId: speaker.speakerUuid,
125
- speakerName: speaker.speakerName,
126
- styles: speaker.styles,
127
- };
128
- // 新しいstyles構造からstyleMorasPerSecondを生成
129
- const styleMorasPerSecond = {};
130
- if (characterConfig.styles) {
131
- Object.entries(characterConfig.styles).forEach(([styleId, config]) => {
132
- if (config.morasPerSecond !== undefined) {
133
- styleMorasPerSecond[Number(styleId)] = config.morasPerSecond;
134
- }
135
- });
136
- }
137
- return {
138
- speaker: operatorSpeaker,
139
- selectedStyleId: selectedStyle.styleId,
140
- speakerId: characterConfig.speakerId,
141
- styleMorasPerSecond,
142
- };
143
- }
144
- catch (error) {
145
- logger.error(`Character解決エラー: ${error.message}`);
146
- throw new Error(`Failed to resolve character '${characterId}': ${error.message}`);
147
- }
148
- }
149
- /**
150
- * 音声設定を解決
151
- */
152
- async resolveVoiceConfig(voice, style, allowFallback = true) {
153
- if (!voice) {
154
- // オペレータから音声を取得(スタイル指定も渡す)
155
- const operatorVoice = await this.getCurrentVoiceConfig(style);
156
- if (operatorVoice) {
157
- // ログ出力(speakerがnullの場合はspeakerIdを使用)
158
- if (operatorVoice.speaker) {
159
- const selectedStyle = operatorVoice.speaker.styles.find(s => s.styleId === operatorVoice.selectedStyleId);
160
- const styleName = selectedStyle?.styleName || `ID:${operatorVoice.selectedStyleId}`;
161
- logger.info(`オペレータ音声を使用: ${operatorVoice.speaker.speakerName} (スタイル: ${styleName})`);
162
- }
163
- else {
164
- logger.info(`オペレータ音声を使用: ${operatorVoice.speakerId} (スタイルID: ${operatorVoice.selectedStyleId})`);
165
- }
166
- return operatorVoice;
167
- }
168
- else if (allowFallback) {
169
- // CLIのみ: デフォルトキャラクターを使用(つくよみちゃん)
170
- const defaultCharacterId = 'tsukuyomi';
171
- logger.info(`デフォルトキャラクターを使用: ${defaultCharacterId}`);
172
- return await this.resolveCharacterToConfig(defaultCharacterId, style);
173
- }
174
- else {
175
- // MCP: オペレータが必須
176
- throw new Error('オペレータが割り当てられていません。まず operator_assign を実行してください。');
177
- }
178
- }
179
- else if (typeof voice === 'string') {
180
- // string型の場合はCharacterIdとして解決
181
- logger.info(`キャラクター解決: ${voice}`);
182
- const voiceConfig = await this.resolveCharacterToConfig(voice, style);
183
- if (voiceConfig.speaker) {
184
- const selectedStyle = voiceConfig.speaker.styles.find(s => s.styleId === voiceConfig.selectedStyleId);
185
- const styleName = selectedStyle?.styleName || `ID:${voiceConfig.selectedStyleId}`;
186
- logger.info(` → ${voiceConfig.speaker.speakerName} (スタイル: ${styleName})`);
187
- }
188
- return voiceConfig;
189
- }
190
- else {
191
- // すでにVoiceConfig型の場合はそのまま使用
192
- if (voice.speaker) {
193
- const selectedStyle = voice.speaker.styles.find(s => s.styleId === voice.selectedStyleId);
194
- const styleName = selectedStyle?.styleName || `ID:${voice.selectedStyleId}`;
195
- logger.info(`VoiceConfig使用: ${voice.speaker.speakerName} (スタイル: ${styleName})`);
196
- }
197
- return voice;
198
- }
199
- }
200
- }
201
- //# sourceMappingURL=voice-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-resolver.js","sourceRoot":"","sources":["../src/voice-resolver.ts"],"names":[],"mappings":"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"}