1
1
package service
2
2
3
3
import (
4
- "app/internal/common"
4
+ "app/internal/provider"
5
+ "app/pkg/common"
6
+ pkgProvider "app/pkg/provider"
7
+ "errors"
5
8
"fmt"
6
9
"log/slog"
7
10
"net/http"
@@ -22,62 +25,34 @@ import (
22
25
const (
23
26
privilegeExpirationInSeconds = uint32 (86400 )
24
27
tokenExpirationInSeconds = uint32 (86400 )
25
-
26
- languageChinese = "zh-CN"
27
- languageEnglish = "en-US"
28
-
29
- TTSVendorAzure = "azure"
30
- TTSVendorElevenlabs = "elevenlabs"
31
-
32
- voiceTypeMale = "male"
33
- voiceTypeFemale = "female"
34
28
)
35
29
36
30
var (
37
- voiceNameMap = map [string ]map [string ]map [string ]string {
38
- languageChinese : {
39
- TTSVendorAzure : {
40
- voiceTypeMale : "zh-CN-YunxiNeural" ,
41
- voiceTypeFemale : "zh-CN-XiaoxiaoNeural" ,
42
- },
43
- TTSVendorElevenlabs : {
44
- voiceTypeMale : "pNInz6obpgDQGcFmaJgB" , // Adam
45
- voiceTypeFemale : "Xb7hH8MSUJpSbSDYk0k2" , // Alice
46
- },
47
- },
48
- languageEnglish : {
49
- TTSVendorAzure : {
50
- voiceTypeMale : "en-US-BrianNeural" ,
51
- voiceTypeFemale : "en-US-JaneNeural" ,
52
- },
53
- TTSVendorElevenlabs : {
54
- voiceTypeMale : "pNInz6obpgDQGcFmaJgB" , // Adam
55
- voiceTypeFemale : "Xb7hH8MSUJpSbSDYk0k2" , // Alice
56
- },
57
- },
58
- }
59
31
logTag = slog .String ("service" , "MAIN_SERVICE" )
60
32
)
61
33
62
34
type MainService struct {
63
- config MainServiceConfig
35
+ deps MainServiceDepends
64
36
workers * gmap.Map
65
37
}
66
38
39
+ type MainServiceDepends struct {
40
+ Config MainServiceConfig
41
+ ManifestProvider * provider.ManifestProvider
42
+ }
43
+
67
44
type MainServiceConfig struct {
68
45
AppId string
69
46
AppCertificate string
70
- ManifestJson string
71
- ManifestJsonElevenlabs string
72
47
TTSVendorChinese string
73
48
TTSVendorEnglish string
74
49
WorkersMax int
75
50
WorkerQuitTimeoutSeconds int
76
51
}
77
52
78
- func NewMainService (config MainServiceConfig ) * MainService {
53
+ func NewMainService (deps MainServiceDepends ) * MainService {
79
54
return & MainService {
80
- config : config ,
55
+ deps : deps ,
81
56
workers : gmap .New (true ),
82
57
}
83
58
}
@@ -145,8 +120,8 @@ func (s *MainService) HandlerStart(c *gin.Context) {
145
120
return
146
121
}
147
122
148
- if workersRunning >= s .config .WorkersMax {
149
- slog .Error ("handlerStart workers exceed" , "workersRunning" , workersRunning , "WorkersMax" , s .config .WorkersMax , "requestId" , req .RequestId , logTag )
123
+ if workersRunning >= s .deps . Config .WorkersMax {
124
+ slog .Error ("handlerStart workers exceed" , "workersRunning" , workersRunning , "WorkersMax" , s .deps . Config .WorkersMax , "requestId" , req .RequestId , logTag )
150
125
s .output (c , common .CodeErrWorkersLimit , http .StatusTooManyRequests )
151
126
return
152
127
}
@@ -165,7 +140,7 @@ func (s *MainService) HandlerStart(c *gin.Context) {
165
140
}
166
141
167
142
worker := newWorker (req .ChannelName , logFile , manifestJsonFile )
168
- worker .QuitTimeoutSeconds = s .config .WorkerQuitTimeoutSeconds
143
+ worker .QuitTimeoutSeconds = s .deps . Config .WorkerQuitTimeoutSeconds
169
144
if err := worker .start (& req ); err != nil {
170
145
slog .Error ("handlerStart start worker failed" , "err" , err , "requestId" , req .RequestId , logTag )
171
146
s .output (c , common .CodeErrStartWorkerFailed , http .StatusInternalServerError )
@@ -229,35 +204,48 @@ func (s *MainService) HandlerGenerateToken(c *gin.Context) {
229
204
return
230
205
}
231
206
232
- if s .config .AppCertificate == "" {
233
- s .output (c , common .CodeSuccess , map [string ]any {"appId" : s .config . AppId , "token" : s .config .AppId , "channel_name" : req .ChannelName , "uid" : req .Uid })
207
+ if s .deps . Config .AppCertificate == "" {
208
+ s .output (c , common .CodeSuccess , map [string ]any {"appId" : s .deps . Config . AppId , "token" : s .deps . Config .AppId , "channel_name" : req .ChannelName , "uid" : req .Uid })
234
209
return
235
210
}
236
211
237
- token , err := rtctokenbuilder .BuildTokenWithUid (s .config . AppId , s .config .AppCertificate , req .ChannelName , req .Uid , rtctokenbuilder .RolePublisher , tokenExpirationInSeconds , privilegeExpirationInSeconds )
212
+ token , err := rtctokenbuilder .BuildTokenWithUid (s .deps . Config . AppId , s .deps . Config .AppCertificate , req .ChannelName , req .Uid , rtctokenbuilder .RolePublisher , tokenExpirationInSeconds , privilegeExpirationInSeconds )
238
213
if err != nil {
239
214
slog .Error ("handlerGenerateToken generate token failed" , "err" , err , "requestId" , req .RequestId , logTag )
240
215
s .output (c , common .CodeErrGenerateTokenFailed , http .StatusBadRequest )
241
216
return
242
217
}
243
218
244
219
slog .Info ("handlerGenerateToken end" , "requestId" , req .RequestId , logTag )
245
- s .output (c , common .CodeSuccess , map [string ]any {"appId" : s .config .AppId , "token" : token , "channel_name" : req .ChannelName , "uid" : req .Uid })
220
+ s .output (c , common .CodeSuccess , map [string ]any {"appId" : s .deps . Config .AppId , "token" : token , "channel_name" : req .ChannelName , "uid" : req .Uid })
246
221
}
247
222
248
223
// createWorkerManifest create worker temporary Mainfest.
249
224
func (s * MainService ) createWorkerManifest (req * common.StartReq ) (manifestJsonFile string , logFile string , err error ) {
250
- manifestJson := s .getManifestJson (req .AgoraAsrLanguage )
225
+ vendor := s .getTtsVendor (req .AgoraAsrLanguage )
226
+ tts := pkgProvider .GetTts (vendor )
227
+ if tts == nil {
228
+ err = errors .New (fmt .Sprintf ("unknow tts vendor" , vendor ))
229
+ slog .Error ("handlerStart generate token failed" , "err" , err , "requestId" , req .RequestId , logTag )
230
+ return "" , "" , err
231
+ }
232
+
233
+ manifestJson , ok := s .deps .ManifestProvider .GetManifestJson (vendor )
234
+ if ! ok {
235
+ err = errors .New (fmt .Sprintf ("unknow manifest vendor" , vendor ))
236
+ slog .Error ("handlerStart get manifest json failed" , "err" , err , "requestId" , req .RequestId , logTag )
237
+ return "" , "" , err
238
+ }
251
239
252
- if s .config .AppId != "" {
253
- manifestJson , _ = sjson .Set (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.app_id` , s .config .AppId )
240
+ if s .deps . Config .AppId != "" {
241
+ manifestJson , _ = sjson .Set (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.app_id` , s .deps . Config .AppId )
254
242
}
255
243
appId := gjson .Get (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.app_id` ).String ()
256
244
257
245
// Generate token
258
246
token := appId
259
- if s .config .AppCertificate != "" {
260
- token , err = rtctokenbuilder .BuildTokenWithUid (appId , s .config .AppCertificate , req .ChannelName , 0 , rtctokenbuilder .RoleSubscriber , tokenExpirationInSeconds , privilegeExpirationInSeconds )
247
+ if s .deps . Config .AppCertificate != "" {
248
+ token , err = rtctokenbuilder .BuildTokenWithUid (appId , s .deps . Config .AppCertificate , req .ChannelName , 0 , rtctokenbuilder .RoleSubscriber , tokenExpirationInSeconds , privilegeExpirationInSeconds )
261
249
if err != nil {
262
250
slog .Error ("handlerStart generate token failed" , "err" , err , "requestId" , req .RequestId , logTag )
263
251
return "" , "" , err
@@ -275,16 +263,11 @@ func (s *MainService) createWorkerManifest(req *common.StartReq) (manifestJsonFi
275
263
manifestJson , _ = sjson .Set (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.remote_stream_id` , req .RemoteStreamId )
276
264
}
277
265
278
- language := gjson .Get (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.agora_asr_language` ).String ()
279
-
280
- ttsVendor := s .getTtsVendor (language )
281
- voiceName := voiceNameMap [language ][ttsVendor ][req .VoiceType ]
282
- if voiceName != "" {
283
- if ttsVendor == TTSVendorAzure {
284
- manifestJson , _ = sjson .Set (manifestJson , `predefined_graphs.0.nodes.#(name=="azure_tts").property.azure_synthesis_voice_name` , voiceName )
285
- } else if ttsVendor == TTSVendorElevenlabs {
286
- manifestJson , _ = sjson .Set (manifestJson , `predefined_graphs.0.nodes.#(name=="elevenlabs_tts").property.voice_id` , voiceName )
287
- }
266
+ language := gjson .Get (manifestJson , `predefined_graphs.0.nodes.#(name=="agora_rtc").property.agora_asr_language` ).String () //TODO check is correct? not req.AgoraAsrLanguage?
267
+ manifestJson , err = tts .ProcessManifest (manifestJson , common .Language (language ), req .VoiceType )
268
+ if err != nil {
269
+ slog .Error ("handlerStart tts ProcessManifest failed" , "err" , err , "requestId" , req .RequestId , logTag )
270
+ return "" , "" , err
288
271
}
289
272
290
273
channelNameMd5 := gmd5 .MustEncryptString (req .ChannelName )
@@ -322,21 +305,10 @@ func (s *MainService) CleanWorker() {
322
305
}
323
306
}
324
307
325
- func (s * MainService ) getManifestJson (language string ) (manifestJson string ) {
326
- ttsVendor := s .getTtsVendor (language )
327
- manifestJson = s .config .ManifestJson
328
-
329
- if ttsVendor == TTSVendorElevenlabs {
330
- manifestJson = s .config .ManifestJsonElevenlabs
331
- }
332
-
333
- return manifestJson
334
- }
335
-
336
- func (s * MainService ) getTtsVendor (language string ) string {
337
- if language == languageChinese {
338
- return s .config .TTSVendorChinese
308
+ func (s * MainService ) getTtsVendor (language common.Language ) string {
309
+ if language == common .LanguageChinese {
310
+ return s .deps .Config .TTSVendorChinese
339
311
}
340
312
341
- return s .config .TTSVendorEnglish
313
+ return s .deps . Config .TTSVendorEnglish
342
314
}
0 commit comments