fmode-ng 0.0.41 → 0.0.43
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.md +8 -0
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/agent.prompt.mjs +10 -122
- package/esm2022/lib/aigc/agent/index.mjs +10 -2
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -97
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -104
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -111
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -166
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -36
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -141
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -92
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -207
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -236
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +10 -137
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -69
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -269
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -94
- package/esm2022/lib/aigc/index.mjs +10 -13
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +8 -736
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -181
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -229
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -2
- package/esm2022/lib/aigc/voice/audio.player.mjs +10 -52
- package/esm2022/lib/aigc/voice/class-asr.mjs +8 -79
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +8 -501
- package/esm2022/lib/aigc/voice/index.mjs +10 -3
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +8 -233
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -190
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -110
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -98
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -100
- package/esm2022/lib/nova-cloud/index.mjs +10 -2
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -148
- package/esm2022/lib/platform/cross.service.mjs +10 -63
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -236
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -130
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -462
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/storage.module.mjs +10 -41
- package/esm2022/lib/user/account/account.service.mjs +10 -221
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -62
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -373
- package/esm2022/lib/user/login/login.component.mjs +10 -913
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -273
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -115
- package/esm2022/lib/user/profile/profile.module.mjs +10 -57
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -106
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -13
- package/fesm2022/fmode-ng.mjs +7 -8895
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/voice/fmode-voice.service.d.ts +18 -1
- package/lib/aigc/voice/stream.player.d.ts +10 -0
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,38 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
numChannels: numChannels || 1, // 22 2 Mono = 1, Stereo = 2...
|
|
12
|
-
sampleRate: sampleRate || 16000, // 24 4 8000, 44100...
|
|
13
|
-
byteRate: 0, // 28 4 SampleRate*NumChannels*BitsPerSample/8
|
|
14
|
-
blockAlign: 0, // 32 2 NumChannels*BitsPerSample/8
|
|
15
|
-
bitsPerSample: bitsPerSample || 16, // 34 2 8 bits = 8, 16 bits = 16
|
|
16
|
-
subChunk2Id: [0x64, 0x61, 0x74, 0x61], // 36 4 "data" = 0x64617461
|
|
17
|
-
subChunk2Size: 0, // 40 4 data size = NumSamples*NumChannels*BitsPerSample/8
|
|
18
|
-
};
|
|
19
|
-
function u32ToArray(i) {
|
|
20
|
-
return [i & 0xff, (i >> 8) & 0xff, (i >> 16) & 0xff, (i >> 24) & 0xff];
|
|
21
|
-
}
|
|
22
|
-
function u16ToArray(i) {
|
|
23
|
-
return [i & 0xff, (i >> 8) & 0xff];
|
|
24
|
-
}
|
|
25
|
-
let pcm = new Uint8Array(pcmsrt);
|
|
26
|
-
header.blockAlign = (header.numChannels * header.bitsPerSample) >> 3;
|
|
27
|
-
header.byteRate = header.blockAlign * header.sampleRate;
|
|
28
|
-
header.subChunk2Size = pcm.length * (header.bitsPerSample >> 3);
|
|
29
|
-
header.chunkSize = 36 + header.subChunk2Size;
|
|
30
|
-
let wavHeader = header.chunkId.concat(u32ToArray(header.chunkSize), header.format, header.subChunk1Id, u32ToArray(header.subChunk1Size), u16ToArray(header.audioFormat), u16ToArray(header.numChannels), u32ToArray(header.sampleRate), u32ToArray(header.byteRate), u16ToArray(header.blockAlign), u16ToArray(header.bitsPerSample), header.subChunk2Id, u32ToArray(header.subChunk2Size));
|
|
31
|
-
let wavHeaderUnit8 = new Uint8Array(wavHeader);
|
|
32
|
-
let mergedArray = new Uint8Array(wavHeaderUnit8.length + pcm.length);
|
|
33
|
-
mergedArray.set(wavHeaderUnit8);
|
|
34
|
-
mergedArray.set(pcm, wavHeaderUnit8.length);
|
|
35
|
-
let blob = new Blob([mergedArray], { type: 'audio/wav' });
|
|
36
|
-
return blob;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGNtMndhdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvYWlnYy92b2ljZS9saWIvcGNtMndhdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWE7SUFDckUsbUNBQW1DO0lBQ25DLElBQUksTUFBTSxHQUFHO1FBQ1gsa0JBQWtCO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLGdDQUFnQztRQUNuRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLHFFQUFxRTtRQUNuRixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxnQ0FBZ0M7UUFDbEUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsZ0NBQWdDO1FBQ3ZFLGFBQWEsRUFBRSxFQUFFLEVBQUUsdUJBQXVCO1FBQzFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsb0JBQW9CO1FBQ3BDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLG9DQUFvQztRQUNuRSxVQUFVLEVBQUUsVUFBVSxJQUFJLEtBQUssRUFBRSwyQkFBMkI7UUFDNUQsUUFBUSxFQUFFLENBQUMsRUFBRSxtREFBbUQ7UUFDaEUsVUFBVSxFQUFFLENBQUMsRUFBRSx3Q0FBd0M7UUFDdkQsYUFBYSxFQUFFLGFBQWEsSUFBSSxFQUFFLEVBQUUscUNBQXFDO1FBQ3pFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLGdDQUFnQztRQUN2RSxhQUFhLEVBQUUsQ0FBQyxFQUFFLCtEQUErRDtLQUNsRixDQUFBO0lBQ0QsU0FBUyxVQUFVLENBQUMsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFDRCxTQUFTLFVBQVUsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFBO0lBQ3ZELE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDL0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUU1QyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbkMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDNUIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsV0FBVyxFQUNsQixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUNoQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUM5QixVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUM5QixVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUM3QixVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUMzQixVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUM3QixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUNoQyxNQUFNLENBQUMsV0FBVyxFQUNsQixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUNqQyxDQUFBO0lBQ0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFOUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDcEUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMvQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGZ1bmN0aW9uIHBjbXRvV2F2KHBjbXNydCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIGJpdHNQZXJTYW1wbGUpIHtcbiAgLy/lj4LmlbAtPu+8iGJhc2U2NOe8lueggeeahHBjbea1ge+8jOmHh+agt+mikeeOh++8jOWjsOmBk+aVsO+8jOmHh+agt+S9jeaVsO+8iVxuICBsZXQgaGVhZGVyID0ge1xuICAgIC8vIE9GRlMgU0laRSBOT1RFU1xuICAgIGNodW5rSWQ6IFsweDUyLCAweDQ5LCAweDQ2LCAweDQ2XSwgLy8gMCAgICA0ICAgIFwiUklGRlwiID0gMHg1MjQ5NDY0NlxuICAgIGNodW5rU2l6ZTogMCwgLy8gNCAgICA0ICAgIDM2K1N1YkNodW5rMlNpemUgPSA0Kyg4K1N1YkNodW5rMVNpemUpKyg4K1N1YkNodW5rMlNpemUpXG4gICAgZm9ybWF0OiBbMHg1NywgMHg0MSwgMHg1NiwgMHg0NV0sIC8vIDggICAgNCAgICBcIldBVkVcIiA9IDB4NTc0MTU2NDVcbiAgICBzdWJDaHVuazFJZDogWzB4NjYsIDB4NmQsIDB4NzQsIDB4MjBdLCAvLyAxMiAgIDQgICAgXCJmbXQgXCIgPSAweDY2NmQ3NDIwXG4gICAgc3ViQ2h1bmsxU2l6ZTogMTYsIC8vIDE2ICAgNCAgICAxNiBmb3IgUENNXG4gICAgYXVkaW9Gb3JtYXQ6IDEsIC8vIDIwICAgMiAgICBQQ00gPSAxXG4gICAgbnVtQ2hhbm5lbHM6IG51bUNoYW5uZWxzIHx8IDEsIC8vIDIyICAgMiAgICBNb25vID0gMSwgU3RlcmVvID0gMi4uLlxuICAgIHNhbXBsZVJhdGU6IHNhbXBsZVJhdGUgfHwgMTYwMDAsIC8vIDI0ICAgNCAgICA4MDAwLCA0NDEwMC4uLlxuICAgIGJ5dGVSYXRlOiAwLCAvLyAyOCAgIDQgICAgU2FtcGxlUmF0ZSpOdW1DaGFubmVscypCaXRzUGVyU2FtcGxlLzhcbiAgICBibG9ja0FsaWduOiAwLCAvLyAzMiAgIDIgICAgTnVtQ2hhbm5lbHMqQml0c1BlclNhbXBsZS84XG4gICAgYml0c1BlclNhbXBsZTogYml0c1BlclNhbXBsZSB8fCAxNiwgLy8gMzQgICAyICAgIDggYml0cyA9IDgsIDE2IGJpdHMgPSAxNlxuICAgIHN1YkNodW5rMklkOiBbMHg2NCwgMHg2MSwgMHg3NCwgMHg2MV0sIC8vIDM2ICAgNCAgICBcImRhdGFcIiA9IDB4NjQ2MTc0NjFcbiAgICBzdWJDaHVuazJTaXplOiAwLCAvLyA0MCAgIDQgICAgZGF0YSBzaXplID0gTnVtU2FtcGxlcypOdW1DaGFubmVscypCaXRzUGVyU2FtcGxlLzhcbiAgfVxuICBmdW5jdGlvbiB1MzJUb0FycmF5KGkpIHtcbiAgICByZXR1cm4gW2kgJiAweGZmLCAoaSA+PiA4KSAmIDB4ZmYsIChpID4+IDE2KSAmIDB4ZmYsIChpID4+IDI0KSAmIDB4ZmZdXG4gIH1cbiAgZnVuY3Rpb24gdTE2VG9BcnJheShpKSB7XG4gICAgcmV0dXJuIFtpICYgMHhmZiwgKGkgPj4gOCkgJiAweGZmXVxuICB9XG4gIGxldCBwY20gPSBuZXcgVWludDhBcnJheShwY21zcnQpXG4gIGhlYWRlci5ibG9ja0FsaWduID0gKGhlYWRlci5udW1DaGFubmVscyAqIGhlYWRlci5iaXRzUGVyU2FtcGxlKSA+PiAzXG4gIGhlYWRlci5ieXRlUmF0ZSA9IGhlYWRlci5ibG9ja0FsaWduICogaGVhZGVyLnNhbXBsZVJhdGVcbiAgaGVhZGVyLnN1YkNodW5rMlNpemUgPSBwY20ubGVuZ3RoICogKGhlYWRlci5iaXRzUGVyU2FtcGxlID4+IDMpXG4gIGhlYWRlci5jaHVua1NpemUgPSAzNiArIGhlYWRlci5zdWJDaHVuazJTaXplXG5cbiAgbGV0IHdhdkhlYWRlciA9IGhlYWRlci5jaHVua0lkLmNvbmNhdChcbiAgICB1MzJUb0FycmF5KGhlYWRlci5jaHVua1NpemUpLFxuICAgIGhlYWRlci5mb3JtYXQsXG4gICAgaGVhZGVyLnN1YkNodW5rMUlkLFxuICAgIHUzMlRvQXJyYXkoaGVhZGVyLnN1YkNodW5rMVNpemUpLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmF1ZGlvRm9ybWF0KSxcbiAgICB1MTZUb0FycmF5KGhlYWRlci5udW1DaGFubmVscyksXG4gICAgdTMyVG9BcnJheShoZWFkZXIuc2FtcGxlUmF0ZSksXG4gICAgdTMyVG9BcnJheShoZWFkZXIuYnl0ZVJhdGUpLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmJsb2NrQWxpZ24pLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmJpdHNQZXJTYW1wbGUpLFxuICAgIGhlYWRlci5zdWJDaHVuazJJZCxcbiAgICB1MzJUb0FycmF5KGhlYWRlci5zdWJDaHVuazJTaXplKVxuICApXG4gIGxldCB3YXZIZWFkZXJVbml0OCA9IG5ldyBVaW50OEFycmF5KHdhdkhlYWRlcilcblxuICBsZXQgbWVyZ2VkQXJyYXkgPSBuZXcgVWludDhBcnJheSh3YXZIZWFkZXJVbml0OC5sZW5ndGggKyBwY20ubGVuZ3RoKVxuICBtZXJnZWRBcnJheS5zZXQod2F2SGVhZGVyVW5pdDgpXG4gIG1lcmdlZEFycmF5LnNldChwY20sIHdhdkhlYWRlclVuaXQ4Lmxlbmd0aClcbiAgbGV0IGJsb2IgPSBuZXcgQmxvYihbbWVyZ2VkQXJyYXldLCB7IHR5cGU6ICdhdWRpby93YXYnIH0pXG4gIHJldHVybiBibG9iXG59XG4iXX0=
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/lib/pcm2wav.mjs
|
|
7
|
+
*/
|
|
8
|
+
export function pcmtoWav(e,n,u,r){let a={chunkId:[82,73,70,70],chunkSize:0,format:[87,65,86,69],subChunk1Id:[102,109,116,32],subChunk1Size:16,audioFormat:1,numChannels:u||1,sampleRate:n||16e3,byteRate:0,blockAlign:0,bitsPerSample:r||16,subChunk2Id:[100,97,116,97],subChunk2Size:0};function u32ToArray(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function u16ToArray(e){return[255&e,e>>8&255]}let t=new Uint8Array(e);a.blockAlign=a.numChannels*a.bitsPerSample>>3,a.byteRate=a.blockAlign*a.sampleRate,a.subChunk2Size=t.length*(a.bitsPerSample>>3),a.chunkSize=36+a.subChunk2Size;let o=a.chunkId.concat(u32ToArray(a.chunkSize),a.format,a.subChunk1Id,u32ToArray(a.subChunk1Size),u16ToArray(a.audioFormat),u16ToArray(a.numChannels),u32ToArray(a.sampleRate),u32ToArray(a.byteRate),u16ToArray(a.blockAlign),u16ToArray(a.bitsPerSample),a.subChunk2Id,u32ToArray(a.subChunk2Size)),i=new Uint8Array(o),l=new Uint8Array(i.length+t.length);return l.set(i),l.set(t,i.length),new Blob([l],{type:"audio/wav"})}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL2xpYi9wY20yd2F2Lm1qcw==`
|
|
10
|
+
|
|
@@ -1,34 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export function convertFrameBufferToBase64(frameBuffer) {
|
|
12
|
-
// 创建一个存储转换后数据的Uint8Array
|
|
13
|
-
const uint8Array = new Uint8Array(frameBuffer.length * 2); // 16位小端LE,每个样本占用2个字节
|
|
14
|
-
// 将frameBuffer中的每个样本转换为16位小端字节序
|
|
15
|
-
for (let i = 0; i < frameBuffer.length; i++) {
|
|
16
|
-
const sample = frameBuffer[i];
|
|
17
|
-
uint8Array[i * 2] = sample & 0xff; // 低字节
|
|
18
|
-
uint8Array[i * 2 + 1] = (sample >> 8) & 0xff; // 高字节
|
|
19
|
-
}
|
|
20
|
-
// 使用btoa函数将Uint8Array转换为base64字符串
|
|
21
|
-
const base64String = btoa(String.fromCharCode.apply(null, uint8Array));
|
|
22
|
-
return base64String;
|
|
23
|
-
}
|
|
24
|
-
export function resampleBuffer(buffer, fromRate, toRate) {
|
|
25
|
-
const ratio = fromRate / toRate;
|
|
26
|
-
const length = Math.round(buffer.length / ratio);
|
|
27
|
-
const result = new Int16Array(length);
|
|
28
|
-
for (let i = 0; i < length; i++) {
|
|
29
|
-
const j = Math.floor(i * ratio);
|
|
30
|
-
result[i] = buffer[j];
|
|
31
|
-
}
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzYW1wbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2Mvdm9pY2UvbGliL3Jlc2FtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxlQUF1QixFQUFFLGdCQUF3QjtJQUNsRyxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ3JDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztJQUNsRixJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7SUFFaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNqRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUgsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFdBQXFCO0lBQ2hFLHlCQUF5QjtJQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCO0lBRWhGLGdDQUFnQztJQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNO1FBQ3pDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU07SUFDeEQsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxZQUFZLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQWM7SUFDakYsTUFBTSxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVBdWRpbyhmcmFtZUJ1ZmZlcjogbnVtYmVyW10sIGlucHV0U2FtcGxlUmF0ZTogbnVtYmVyLCBvdXRwdXRTYW1wbGVSYXRlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgbGV0IGlucHV0TGVuZ3RoID0gZnJhbWVCdWZmZXIubGVuZ3RoO1xuICAgIGxldCBvdXRwdXRMZW5ndGggPSBNYXRoLmZsb29yKChpbnB1dExlbmd0aCAvIGlucHV0U2FtcGxlUmF0ZSkgKiBvdXRwdXRTYW1wbGVSYXRlKTtcbiAgICBsZXQgb3V0cHV0QnVmZmVyOiBudW1iZXJbXSA9IFtdO1xuICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dExlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKGkgKiAoaW5wdXRTYW1wbGVSYXRlIC8gb3V0cHV0U2FtcGxlUmF0ZSkpO1xuICAgICAgb3V0cHV0QnVmZmVyW2ldID0gZnJhbWVCdWZmZXJbaW5kZXhdO1xuICAgIH1cbiAgXG4gICAgcmV0dXJuIG91dHB1dEJ1ZmZlcjtcbiAgfVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyYW1lQnVmZmVyVG9CYXNlNjQoZnJhbWVCdWZmZXI6IG51bWJlcltdKTogc3RyaW5nIHtcbi8vIOWIm+W7uuS4gOS4quWtmOWCqOi9rOaNouWQjuaVsOaNrueahFVpbnQ4QXJyYXlcbmNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShmcmFtZUJ1ZmZlci5sZW5ndGggKiAyKTsgLy8gMTbkvY3lsI/nq69MRe+8jOavj+S4quagt+acrOWNoOeUqDLkuKrlrZfoioJcblxuLy8g5bCGZnJhbWVCdWZmZXLkuK3nmoTmr4/kuKrmoLfmnKzovazmjaLkuLoxNuS9jeWwj+err+Wtl+iKguW6j1xuZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNhbXBsZSA9IGZyYW1lQnVmZmVyW2ldO1xuICAgIHVpbnQ4QXJyYXlbaSAqIDJdID0gc2FtcGxlICYgMHhmZjsgLy8g5L2O5a2X6IqCXG4gICAgdWludDhBcnJheVtpICogMiArIDFdID0gKHNhbXBsZSA+PiA4KSAmIDB4ZmY7IC8vIOmrmOWtl+iKglxufVxuXG4vLyDkvb/nlKhidG9h5Ye95pWw5bCGVWludDhBcnJheei9rOaNouS4umJhc2U2NOWtl+espuS4slxuY29uc3QgYmFzZTY0U3RyaW5nID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHVpbnQ4QXJyYXkpKTtcblxucmV0dXJuIGJhc2U2NFN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlQnVmZmVyKGJ1ZmZlcjogSW50MTZBcnJheSwgZnJvbVJhdGU6IG51bWJlciwgdG9SYXRlOiBudW1iZXIpOiBJbnQxNkFycmF5IHtcbiAgY29uc3QgcmF0aW8gPSBmcm9tUmF0ZSAvIHRvUmF0ZTtcbiAgY29uc3QgbGVuZ3RoID0gTWF0aC5yb3VuZChidWZmZXIubGVuZ3RoIC8gcmF0aW8pO1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW50MTZBcnJheShsZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBqID0gTWF0aC5mbG9vcihpICogcmF0aW8pO1xuICAgIHJlc3VsdFtpXSA9IGJ1ZmZlcltqXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59Il19
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/lib/resample.mjs
|
|
7
|
+
*/
|
|
8
|
+
export function resampleAudio(t,r,e){let o=t.length,n=Math.floor(o/r*e),l=[];for(let o=0;o<n;o++){let n=Math.floor(o*(r/e));l[o]=t[n]}return l}export function convertFrameBufferToBase64(t){const r=new Uint8Array(2*t.length);for(let e=0;e<t.length;e++){const o=t[e];r[2*e]=255&o,r[2*e+1]=o>>8&255}return btoa(String.fromCharCode.apply(null,r))}export function resampleBuffer(t,r,e){const o=r/e,n=Math.round(t.length/o),l=new Int16Array(n);for(let r=0;r<n;r++){const e=Math.floor(r*o);l[r]=t[e]}return l}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL2xpYi9yZXNhbXBsZS5tanM=`
|
|
10
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/stream.player.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{PushAudioOutputStreamCallback}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/Audio/PushAudioOutputStreamCallback";export class FmPushAudioOutputStreamCallback extends PushAudioOutputStreamCallback{constructor(){super(),this.audioContext=new window.AudioContext,this.source=null,this.buffer=[]}write(t){new Float32Array(t);this.buffer.push(t),this.playAudio()}playAudio(){this.source&&this.source.stop();const t=this.buffer.reduce(((t,e)=>t+e.length),0),e=new Float32Array(t);let s=0;for(const t of this.buffer)e.set(t,s),s+=t.length;const o=this.audioContext.createBuffer(1,e.length,this.audioContext.sampleRate);o.copyToChannel(e,0),this.source=this.audioContext.createBufferSource(),this.source.buffer=o,this.source.connect(this.audioContext.destination),this.source.start(),this.buffer=[]}close(){this.source&&this.source.stop(),this.audioContext.close()}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3N0cmVhbS5wbGF5ZXIubWpz`
|
|
10
|
+
|
|
@@ -1,235 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { SpeechSynthesizer } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";
|
|
3
|
-
import { SpeechConfig } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";
|
|
4
|
-
import { ResultReason } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";
|
|
5
|
-
import Parse from "parse";
|
|
6
|
-
import { AudioPlayer } from "../audio.player";
|
|
7
|
-
/**
|
|
8
|
-
* FmodeTTS
|
|
9
|
-
* 每个类,表示一次独立的语音合成服务
|
|
10
|
-
*/
|
|
11
|
-
export class FmodeTTS {
|
|
12
|
-
constructor(config, uploadServ) {
|
|
13
|
-
this.uploadServ = uploadServ;
|
|
14
|
-
this.subscriptionKey = config?.subscriptionKey;
|
|
15
|
-
this.authorizationToken = config?.token;
|
|
16
|
-
this.region = config?.region;
|
|
17
|
-
if (this.subscriptionKey) { // 直接资源APIKEY,调试或后端是使用
|
|
18
|
-
this.speechConfig = SpeechConfig.fromSubscription(this.subscriptionKey, this.region);
|
|
19
|
-
}
|
|
20
|
-
if (this.authorizationToken) { // 加载调用STSToken,客户端使用
|
|
21
|
-
this.speechConfig = SpeechConfig.fromAuthorizationToken(this.authorizationToken, this.region);
|
|
22
|
-
// console.log(this.authorizationToken,this.speechConfig)
|
|
23
|
-
}
|
|
24
|
-
// console.log(this.speechConfig)
|
|
25
|
-
// this.audioConfig = AudioConfig.fromDefaultSpeakerOutput();
|
|
26
|
-
// this.synthesizer = new Microsoft.CognitiveServices.SpeechSDK.SpeechSynthesizer(this.speechConfig, this.audioConfig);
|
|
27
|
-
this.synthesizer = new SpeechSynthesizer(this.speechConfig
|
|
28
|
-
// this.audioConfig
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
extractTextFromXML(inputString) {
|
|
32
|
-
// 正则表达式匹配 XML 标签,并提取标签之间的文本内容
|
|
33
|
-
const regex = />([^<]+)</g;
|
|
34
|
-
let matches;
|
|
35
|
-
let result = [];
|
|
36
|
-
// 使用 exec 方法循环查找所有匹配
|
|
37
|
-
while ((matches = regex.exec(inputString)) !== null) {
|
|
38
|
-
// matches[1] 是标签之间的文本内容,去除首尾空白
|
|
39
|
-
const text = matches[1].trim();
|
|
40
|
-
if (text) {
|
|
41
|
-
result.push(text);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// 返回合并后的纯文本内容(用空格衔接)
|
|
45
|
-
return result.join(' ');
|
|
46
|
-
}
|
|
47
|
-
extractSSMLContent(inputString) {
|
|
48
|
-
var regex = /<speak.*?<\/speak>/s;
|
|
49
|
-
var match = inputString.match(regex);
|
|
50
|
-
if (match) {
|
|
51
|
-
return match[0];
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
return inputString;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
|
|
57
2
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* SSML https://learn.microsoft.com/zh-cn/azure/ai-services/speech-service/how-to-speech-synthesis?tabs=browserjs%2Cterminal&pivots=programming-language-javascript#use-ssml-to-customize-speech-characteristics
|
|
63
|
-
* @returns
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs
|
|
64
7
|
*/
|
|
65
|
-
async speakAsync(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
let ChatVoice = Parse.Object.extend("ChatVoice");
|
|
69
|
-
chatVoice = new ChatVoice();
|
|
70
|
-
chatVoice.set("ssml", textOrSSML);
|
|
71
|
-
chatVoice.set("content", this.extractTextFromXML(textOrSSML));
|
|
72
|
-
let company = localStorage.getItem("company");
|
|
73
|
-
company && chatVoice.set("company", { __type: "Pointer", className: "Company", objectId: company });
|
|
74
|
-
Parse.User.current()?.id && chatVoice.set("user", Parse.User.current().toPointer());
|
|
75
|
-
}
|
|
76
|
-
// 加载缓存中存在的音频文件
|
|
77
|
-
if (!chatVoice?.get("voiceFile")) {
|
|
78
|
-
let orList = [];
|
|
79
|
-
if (chatVoice?.get("content")) {
|
|
80
|
-
orList.push({ content: chatVoice?.get("content") });
|
|
81
|
-
}
|
|
82
|
-
if (textOrSSML) {
|
|
83
|
-
orList.push({ ssml: textOrSSML });
|
|
84
|
-
}
|
|
85
|
-
let query = Parse.Query.fromJSON("ChatVoice", {
|
|
86
|
-
include: "voiceFile",
|
|
87
|
-
where: {
|
|
88
|
-
$or: orList
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
let exists = await query.first();
|
|
92
|
-
chatVoice.set("voiceFile", exists?.get("voiceFile"));
|
|
93
|
-
}
|
|
94
|
-
if (chatVoice?.get("voiceFile")) { // 存在音频则加载后直接播放
|
|
95
|
-
this.playAudioData(chatVoice?.get("voiceFile")?.get("url"), chatVoice, eventMap);
|
|
96
|
-
return chatVoice;
|
|
97
|
-
}
|
|
98
|
-
// 正则匹配SSML部分
|
|
99
|
-
textOrSSML = this.extractSSMLContent(textOrSSML);
|
|
100
|
-
// console.log(textOrSSML)
|
|
101
|
-
// 播放语音
|
|
102
|
-
return new Promise((resolve, reject) => {
|
|
103
|
-
const startTime = Date.now();
|
|
104
|
-
let speekType = 'speakTextAsync';
|
|
105
|
-
if (textOrSSML?.indexOf("<") > -1) {
|
|
106
|
-
speekType = "speakSsmlAsync";
|
|
107
|
-
}
|
|
108
|
-
// 音频输出流
|
|
109
|
-
// Create an audio output stream
|
|
110
|
-
// const audioOutputStream = Microsoft.CognitiveServices.SpeechSDK.AudioOutputStream.createPullStream();
|
|
111
|
-
// Create an audio configuration using the audio output stream
|
|
112
|
-
// const audioConfig = Microsoft.CognitiveServices.SpeechSDK.AudioConfig.fromStreamOutput(audioOutputStream);
|
|
113
|
-
// 播放组件
|
|
114
|
-
// Get the audio data from the callback and create a Blob
|
|
115
|
-
// const audioBlob = audioOutputStream.audioBlob();
|
|
116
|
-
// const audioUrl = URL.createObjectURL(audioBlob);
|
|
117
|
-
// const audioElement = new Audio(audioUrl);
|
|
118
|
-
// console.log(textOrSSML)
|
|
119
|
-
this.eventMap?.onSpeakBefore && this.eventMap?.onSpeakBefore();
|
|
120
|
-
this.synthesizer[speekType](textOrSSML, result => {
|
|
121
|
-
/**
|
|
122
|
-
*
|
|
123
|
-
* @desc
|
|
124
|
-
* {
|
|
125
|
-
privAudioData: undefined
|
|
126
|
-
privAudioDuration: undefined
|
|
127
|
-
privErrorDetails: "Unable to contact server. StatusCode: 1006,\n wss://eastasia.tts.speech.microsoft.com/cognitiveservices/websocket/v1 Reason: undefined"
|
|
128
|
-
privProperties: PropertyCollection {privKeys: Array(1), privValues: Array(1)}
|
|
129
|
-
privReason: 1
|
|
130
|
-
privResultId: "539694CFA6CB4BAD97F90AF76E608E69"
|
|
131
|
-
audioData: (...)
|
|
132
|
-
audioDuration: (...)
|
|
133
|
-
errorDetails: (...)
|
|
134
|
-
properties: (...)
|
|
135
|
-
reason: (...)
|
|
136
|
-
resultId: (...)
|
|
137
|
-
}
|
|
138
|
-
*/
|
|
139
|
-
// console.log(result)
|
|
140
|
-
// console.log(result.resultId)
|
|
141
|
-
// console.log(result.reason)
|
|
142
|
-
console.log(result);
|
|
143
|
-
if (result.reason === ResultReason.SynthesizingAudioCompleted) {
|
|
144
|
-
this.eventMap?.onAudioCompleted && this.eventMap?.onAudioCompleted();
|
|
145
|
-
const endTime = Date.now();
|
|
146
|
-
let audioData = result?.audioData;
|
|
147
|
-
chatVoice.set("duration", Number(result?.audioDuration) / 10000);
|
|
148
|
-
this.playAudioData(audioData, chatVoice, eventMap);
|
|
149
|
-
console.log(`Audio synthesis finished. Duration: ${endTime - startTime} ms`);
|
|
150
|
-
setTimeout(() => {
|
|
151
|
-
eventMap?.onStop() && eventMap?.onStop();
|
|
152
|
-
}, 2000);
|
|
153
|
-
resolve(chatVoice);
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
reject(`Speech synthesis failed. Reason: ${result.errorDetails}`);
|
|
157
|
-
}
|
|
158
|
-
}, error => {
|
|
159
|
-
reject(`Error occurred during synthesis: ${error}`);
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// 把打断时的事件
|
|
164
|
-
onBreak(options) {
|
|
165
|
-
}
|
|
166
|
-
playAudioData(audioData, chatVoice, eventMap) {
|
|
167
|
-
let url;
|
|
168
|
-
console.log("audioData", audioData);
|
|
169
|
-
if (audioData?.indexOf && audioData?.indexOf("http") >= -1) { // 播放URL
|
|
170
|
-
url = audioData;
|
|
171
|
-
}
|
|
172
|
-
else { // 播放音频数据
|
|
173
|
-
let blob = new Blob([audioData], { type: 'audio/wav' });
|
|
174
|
-
url = URL.createObjectURL(blob);
|
|
175
|
-
this.uploadAndSaveVoice(blob, chatVoice);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
// 仅URL需要播放,tts合成会自动播放
|
|
179
|
-
// let audio = new Audio(url)
|
|
180
|
-
const audioPlayer = AudioPlayer.getInstance();
|
|
181
|
-
eventMap?.onStart && eventMap?.onStart(chatVoice);
|
|
182
|
-
audioPlayer.setAudioEvent("onloadeddata", () => {
|
|
183
|
-
let duration = audioPlayer.duration * 1000;
|
|
184
|
-
console.log("duration", duration);
|
|
185
|
-
if (!chatVoice?.get("duration")) {
|
|
186
|
-
chatVoice?.set("duration", duration);
|
|
187
|
-
chatVoice?.save();
|
|
188
|
-
}
|
|
189
|
-
eventMap?.onLoaded && eventMap?.onLoaded(audioPlayer);
|
|
190
|
-
});
|
|
191
|
-
audioPlayer.setAudioEvent("onabort", () => {
|
|
192
|
-
eventMap?.onStop && eventMap?.onStop();
|
|
193
|
-
});
|
|
194
|
-
audioPlayer.setAudioEvent("onerror", () => {
|
|
195
|
-
eventMap?.onStop && eventMap?.onStop();
|
|
196
|
-
});
|
|
197
|
-
audioPlayer.setAudioEvent("onpause", () => {
|
|
198
|
-
eventMap?.onStop && eventMap?.onStop();
|
|
199
|
-
});
|
|
200
|
-
audioPlayer.setAudioEvent("onended", () => {
|
|
201
|
-
eventMap?.onStop && eventMap?.onStop();
|
|
202
|
-
});
|
|
203
|
-
audioPlayer.setAudioEvent("onclose", () => {
|
|
204
|
-
eventMap?.onStop && eventMap?.onStop();
|
|
205
|
-
});
|
|
206
|
-
let playAudio = () => {
|
|
207
|
-
audioPlayer.play(url).then(() => {
|
|
208
|
-
}).catch(() => {
|
|
209
|
-
setTimeout(() => {
|
|
210
|
-
console.log("playAudio");
|
|
211
|
-
playAudio();
|
|
212
|
-
}, 200);
|
|
213
|
-
});
|
|
214
|
-
};
|
|
215
|
-
playAudio();
|
|
216
|
-
}
|
|
217
|
-
async uploadAndSaveVoice(blob, chatVoice) {
|
|
218
|
-
if (this.uploadServ) {
|
|
219
|
-
let id = chatVoice?.id || this.uploadServ?.genMd5(chatVoice?.get("content") || chatVoice?.get("ssml"));
|
|
220
|
-
let now = new Date();
|
|
221
|
-
let filename = id + now.getFullYear() + (now.getMonth() + 1) + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds() + ".wav";
|
|
222
|
-
let file = new File([blob], filename, { type: 'audio/wav' });
|
|
223
|
-
let fileResult = await this.uploadServ.upload(file, (res) => {
|
|
224
|
-
console.log(res); // 上传进度,可以同步更新页面上传百分比
|
|
225
|
-
});
|
|
226
|
-
let attachPointer = { __type: "Pointer", className: "Attachment", objectId: fileResult?.id };
|
|
227
|
-
if (attachPointer?.objectId) {
|
|
228
|
-
chatVoice.set("voiceFile", attachPointer);
|
|
229
|
-
chatVoice = await chatVoice.save();
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUtdHRzLWNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9haWdjL3ZvaWNlL3R0cy9mbW9kZS10dHMtY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEscUhBQXFIO0FBQ3JILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhFQUE4RSxDQUFDO0FBQy9HLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx5RUFBeUUsQ0FBQztBQUNyRyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUVBQXlFLENBQUM7QUFDckcsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVc5Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFZLE1BSVgsRUFBQyxVQUE2QjtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sRUFBRSxlQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQzdCLElBQUcsSUFBSSxDQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMsc0JBQXNCO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBQyxDQUFDLENBQUMscUJBQXFCO1lBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJ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QztRQUNsRCxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxHQUFFLEVBQUU7WUFDMUMsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQztnQkFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBQ0QsUUFBUSxFQUFFLFFBQVEsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFBO1FBRUYsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxTQUFTLEdBQUcsR0FBRSxFQUFFO1lBQ2hCLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUUsRUFBRTtZQUMvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRSxFQUFFO2dCQUNULFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtvQkFDeEIsU0FBUyxFQUFFLENBQUM7Z0JBQ2hCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFBO1FBQ0QsU0FBUyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUNELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUMsU0FBUztRQUNuQyxJQUFHLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ3BHLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFBO1lBQ2hJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLHFCQUFxQjtZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksYUFBYSxHQUFHLEVBQUMsTUFBTSxFQUFDLFNBQVMsRUFBQyxTQUFTLEVBQUMsWUFBWSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUUsRUFBRSxFQUFDLENBQUE7WUFDckYsSUFBRyxhQUFhLEVBQUUsUUFBUSxFQUFDLENBQUM7Z0JBQ3hCLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUN4QyxTQUFTLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFNO0lBQ1YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgc2RrIGZyb20gXCJtaWNyb3NvZnQtY29nbml0aXZlc2VydmljZXMtc3BlZWNoLXNka1wiO1xuZGVjbGFyZSB2YXIgTWljcm9zb2Z0OmFueVxuLy8gaW1wb3J0IFwibWljcm9zb2Z0LWNvZ25pdGl2ZXNlcnZpY2VzLXNwZWVjaC1zZGsvZGlzdHJpYi9icm93c2VyL21pY3Jvc29mdC5jb2duaXRpdmVzZXJ2aWNlcy5zcGVlY2guc2RrLmJ1bmRsZS1taW5cIjtcbmltcG9ydCB7U3BlZWNoU3ludGhlc2l6ZXJ9IGZyb20gXCJtaWNyb3NvZnQtY29nbml0aXZlc2VydmljZXMtc3BlZWNoLXNkay9kaXN0cmliL2xpYi9zcmMvc2RrL1NwZWVjaFN5bnRoZXNpemVyXCI7XG5pbXBvcnQge1NwZWVjaENvbmZpZ30gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvU3BlZWNoQ29uZmlnXCI7XG5pbXBvcnQge1Jlc3VsdFJlYXNvbn0gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvUmVzdWx0UmVhc29uXCI7XG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XG5pbXBvcnQgeyBOb3ZhVXBsb2FkU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF1ZGlvQ29uZmlnIH0gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvQXVkaW8vQXVkaW9Db25maWdcIjtcbmltcG9ydCB7IEF1ZGlvUGxheWVyIH0gZnJvbSBcIi4uL2F1ZGlvLnBsYXllclwiO1xuXG4vLyBNaWNyb3NvZnQ/LkNvZ25pdGl2ZVNlcnZpY2VzPy5TcGVlY2hTREs/XG5pbnRlcmZhY2UgRm1vZGVUVFNFdmVudHtcbiAgICAgICAgLy8g5byA5aeL5YmNXG4gICAgICAgIG9uU3BlYWtCZWZvcmU/KCk6dm9pZDtcbiAgICAgICAgLy8g5rWB5Yqg6L2956ys5LiA5q616Z+z6aKR5byA5aeLXG4gICAgICAgIG9uU3RyZWFtU3RhcnRlZD8oKTp2b2lkO1xuICAgICAgICAvLyDpn7PpopHlhajpg6jliqDovb3lrozmiJBcbiAgICAgICAgb25BdWRpb0NvbXBsZXRlZD8oKTp2b2lkOyAvLyBzc21s6ISa5pys5ZCI5oiQXG59XG4vKipcbiAqIEZtb2RlVFRTXG4gKiDmr4/kuKrnsbvvvIzooajnpLrkuIDmrKHni6znq4vnmoTor63pn7PlkIjmiJDmnI3liqFcbiAqL1xuZXhwb3J0IGNsYXNzIEZtb2RlVFRTe1xuICAgIHByaXZhdGUgc3BlZWNoQ29uZmlnOmFueTtcbiAgICBwcml2YXRlIGF1ZGlvQ29uZmlnOmFueTtcbiAgICBwcml2YXRlIHN5bnRoZXNpemVyOmFueTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbktleTogc3RyaW5nO1xuICAgIHByaXZhdGUgYXV0aG9yaXphdGlvblRva2VuOnN0cmluZztcbiAgICBwcml2YXRlIHJlZ2lvbjogc3RyaW5nO1xuICAgIGV2ZW50TWFwOkZtb2RlVFRTRXZlbnRcbiAgICB1cGxvYWRTZXJ2PzpOb3ZhVXBsb2FkU2VydmljZVxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzp7XG4gICAgICAgIHJlZ2lvbjpzdHJpbmcsXG4gICAgICAgIHN1YnNjcmlwdGlvbktleTpzdHJpbmcsXG4gICAgICAgIHRva2VuOnN0cmluZyxcbiAgICB9LHVwbG9hZFNlcnY/Ok5vdmFVcGxvYWRTZXJ2aWNlKXtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2ID0gdXBsb2FkU2VydjtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25LZXkgPSBjb25maWc/LnN1YnNjcmlwdGlvbktleTtcbiAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVG9rZW4gPSBjb25maWc/LnRva2VuO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IGNvbmZpZz8ucmVnaW9uO1xuICAgICAgICBpZih0aGlzLnN1YnNjcmlwdGlvbktleSl7IC8vIOebtOaOpei1hOa6kEFQSUtFWe+8jOiwg+ivleaIluWQjuerr+aYr+S9v+eUqFxuICAgICAgICAgICAgdGhpcy5zcGVlY2hDb25maWcgPSBTcGVlY2hDb25maWcuZnJvbVN1YnNjcmlwdGlvbih0aGlzLnN1YnNjcmlwdGlvbktleSwgdGhpcy5yZWdpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuYXV0aG9yaXphdGlvblRva2VuKXsgLy8g5Yqg6L296LCD55SoU1RTVG9rZW7vvIzlrqLmiLfnq6/kvb/nlKhcbiAgICAgICAgICAgIHRoaXMuc3BlZWNoQ29uZmlnID0gU3BlZWNoQ29uZmlnLmZyb21BdXRob3JpemF0aW9uVG9rZW4odGhpcy5hdXRob3JpemF0aW9uVG9rZW4sIHRoaXMucmVnaW9uKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYXV0aG9yaXphdGlvblRva2VuLHRoaXMuc3BlZWNoQ29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3BlZWNoQ29uZmlnKVxuICAgICAgICAvLyB0aGlzLmF1ZGlvQ29uZmlnID0gQXVkaW9Db25maWcuZnJvbURlZmF1bHRTcGVha2VyT3V0cHV0KCk7XG4gICAgICAgIC8vIHRoaXMuc3ludGhlc2l6ZXIgPSBuZXcgTWljcm9zb2Z0LkNvZ25pdGl2ZVNlcnZpY2VzLlNwZWVjaFNESy5TcGVlY2hTeW50aGVzaXplcih0aGlzLnNwZWVjaENvbmZpZywgdGhpcy5hdWRpb0NvbmZpZyk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZXIgPSBuZXcgU3BlZWNoU3ludGhlc2l6ZXIodGhpcy5zcGVlY2hDb25maWdcbiAgICAgICAgICAgIC8vIHRoaXMuYXVkaW9Db25maWdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBleHRyYWN0VGV4dEZyb21YTUwoaW5wdXRTdHJpbmcpe1xuICAgICAgICAvLyDmraPliJnooajovr7lvI/ljLnphY0gWE1MIOagh+etvu+8jOW5tuaPkOWPluagh+etvuS5i+mXtOeahOaWh+acrOWGheWuuVxuICAgICAgICBjb25zdCByZWdleCA9IC8+KFtePF0rKTwvZztcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgICAgICAvLyDkvb/nlKggZXhlYyDmlrnms5Xlvqrnjq/mn6Xmib7miYDmnInljLnphY1cbiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gcmVnZXguZXhlYyhpbnB1dFN0cmluZykpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBtYXRjaGVzWzFdIOaYr+agh+etvuS5i+mXtOeahOaWh+acrOWGheWuue+8jOWOu+mZpOmmluWwvuepuueZvVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IG1hdGNoZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOi/lOWbnuWQiOW5tuWQjueahOe6r+aWh+acrOWGheWuue+8iOeUqOepuuagvOihlOaOpe+8iVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyAnKTtcbiAgICB9XG4gICAgZXh0cmFjdFNTTUxDb250ZW50KGlucHV0U3RyaW5nKSB7XG4gICAgICAgIHZhciByZWdleCA9IC88c3BlYWsuKj88XFwvc3BlYWs+L3M7XG4gICAgICAgIHZhciBtYXRjaCA9IGlucHV0U3RyaW5nLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOWQiOaIkOivreiogOW5tuaSreaUvlxuICAgICAqIEBwYXJhbSB0ZXh0T3JTU01MIFxuICAgICAqIEBkZXNjXG4gICAgICog5pmu6YCa5paH5pysXG4gICAgICogU1NNTCBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vemgtY24vYXp1cmUvYWktc2VydmljZXMvc3BlZWNoLXNlcnZpY2UvaG93LXRvLXNwZWVjaC1zeW50aGVzaXM/dGFicz1icm93c2VyanMlMkN0ZXJtaW5hbCZwaXZvdHM9cHJvZ3JhbW1pbmctbGFuZ3VhZ2UtamF2YXNjcmlwdCN1c2Utc3NtbC10by1jdXN0b21pemUtc3BlZWNoLWNoYXJhY3RlcmlzdGljc1xuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzcGVha0FzeW5jKHRleHRPclNTTUw6IHN0cmluZyxjaGF0Vm9pY2U/OlBhcnNlLk9iamVjdCxldmVudE1hcD86YW55KTogUHJvbWlzZTxQYXJzZS5PYmplY3Q+IHtcblxuICAgICAgICAvLyDliJ3lp4vljJbmnKzmrKHlkIjmiJDor63pn7PmlbDmja7lr7nosaFcbiAgICAgICAgaWYoIWNoYXRWb2ljZSl7XG4gICAgICAgICAgICBsZXQgQ2hhdFZvaWNlID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkNoYXRWb2ljZVwiKTtcbiAgICAgICAgICAgIGNoYXRWb2ljZSA9IG5ldyBDaGF0Vm9pY2UoKTtcbiAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzc21sXCIsdGV4dE9yU1NNTCk7XG4gICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwiY29udGVudFwiLHRoaXMuZXh0cmFjdFRleHRGcm9tWE1MKHRleHRPclNTTUwpKTtcbiAgICAgICAgICAgIGxldCBjb21wYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXG4gICAgICAgICAgICBjb21wYW55JiZjaGF0Vm9pY2Uuc2V0KFwiY29tcGFueVwiLHtfX3R5cGU6XCJQb2ludGVyXCIsY2xhc3NOYW1lOlwiQ29tcGFueVwiLG9iamVjdElkOmNvbXBhbnl9KTtcbiAgICAgICAgICAgIFBhcnNlLlVzZXIuY3VycmVudCgpPy5pZCYmY2hhdFZvaWNlLnNldChcInVzZXJcIixQYXJzZS5Vc2VyLmN1cnJlbnQoKS50b1BvaW50ZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yqg6L2957yT5a2Y5Lit5a2Y5Zyo55qE6Z+z6aKR5paH5Lu2XG4gICAgICAgIGlmKCFjaGF0Vm9pY2U/LmdldChcInZvaWNlRmlsZVwiKSl7XG4gICAgICAgICAgICBsZXQgb3JMaXN0ID0gW11cbiAgICAgICAgICAgIGlmKGNoYXRWb2ljZT8uZ2V0KFwiY29udGVudFwiKSl7XG4gICAgICAgICAgICAgICAgb3JMaXN0LnB1c2goe2NvbnRlbnQ6Y2hhdFZvaWNlPy5nZXQoXCJjb250ZW50XCIpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRleHRPclNTTUwpe1xuICAgICAgICAgICAgICAgIG9yTGlzdC5wdXNoKHtzc21sOnRleHRPclNTTUx9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gUGFyc2UuUXVlcnkuZnJvbUpTT04oXCJDaGF0Vm9pY2VcIix7XG4gICAgICAgICAgICAgICAgaW5jbHVkZTpcInZvaWNlRmlsZVwiLFxuICAgICAgICAgICAgICAgIHdoZXJlOntcbiAgICAgICAgICAgICAgICAgICAgJG9yOm9yTGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHF1ZXJ5LmZpcnN0KCk7XG4gICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwidm9pY2VGaWxlXCIsZXhpc3RzPy5nZXQoXCJ2b2ljZUZpbGVcIikpXG4gICAgICAgIH1cblxuICAgICAgICBpZihjaGF0Vm9pY2U/LmdldChcInZvaWNlRmlsZVwiKSl7IC8vIOWtmOWcqOmfs+mikeWImeWKoOi9veWQjuebtOaOpeaSreaUvlxuICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW9EYXRhKGNoYXRWb2ljZT8uZ2V0KFwidm9pY2VGaWxlXCIpPy5nZXQoXCJ1cmxcIiksY2hhdFZvaWNlLGV2ZW50TWFwKVxuICAgICAgICAgICAgcmV0dXJuIGNoYXRWb2ljZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOato+WImeWMuemFjVNTTUzpg6jliIZcbiAgICAgICAgdGV4dE9yU1NNTCA9IHRoaXMuZXh0cmFjdFNTTUxDb250ZW50KHRleHRPclNTTUwpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0ZXh0T3JTU01MKVxuICAgICAgICAvLyDmkq3mlL7or63pn7NcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgc3BlZWtUeXBlID0gJ3NwZWFrVGV4dEFzeW5jJ1xuICAgICAgICAgICAgaWYodGV4dE9yU1NNTD8uaW5kZXhPZihcIjxcIik+LTEpe1xuICAgICAgICAgICAgICAgIHNwZWVrVHlwZSA9IFwic3BlYWtTc21sQXN5bmNcIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDpn7PpopHovpPlh7rmtYFcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBhdWRpbyBvdXRwdXQgc3RyZWFtXG4gICAgICAgICAgICAvLyBjb25zdCBhdWRpb091dHB1dFN0cmVhbSA9IE1pY3Jvc29mdC5Db2duaXRpdmVTZXJ2aWNlcy5TcGVlY2hTREsuQXVkaW9PdXRwdXRTdHJlYW0uY3JlYXRlUHVsbFN0cmVhbSgpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGF1ZGlvIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW1cbiAgICAgICAgICAgIC8vIGNvbnN0IGF1ZGlvQ29uZmlnID0gTWljcm9zb2Z0LkNvZ25pdGl2ZVNlcnZpY2VzLlNwZWVjaFNESy5BdWRpb0NvbmZpZy5mcm9tU3RyZWFtT3V0cHV0KGF1ZGlvT3V0cHV0U3RyZWFtKTtcblxuICAgICAgICAgICAgLy8g5pKt5pS+57uE5Lu2XG4gICAgICAgICAgICAgLy8gR2V0IHRoZSBhdWRpbyBkYXRhIGZyb20gdGhlIGNhbGxiYWNrIGFuZCBjcmVhdGUgYSBCbG9iXG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9CbG9iID0gYXVkaW9PdXRwdXRTdHJlYW0uYXVkaW9CbG9iKCk7XG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF1ZGlvQmxvYik7XG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9FbGVtZW50ID0gbmV3IEF1ZGlvKGF1ZGlvVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRleHRPclNTTUwpXG4gICAgICAgICAgICB0aGlzLmV2ZW50TWFwPy5vblNwZWFrQmVmb3JlICYmIHRoaXMuZXZlbnRNYXA/Lm9uU3BlYWtCZWZvcmUoKVxuICAgICAgICAgICAgdGhpcy5zeW50aGVzaXplcltzcGVla1R5cGVdKFxuICAgICAgICAgICAgICAgIHRleHRPclNTTUwsXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAgICAgICAgKiBAZGVzY1xuICAgICAgICAgICAgICAgICAgICAgKiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdkF1ZGlvRGF0YTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdkF1ZGlvRHVyYXRpb246IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZFcnJvckRldGFpbHM6IFwiVW5hYmxlIHRvIGNvbnRhY3Qgc2VydmVyLiBTdGF0dXNDb2RlOiAxMDA2LFxcbiAgICAgICAgICAgICAgICAgICAgd3NzOi8vZWFzdGFzaWEudHRzLnNwZWVjaC5taWNyb3NvZnQuY29tL2NvZ25pdGl2ZXNlcnZpY2VzL3dlYnNvY2tldC92MSBSZWFzb246ICB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24ge3ByaXZLZXlzOiBBcnJheSgxKSwgcHJpdlZhbHVlczogQXJyYXkoMSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdlJlYXNvbjogMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZSZXN1bHRJZDogXCI1Mzk2OTRDRkE2Q0I0QkFEOTdGOTBBRjc2RTYwOEU2OVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRHVyYXRpb246ICguLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6ICguLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdElkOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdC5yZXN1bHRJZClcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0LnJlYXNvbilcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gUmVzdWx0UmVhc29uLlN5bnRoZXNpemluZ0F1ZGlvQ29tcGxldGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TWFwPy5vbkF1ZGlvQ29tcGxldGVkICYmIHRoaXMuZXZlbnRNYXA/Lm9uQXVkaW9Db21wbGV0ZWQoKSAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvRGF0YSA9IHJlc3VsdD8uYXVkaW9EYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlLnNldChcImR1cmF0aW9uXCIsTnVtYmVyKHJlc3VsdD8uYXVkaW9EdXJhdGlvbikvMTAwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlBdWRpb0RhdGEoYXVkaW9EYXRhLGNoYXRWb2ljZSxldmVudE1hcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBdWRpbyBzeW50aGVzaXMgZmluaXNoZWQuIER1cmF0aW9uOiAke2VuZFRpbWUgLSBzdGFydFRpbWV9IG1zYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1hcD8ub25TdG9wKCkmJmV2ZW50TWFwPy5vblN0b3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNoYXRWb2ljZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoYFNwZWVjaCBzeW50aGVzaXMgZmFpbGVkLiBSZWFzb246ICR7cmVzdWx0LmVycm9yRGV0YWlsc31gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoYEVycm9yIG9jY3VycmVkIGR1cmluZyBzeW50aGVzaXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g5oqK5omT5pat5pe255qE5LqL5Lu2XG4gICAgb25CcmVhayhvcHRpb25zOntcbiAgICAgICAgcGxheWVkVGltZTpzdHJpbmcgLy8g5bey5pKt5pS+5pe26ZW/XG4gICAgICAgIHBsYXllZFRleHQ6c3RyaW5nIC8vIOW3suaSreaUvuaWh+acrFxuICAgICAgICBsZWZ0VGV4dDpzdHJpbmcgLy8g5Ymp5L2Z5paH5pysXG4gICAgfSl7XG4gICAgICAgIFxuICAgIH1cblxuICAgIHBsYXlBdWRpb0RhdGEoYXVkaW9EYXRhOnN0cmluZyxjaGF0Vm9pY2U6UGFyc2UuT2JqZWN0LGV2ZW50TWFwOmFueSl7XG4gICAgICAgIGxldCB1cmxcbiAgICAgICAgY29uc29sZS5sb2coXCJhdWRpb0RhdGFcIixhdWRpb0RhdGEpXG4gICAgICAgIGlmKGF1ZGlvRGF0YT8uaW5kZXhPZiYmYXVkaW9EYXRhPy5pbmRleE9mKFwiaHR0cFwiKT49LTEpeyAvLyDmkq3mlL5VUkxcbiAgICAgICAgICAgIHVybCA9IGF1ZGlvRGF0YVxuICAgICAgICB9ZWxzZXsgLy8g5pKt5pS+6Z+z6aKR5pWw5o2uXG4gICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFthdWRpb0RhdGFdLHt0eXBlOidhdWRpby93YXYnfSk7XG4gICAgICAgICAgICB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRBbmRTYXZlVm9pY2UoYmxvYixjaGF0Vm9pY2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOS7hVVSTOmcgOimgeaSreaUvu+8jHR0c+WQiOaIkOS8muiHquWKqOaSreaUvlxuICAgICAgICAvLyBsZXQgYXVkaW8gPSBuZXcgQXVkaW8odXJsKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgYXVkaW9QbGF5ZXIgPSBBdWRpb1BsYXllci5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIGV2ZW50TWFwPy5vblN0YXJ0ICYmIGV2ZW50TWFwPy5vblN0YXJ0KGNoYXRWb2ljZSk7XG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmxvYWRlZGRhdGFcIiwgKCk9PntcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IGF1ZGlvUGxheWVyLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZHVyYXRpb25cIixkdXJhdGlvbik7XG4gICAgICAgICAgICBpZighY2hhdFZvaWNlPy5nZXQoXCJkdXJhdGlvblwiKSl7XG4gICAgICAgICAgICAgICAgY2hhdFZvaWNlPy5zZXQoXCJkdXJhdGlvblwiLGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2U/LnNhdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50TWFwPy5vbkxvYWRlZCAmJiBldmVudE1hcD8ub25Mb2FkZWQoYXVkaW9QbGF5ZXIpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmFib3J0XCIsICgpPT57XG4gICAgICAgICAgICBldmVudE1hcD8ub25TdG9wICYmIGV2ZW50TWFwPy5vblN0b3AoKTtcbiAgICAgICAgfSlcbiAgICAgICAgYXVkaW9QbGF5ZXIuc2V0QXVkaW9FdmVudChcIm9uZXJyb3JcIiwgKCk9PntcbiAgICAgICAgICAgIGV2ZW50TWFwPy5vblN0b3AgJiYgZXZlbnRNYXA/Lm9uU3RvcCgpO1xuICAgICAgICB9KVxuICAgICAgICBhdWRpb1BsYXllci5zZXRBdWRpb0V2ZW50KFwib25wYXVzZVwiLCAoKT0+e1xuICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RvcCAmJiBldmVudE1hcD8ub25TdG9wKCk7XG4gICAgICAgIH0pXG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmVuZGVkXCIsICgpPT57XG4gICAgICAgICAgICBldmVudE1hcD8ub25TdG9wICYmIGV2ZW50TWFwPy5vblN0b3AoKTtcbiAgICAgICAgfSlcbiAgICAgICAgYXVkaW9QbGF5ZXIuc2V0QXVkaW9FdmVudChcIm9uY2xvc2VcIiwgKCk9PntcbiAgICAgICAgICAgIGV2ZW50TWFwPy5vblN0b3AgJiYgZXZlbnRNYXA/Lm9uU3RvcCgpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGxldCBwbGF5QXVkaW8gPSAoKT0+e1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXIucGxheSh1cmwpLnRoZW4oKCk9PnsgLy8g6Ziy5q2i55So5oi35peg5Lqk5LqS5LiN6IO96buY6K6k5pKt5pS+XG4gICAgICAgICAgICB9KS5jYXRjaCgoKT0+e1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInBsYXlBdWRpb1wiKVxuICAgICAgICAgICAgICAgICAgICBwbGF5QXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBwbGF5QXVkaW8oKTtcbiAgICB9XG4gICAgYXN5bmMgdXBsb2FkQW5kU2F2ZVZvaWNlKGJsb2IsY2hhdFZvaWNlKXtcbiAgICAgICAgaWYodGhpcy51cGxvYWRTZXJ2KXtcbiAgICAgICAgICAgIGxldCBpZCA9IGNoYXRWb2ljZT8uaWQgfHwgdGhpcy51cGxvYWRTZXJ2Py5nZW5NZDUoY2hhdFZvaWNlPy5nZXQoXCJjb250ZW50XCIpfHxjaGF0Vm9pY2U/LmdldChcInNzbWxcIikpXG4gICAgICAgICAgICBsZXQgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGlkICsgbm93LmdldEZ1bGxZZWFyKCkrKG5vdy5nZXRNb250aCgpKzEpK25vdy5nZXREYXRlKCkrbm93LmdldEhvdXJzKCkrbm93LmdldE1pbnV0ZXMoKStub3cuZ2V0U2Vjb25kcygpICsgXCIud2F2XCJcbiAgICAgICAgICAgIGxldCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiAnYXVkaW8vd2F2JyB9KTtcbiAgICAgICAgICAgIGxldCBmaWxlUmVzdWx0ID0gYXdhaXQgdGhpcy51cGxvYWRTZXJ2LnVwbG9hZChmaWxlLChyZXMpPT57XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKSAvLyDkuIrkvKDov5vluqbvvIzlj6/ku6XlkIzmraXmm7TmlrDpobXpnaLkuIrkvKDnmb7liIbmr5RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGF0dGFjaFBvaW50ZXIgPSB7X190eXBlOlwiUG9pbnRlclwiLGNsYXNzTmFtZTpcIkF0dGFjaG1lbnRcIixvYmplY3RJZDpmaWxlUmVzdWx0Py5pZH1cbiAgICAgICAgICAgIGlmKGF0dGFjaFBvaW50ZXI/Lm9iamVjdElkKXtcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwidm9pY2VGaWxlXCIsYXR0YWNoUG9pbnRlcilcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2UgPSBhd2FpdCBjaGF0Vm9pY2Uuc2F2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbn0iXX0=
|
|
8
|
+
import{SpeechSynthesizer}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";import{SpeechConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";import{ResultReason}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";import Parse from"parse";import{AudioConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/Audio/AudioConfig";import{AudioPlayer}from"../audio.player";import{FmPushAudioOutputStreamCallback}from"../stream.player";export class FmodeTTS{constructor(e,t){this.uploadServ=t,this.subscriptionKey=e?.subscriptionKey,this.authorizationToken=e?.token,this.region=e?.region,this.subscriptionKey&&(this.speechConfig=SpeechConfig.fromSubscription(this.subscriptionKey,this.region)),this.authorizationToken&&(this.speechConfig=SpeechConfig.fromAuthorizationToken(this.authorizationToken,this.region));let o=new FmPushAudioOutputStreamCallback;this.audioConfig=AudioConfig.fromStreamOutput(o),this.synthesizer=new SpeechSynthesizer(this.speechConfig,this.audioConfig)}extractTextFromXML(e){const t=/>([^<]+)</g;let o,i=[];for(;null!==(o=t.exec(e));){const e=o[1].trim();e&&i.push(e)}return i.join(" ")}extractSSMLContent(e){var t=e.match(/<speak.*?<\/speak>/s);return t?t[0]:e}async speakAsync(e,t,o){if(!t){let o=Parse.Object.extend("ChatVoice");(t=new o).set("ssml",e),t.set("content",this.extractTextFromXML(e));let i=localStorage.getItem("company");i&&t.set("company",{__type:"Pointer",className:"Company",objectId:i}),Parse.User.current()?.id&&t.set("user",Parse.User.current().toPointer())}if(!t?.get("voiceFile")){let o=[];t?.get("content")&&o.push({content:t?.get("content")}),e&&o.push({ssml:e});let i=Parse.Query.fromJSON("ChatVoice",{include:"voiceFile",where:{$or:o}}),s=await i.first();t.set("voiceFile",s?.get("voiceFile"))}return t?.get("voiceFile")?(this.playAudioData(t?.get("voiceFile")?.get("url"),t,o),t):(e=this.extractSSMLContent(e),new Promise(((i,s)=>{const n=Date.now();let r="speakTextAsync";e?.indexOf("<")>-1&&(r="speakSsmlAsync"),this.eventMap?.onSpeakBefore&&this.eventMap?.onSpeakBefore(),this.synthesizer[r](e,(e=>{if(console.log(e),e.reason===ResultReason.SynthesizingAudioCompleted){this.eventMap?.onAudioCompleted&&this.eventMap?.onAudioCompleted();const s=Date.now();let r=e?.audioData;t.set("duration",Number(e?.audioDuration)/1e4),this.playAudioData(r,t,o),console.log(`Audio synthesis finished. Duration: ${s-n} ms`),setTimeout((()=>{o?.onStop()&&o?.onStop()}),2e3),i(t)}else s(`Speech synthesis failed. Reason: ${e.errorDetails}`)}),(e=>{s(`Error occurred during synthesis: ${e}`)}))})))}onBreak(e){}async playAudioData(e,t,o){let i;if(console.log("audioData",e),e?.indexOf&&e?.indexOf("http")>=-1)i=e;else{let o=new Blob([e],{type:"audio/wav"});i=URL.createObjectURL(o),this.uploadAndSaveVoice(o,t)}const s=AudioPlayer.getInstance();o?.onStart&&o?.onStart(t),s.setAudioEvent("onloadeddata",(()=>{let e=1e3*s.duration;console.log("duration",e),t?.get("duration")||(t?.set("duration",e),t?.save()),o?.onLoaded&&o?.onLoaded(s)})),console.log("event setting"),s.setAudioEvent("onabort",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onerror",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onpause",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onended",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onclose",(()=>{o?.onStop&&o?.onStop()}));let playAudio=()=>{s.play(i).then((()=>{})).catch((()=>{setTimeout((()=>{console.log("playAudio"),playAudio()}),200)}))};playAudio()}async uploadAndSaveVoice(e,t){if(this.uploadServ){let o=t?.id||this.uploadServ?.genMd5(t?.get("content")||t?.get("ssml")),i=new Date,s=o+i.getFullYear()+(i.getMonth()+1)+i.getDate()+i.getHours()+i.getMinutes()+i.getSeconds()+".wav",n=new File([e],s,{type:"audio/wav"}),r=await this.uploadServ.upload(n,(e=>{console.log(e)})),a={__type:"Pointer",className:"Attachment",objectId:r?.id};return a?.objectId&&(t.set("voiceFile",a),t=await t.save()),r?.url}return null}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3R0cy9mbW9kZS10dHMtY2xhc3MubWpz`
|
|
10
|
+
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/tts/index.mjs
|
|
7
|
+
*/
|
|
8
|
+
export*from"./fmode-tts-class";
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3R0cy9pbmRleC5tanM=`
|
|
10
|
+
|