@@ -4,30 +4,35 @@ const DEFAULT_AUDIO_FORMAT = "audio-24khz-48kbitrate-mono-mp3"
44const Edge_TTS_VOICE_URL =
55 "https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4"
66
7- let VOICE_LIST = [ ]
7+ let VOICE_LIST : string [ ] = [ ]
88const TOKEN_REFRESH_BEFORE_EXPIRY = 3 * 60
9- let tokenInfo : { endpoint : EdgeEndpointParam ; token : string ; expiredAt : string } = {
9+ let tokenInfo : {
10+ endpoint : EdgeEndpointParam | null
11+ token : string | null
12+ expiredAt : number | null
13+ } = {
1014 endpoint : null ,
1115 token : null ,
1216 expiredAt : null ,
1317}
1418
1519let Edge_TTS_ENDPOINT_URL = ""
16- let EDGE_ENDPONT : EdgeEndpointParam = null
20+ let EDGE_ENDPONT2 : EdgeEndpointParam | null = null
1721interface EdgeEndpointParam {
1822 t : string
1923 r : string
2024}
2125
2226interface EdgeEndpointJWTParam {
23- exp : string
27+ exp : number
2428}
2529
2630async function getVoice ( ) {
31+ const EDGE_ENDPONT = await getEndpoint ( )
2732 const response = await fetch ( Edge_TTS_VOICE_URL , {
2833 method : "GET" ,
2934 headers : {
30- Authorization : EDGE_ENDPONT . t ,
35+ Authorization : EDGE_ENDPONT ?. t ?? "" ,
3136 "Content-Type" : "application/ssml+xml" ,
3237 "User-Agent" :
3338 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0" ,
@@ -36,18 +41,28 @@ async function getVoice() {
3641 } )
3742
3843 const data = await response . json ( )
39- VOICE_LIST = data . map ( ( v ) => v [ "ShortName" ] )
44+ VOICE_LIST = data . map ( ( v : any ) => v [ "ShortName" ] )
4045 const VOICE_LIST_en = VOICE_LIST . filter ( ( x ) => x . startsWith ( "en" ) )
4146 const VOICE_LIST_zh = VOICE_LIST . filter ( ( x ) => x . startsWith ( "zh" ) )
4247 const VOICE_LIST_ja = VOICE_LIST . filter ( ( x ) => x . startsWith ( "ja" ) )
4348 VOICE_LIST = VOICE_LIST_en . concat ( VOICE_LIST_zh . concat ( VOICE_LIST_ja ) )
4449 console . error ( VOICE_LIST )
4550}
46- async function getEndpoint ( ) {
51+
52+ async function getEndpoint ( ) : Promise < EdgeEndpointParam > {
53+ if ( EDGE_ENDPONT2 ) {
54+ return EDGE_ENDPONT2
55+ }
56+ EDGE_ENDPONT2 = await getEndpoint2 ( )
57+
58+ return EDGE_ENDPONT2
59+ }
60+
61+ async function getEndpoint2 ( ) : Promise < EdgeEndpointParam > {
4762 const now = Date . now ( ) / 1000
4863
4964 if ( tokenInfo . token && tokenInfo . expiredAt && now < tokenInfo . expiredAt - TOKEN_REFRESH_BEFORE_EXPIRY ) {
50- return tokenInfo . endpoint
65+ return tokenInfo . endpoint !
5166 }
5267
5368 // 获取新token
@@ -92,13 +107,21 @@ async function getEndpoint() {
92107 // 如果有缓存的token,即使过期也尝试使用
93108 if ( tokenInfo . token ) {
94109 console . log ( "使用过期的缓存token" )
95- return tokenInfo . endpoint
110+ return tokenInfo . endpoint !
96111 }
97112 throw error
98113 }
99114}
100115
101- function getSsml ( text , voiceName , rate , pitch , volume , style , slien = 0 ) {
116+ function getSsml (
117+ text : string ,
118+ voiceName : string ,
119+ rate ?: string ,
120+ pitch ?: string ,
121+ volume ?: string ,
122+ style ?: string ,
123+ slien = 0 ,
124+ ) {
102125 let slien_str = ""
103126 if ( slien > 0 ) {
104127 slien_str = `<break time="${ slien } ms" />`
@@ -124,11 +147,12 @@ interface EdgeRequestParam {
124147}
125148
126149async function EdgeProxyDownloader ( formData : EdgeRequestParam ) : Promise < Response > {
150+ const EDGE_ENDPONT = await getEndpoint ( )
127151 try {
128152 const response = await fetch ( Edge_TTS_ENDPOINT_URL , {
129153 method : "POST" ,
130154 headers : {
131- Authorization : EDGE_ENDPONT . t ,
155+ Authorization : EDGE_ENDPONT ?. t ?? "" ,
132156 "Content-Type" : "application/ssml+xml" ,
133157 "User-Agent" :
134158 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0" ,
@@ -192,8 +216,8 @@ async function EdgeProxyDownloader(formData: EdgeRequestParam): Promise<Response
192216}
193217
194218export async function EdgeProxyHandler ( req : TTSParam ) : Promise < Response > {
195- EDGE_ENDPONT = await getEndpoint ( )
196- Edge_TTS_ENDPOINT_URL = `https://${ EDGE_ENDPONT . r } .tts.speech.microsoft.com/cognitiveservices/v1`
219+ const EDGE_ENDPONT = await getEndpoint ( )
220+ Edge_TTS_ENDPOINT_URL = `https://${ EDGE_ENDPONT ? .r } .tts.speech.microsoft.com/cognitiveservices/v1`
197221
198222 if ( VOICE_LIST . length === 0 ) {
199223 await getVoice ( )
@@ -250,5 +274,3 @@ export async function EdgeProxyHandler(req: TTSParam): Promise<Response> {
250274
251275 return response
252276}
253-
254- await getEndpoint ( )
0 commit comments