@sefinek/google-tts-api 2.1.2 → 2.1.4
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/README.md +2 -4
- package/coverage/assertInputTypes.ts.html +142 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/getAudioBase64.ts.html +481 -0
- package/coverage/getAudioUrl.ts.html +361 -0
- package/coverage/index.html +176 -0
- package/coverage/index.ts.html +97 -0
- package/coverage/lcov-report/assertInputTypes.ts.html +142 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/getAudioBase64.ts.html +481 -0
- package/coverage/lcov-report/getAudioUrl.ts.html +361 -0
- package/coverage/lcov-report/index.html +176 -0
- package/coverage/lcov-report/index.ts.html +97 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/splitLongText.ts.html +319 -0
- package/coverage/lcov.info +257 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/splitLongText.ts.html +319 -0
- package/dist/getAudioBase64.js +23 -6
- package/dist/getAudioBase64.js.map +1 -1
- package/package.json +3 -13
- package/test/basic.test.js +29 -0
- package/test/long-text.test.js +187 -0
- package/test/param.test.js +65 -0
- package/test/parse-error.test.js +50 -0
- package/test/split-long-text.test.js +84 -0
- package/tsconfig.json +73 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for splitLongText.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="index.html">All files</a> splitLongText.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">100% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>38/38</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>12/12</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>4/4</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>32/32</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
145
|
+
<span class="cline-any cline-yes">4x</span>
|
|
146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
148
|
+
<span class="cline-any cline-yes">4x</span>
|
|
149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
165
|
+
<span class="cline-any cline-yes">4x</span>
|
|
166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
167
|
+
<span class="cline-any cline-yes">19x</span>
|
|
168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
169
|
+
<span class="cline-any cline-yes">19x</span>
|
|
170
|
+
<span class="cline-any cline-yes">572x</span>
|
|
171
|
+
<span class="cline-any cline-yes">572x</span>
|
|
172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
174
|
+
<span class="cline-any cline-yes">19x</span>
|
|
175
|
+
<span class="cline-any cline-yes">23x</span>
|
|
176
|
+
<span class="cline-any cline-yes">510x</span>
|
|
177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
178
|
+
<span class="cline-any cline-yes">2x</span>
|
|
179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
181
|
+
<span class="cline-any cline-yes">19x</span>
|
|
182
|
+
<span class="cline-any cline-yes">19x</span>
|
|
183
|
+
<span class="cline-any cline-yes">46x</span>
|
|
184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
186
|
+
<span class="cline-any cline-yes">19x</span>
|
|
187
|
+
<span class="cline-any cline-yes">19x</span>
|
|
188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
189
|
+
<span class="cline-any cline-yes">48x</span>
|
|
190
|
+
<span class="cline-any cline-yes">17x</span>
|
|
191
|
+
<span class="cline-any cline-yes">17x</span>
|
|
192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
195
|
+
<span class="cline-any cline-yes">31x</span>
|
|
196
|
+
<span class="cline-any cline-yes">31x</span>
|
|
197
|
+
<span class="cline-any cline-yes">8x</span>
|
|
198
|
+
<span class="cline-any cline-yes">8x</span>
|
|
199
|
+
<span class="cline-any cline-yes">8x</span>
|
|
200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
203
|
+
<span class="cline-any cline-yes">23x</span>
|
|
204
|
+
<span class="cline-any cline-yes">23x</span>
|
|
205
|
+
<span class="cline-any cline-yes">2x</span>
|
|
206
|
+
<span class="cline-any cline-yes">2x</span>
|
|
207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
214
|
+
<span class="cline-any cline-yes">21x</span>
|
|
215
|
+
<span class="cline-any cline-yes">21x</span>
|
|
216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
218
|
+
<span class="cline-any cline-yes">17x</span>
|
|
219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
221
|
+
<span class="cline-any cline-yes">4x</span>
|
|
222
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
|
|
223
|
+
const SPACE_REGEX = '\\s\\uFEFF\\xA0';
|
|
224
|
+
|
|
225
|
+
// https://remarkablemark.org/blog/2019/09/28/javascript-remove-punctuation/
|
|
226
|
+
const DEFAULT_PUNCTUATION_REGEX = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
|
|
227
|
+
|
|
228
|
+
interface Option {
|
|
229
|
+
maxLength?: number;
|
|
230
|
+
splitPunct?: string;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* split the long text to short texts
|
|
235
|
+
* Time Complexity: O(n)
|
|
236
|
+
*
|
|
237
|
+
* @param {string} text
|
|
238
|
+
* @param {object?} option
|
|
239
|
+
* @param {number?} option.maxLength default is 200
|
|
240
|
+
* @param {string?} option.splitPunct default is ''
|
|
241
|
+
* @returns {string[]} short text list
|
|
242
|
+
*/
|
|
243
|
+
const splitLongText = (
|
|
244
|
+
text: string,
|
|
245
|
+
{ maxLength = 200, splitPunct = '' }: Option = {}
|
|
246
|
+
): string[] => {
|
|
247
|
+
const isSpaceOrPunct = (s: string, i: number) => {
|
|
248
|
+
const regex = new RegExp('[' + SPACE_REGEX + DEFAULT_PUNCTUATION_REGEX + splitPunct + ']');
|
|
249
|
+
return regex.test(s.charAt(i));
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const lastIndexOfSpaceOrPunct = (s: string, left: number, right: number): number => {
|
|
253
|
+
for (let i = right; i >= left; i--) {
|
|
254
|
+
if (isSpaceOrPunct(s, i)) return i;
|
|
255
|
+
}
|
|
256
|
+
return -1; // not found
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const result: string[] = [];
|
|
260
|
+
const addResult = (text: string, start: number, end: number) => {
|
|
261
|
+
result.push(text.slice(start, end + 1));
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
let start = 0;
|
|
265
|
+
for (;;) {
|
|
266
|
+
// check text's length
|
|
267
|
+
if (text.length - start <= maxLength) {
|
|
268
|
+
addResult(text, start, text.length - 1);
|
|
269
|
+
break; // end of text
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// check whether the word is cut in the middle.
|
|
273
|
+
let end = start + maxLength - 1;
|
|
274
|
+
if (isSpaceOrPunct(text, end) || isSpaceOrPunct(text, end + 1)) {
|
|
275
|
+
addResult(text, start, end);
|
|
276
|
+
start = end + 1;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// find last index of space
|
|
281
|
+
end = lastIndexOfSpaceOrPunct(text, start, end);
|
|
282
|
+
if (end === -1) {
|
|
283
|
+
const str = text.slice(start, start + maxLength);
|
|
284
|
+
throw new Error(
|
|
285
|
+
'The word is too long to split into a short text:' +
|
|
286
|
+
`\n${str} ...` +
|
|
287
|
+
'\n\nTry the option "splitPunct" to split the text by punctuation.'
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// add result
|
|
292
|
+
addResult(text, start, end);
|
|
293
|
+
start = end + 1;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return result;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
export default splitLongText;
|
|
300
|
+
</pre></td></tr></table></pre>
|
|
301
|
+
|
|
302
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
303
|
+
</div><!-- /wrapper -->
|
|
304
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
305
|
+
Code coverage generated by
|
|
306
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
307
|
+
at 2023-12-17T14:13:22.830Z
|
|
308
|
+
</div>
|
|
309
|
+
<script src="prettify.js"></script>
|
|
310
|
+
<script>
|
|
311
|
+
window.onload = function () {
|
|
312
|
+
prettyPrint();
|
|
313
|
+
};
|
|
314
|
+
</script>
|
|
315
|
+
<script src="sorter.js"></script>
|
|
316
|
+
<script src="block-navigation.js"></script>
|
|
317
|
+
</body>
|
|
318
|
+
</html>
|
|
319
|
+
|
package/dist/getAudioBase64.js
CHANGED
|
@@ -35,6 +35,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
35
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
39
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
40
|
+
if (ar || !(i in from)) {
|
|
41
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
42
|
+
ar[i] = from[i];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
46
|
+
};
|
|
38
47
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
48
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
49
|
};
|
|
@@ -54,10 +63,14 @@ var splitLongText_1 = __importDefault(require("./splitLongText"));
|
|
|
54
63
|
* @param {number?} option.timeout default is 10000 (ms)
|
|
55
64
|
* @returns {Promise<string>} url
|
|
56
65
|
*/
|
|
57
|
-
var getAudioBase64 = function (
|
|
58
|
-
var
|
|
59
|
-
|
|
66
|
+
var getAudioBase64 = function (text_1) {
|
|
67
|
+
var args_1 = [];
|
|
68
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
69
|
+
args_1[_i - 1] = arguments[_i];
|
|
70
|
+
}
|
|
71
|
+
return __awaiter(void 0, __spreadArray([text_1], args_1, true), void 0, function (text, _a) {
|
|
60
72
|
var res, result;
|
|
73
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.lang, lang = _c === void 0 ? 'en' : _c, _d = _b.slow, slow = _d === void 0 ? false : _d, _e = _b.host, host = _e === void 0 ? 'https://translate.google.com' : _e, _f = _b.timeout, timeout = _f === void 0 ? 10000 : _f;
|
|
61
74
|
return __generator(this, function (_g) {
|
|
62
75
|
switch (_g.label) {
|
|
63
76
|
case 0:
|
|
@@ -120,10 +133,14 @@ exports.getAudioBase64 = getAudioBase64;
|
|
|
120
133
|
* @param {number?} option.timeout default is 10000 (ms)
|
|
121
134
|
* @return {Result[]} the list with short text and audio base64
|
|
122
135
|
*/
|
|
123
|
-
var getAllAudioBase64 = function (
|
|
124
|
-
var
|
|
125
|
-
|
|
136
|
+
var getAllAudioBase64 = function (text_1) {
|
|
137
|
+
var args_1 = [];
|
|
138
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
139
|
+
args_1[_i - 1] = arguments[_i];
|
|
140
|
+
}
|
|
141
|
+
return __awaiter(void 0, __spreadArray([text_1], args_1, true), void 0, function (text, _a) {
|
|
126
142
|
var shortTextList, base64List, result, i, shortText, base64;
|
|
143
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.lang, lang = _c === void 0 ? 'en' : _c, _d = _b.slow, slow = _d === void 0 ? false : _d, _e = _b.host, host = _e === void 0 ? 'https://translate.google.com' : _e, _f = _b.splitPunct, splitPunct = _f === void 0 ? '' : _f, _g = _b.timeout, timeout = _g === void 0 ? 10000 : _g;
|
|
127
144
|
return __generator(this, function (_h) {
|
|
128
145
|
switch (_h.label) {
|
|
129
146
|
case 0:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAudioBase64.js","sourceRoot":"","sources":["../src/getAudioBase64.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getAudioBase64.js","sourceRoot":"","sources":["../src/getAudioBase64.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sefinek/google-tts-api",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.4",
|
|
4
4
|
"description": "Google TTS (Text-To-Speech) for Node.js.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tts",
|
|
@@ -20,16 +20,6 @@
|
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"author": "zlargon",
|
|
22
22
|
"main": "dist/index.js",
|
|
23
|
-
"directories": {
|
|
24
|
-
"example": "example",
|
|
25
|
-
"dist": "dist"
|
|
26
|
-
},
|
|
27
|
-
"files": [
|
|
28
|
-
"dist/",
|
|
29
|
-
"example/",
|
|
30
|
-
"LICENSE",
|
|
31
|
-
"README.md"
|
|
32
|
-
],
|
|
33
23
|
"scripts": {
|
|
34
24
|
"build": "tsc -p .",
|
|
35
25
|
"cover": "npm run build && jest --coverage",
|
|
@@ -45,11 +35,11 @@
|
|
|
45
35
|
"testEnvironment": "node"
|
|
46
36
|
},
|
|
47
37
|
"dependencies": {
|
|
48
|
-
"axios": "^1.6.
|
|
38
|
+
"axios": "^1.6.7"
|
|
49
39
|
},
|
|
50
40
|
"devDependencies": {
|
|
51
41
|
"is-base64": "^1.1.0",
|
|
52
42
|
"jest": "^29.7.0",
|
|
53
|
-
"typescript": "^5.
|
|
43
|
+
"typescript": "^5.4.2"
|
|
54
44
|
}
|
|
55
45
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
const isBase64 = require('is-base64');
|
|
3
|
+
const googleTTS = require('../dist/index');
|
|
4
|
+
jest.setTimeout(60000);
|
|
5
|
+
|
|
6
|
+
const TestCases = [
|
|
7
|
+
['Hello'],
|
|
8
|
+
['hello world', { lang: 'en' }],
|
|
9
|
+
['hello world', { slow: false }],
|
|
10
|
+
['hello world', { host: 'https://translate.google.com.cn/' }],
|
|
11
|
+
['你好', { lang: 'zh' }],
|
|
12
|
+
['你好世界', { lang: 'zh' }],
|
|
13
|
+
['123', { lang: 'en', slow: true }],
|
|
14
|
+
['123', { lang: 'zh', slow: true }],
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
test('get TTS URL', async () => {
|
|
18
|
+
for (const [text, options] of TestCases) {
|
|
19
|
+
const url = googleTTS.getAudioUrl(text, options);
|
|
20
|
+
await axios.get(url);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('get TTS Base64 Text', async () => {
|
|
25
|
+
for (const [text, options] of TestCases) {
|
|
26
|
+
const base64 = await googleTTS.getAudioBase64(text, options);
|
|
27
|
+
expect(isBase64(base64)).toBe(true);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
const isBase64 = require('is-base64');
|
|
3
|
+
const googleTTS = require('../dist/index');
|
|
4
|
+
jest.setTimeout(60000);
|
|
5
|
+
|
|
6
|
+
describe('Long Text', () => {
|
|
7
|
+
it('English: 180 characters', async () => {
|
|
8
|
+
const text =
|
|
9
|
+
'The Industrial Revolution had several roots, one of which was a commercial revolution that, beginnin' +
|
|
10
|
+
'g as far back as the sixteenth century, accompanied Europe’s expansion overseas.';
|
|
11
|
+
|
|
12
|
+
// 1. audio URL
|
|
13
|
+
const url = googleTTS.getAudioUrl(text);
|
|
14
|
+
await axios.get(url);
|
|
15
|
+
|
|
16
|
+
// 2. all audio URLs
|
|
17
|
+
let resultList = googleTTS.getAllAudioUrls(text);
|
|
18
|
+
expect(resultList.length).toBe(1);
|
|
19
|
+
expect(resultList).toStrictEqual([{ shortText: text, url }]);
|
|
20
|
+
|
|
21
|
+
// 3. audio base64
|
|
22
|
+
const base64 = await googleTTS.getAudioBase64(text);
|
|
23
|
+
expect(isBase64(base64)).toBe(true);
|
|
24
|
+
|
|
25
|
+
// 4. all audio base64
|
|
26
|
+
resultList = await googleTTS.getAllAudioBase64(text);
|
|
27
|
+
expect(resultList.length).toBe(1);
|
|
28
|
+
|
|
29
|
+
const firstResult = resultList[0];
|
|
30
|
+
expect(firstResult.shortText).toBe(text);
|
|
31
|
+
expect(isBase64(firstResult.base64)).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('English: 200 characters', async () => {
|
|
35
|
+
const text =
|
|
36
|
+
'The Industrial Revolution had several roots, one of which was a commercial revolution that, beginnin' +
|
|
37
|
+
'g as far back as the sixteenth century, accompanied Europe’s expansion overseas. exports and imports';
|
|
38
|
+
|
|
39
|
+
// 1. audio URL
|
|
40
|
+
const url = googleTTS.getAudioUrl(text);
|
|
41
|
+
await axios.get(url);
|
|
42
|
+
|
|
43
|
+
// 2. all audio URLs
|
|
44
|
+
let resultList = googleTTS.getAllAudioUrls(text);
|
|
45
|
+
expect(resultList.length).toBe(1);
|
|
46
|
+
expect(resultList).toStrictEqual([{ shortText: text, url }]);
|
|
47
|
+
|
|
48
|
+
// 3. audio base64
|
|
49
|
+
const base64 = await googleTTS.getAudioBase64(text);
|
|
50
|
+
expect(isBase64(base64)).toBe(true);
|
|
51
|
+
|
|
52
|
+
// 4. all audio base64
|
|
53
|
+
resultList = await googleTTS.getAllAudioBase64(text);
|
|
54
|
+
expect(resultList.length).toBe(1);
|
|
55
|
+
|
|
56
|
+
const firstResult = resultList[0];
|
|
57
|
+
expect(firstResult.shortText).toBe(text);
|
|
58
|
+
expect(isBase64(firstResult.base64)).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('English: 268 characters', async () => {
|
|
62
|
+
const errorMessage = 'should be less than 200 characters';
|
|
63
|
+
const text =
|
|
64
|
+
'The Industrial Revolution had several roots, one of which was a commercial revolution that, beginnin' +
|
|
65
|
+
'g as far back as the sixteenth century, accompanied Europe’s expansion overseas. Both exports and im' +
|
|
66
|
+
'ports showed spectacular growth, particularly in England and France.';
|
|
67
|
+
|
|
68
|
+
// 1. audio URL
|
|
69
|
+
expect(() => {
|
|
70
|
+
googleTTS.getAudioUrl(text);
|
|
71
|
+
}).toThrow(errorMessage);
|
|
72
|
+
|
|
73
|
+
// 2. all audio URLs
|
|
74
|
+
let resultList = googleTTS.getAllAudioUrls(text);
|
|
75
|
+
expect(resultList.length).toBe(2);
|
|
76
|
+
expect(resultList.map((item) => item.shortText).join('')).toBe(text);
|
|
77
|
+
await Promise.all(resultList.map(({ url }) => axios.get(url)));
|
|
78
|
+
|
|
79
|
+
// 3. audio base64
|
|
80
|
+
await expect(() => {
|
|
81
|
+
return googleTTS.getAudioBase64(text);
|
|
82
|
+
}).rejects.toThrow(errorMessage);
|
|
83
|
+
|
|
84
|
+
// 4. all audio base64
|
|
85
|
+
resultList = await googleTTS.getAllAudioBase64(text);
|
|
86
|
+
expect(resultList.length).toBe(2);
|
|
87
|
+
expect(resultList.map((item) => item.shortText).join('')).toBe(text);
|
|
88
|
+
for (const { base64 } of resultList) {
|
|
89
|
+
expect(isBase64(base64)).toBe(true);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('Chinese: 193 characters', async () => {
|
|
94
|
+
const option = { lang: 'zh' };
|
|
95
|
+
const text =
|
|
96
|
+
'如果想想生物在死之后被完全摧毁的种种方式,能够这样频繁出现化石是一件很令人惊讶的事。食腐动物和细菌的' +
|
|
97
|
+
'破坏、化学性腐烂、腐蚀以及其它地质因素都会非常不利于保存。不过,如果生物体碰巧具有矿化的骨骼并且死于' +
|
|
98
|
+
'可以迅速被沉积物掩埋的地方,摆脱被完全摧毁的几率便会大大增加。海底通常就具有上述的两方面条件,这里生' +
|
|
99
|
+
'活着很多带壳的无脊椎动物(没有脊椎的动物),不断累积的似雨的沉积颗粒会把它们掩埋起来。';
|
|
100
|
+
|
|
101
|
+
// 1. audio URL
|
|
102
|
+
const url = googleTTS.getAudioUrl(text, option);
|
|
103
|
+
await axios.get(url);
|
|
104
|
+
|
|
105
|
+
// 2. all audio URLs
|
|
106
|
+
let resultList = googleTTS.getAllAudioUrls(text, option);
|
|
107
|
+
expect(resultList.length).toBe(1);
|
|
108
|
+
expect(resultList).toStrictEqual([{ shortText: text, url }]);
|
|
109
|
+
|
|
110
|
+
// 3. audio base64
|
|
111
|
+
const base64 = await googleTTS.getAudioBase64(text, option);
|
|
112
|
+
expect(isBase64(base64)).toBe(true);
|
|
113
|
+
|
|
114
|
+
// 4. all audio base64
|
|
115
|
+
resultList = await googleTTS.getAllAudioBase64(text, option);
|
|
116
|
+
expect(resultList.length).toBe(1);
|
|
117
|
+
|
|
118
|
+
const firstResult = resultList[0];
|
|
119
|
+
expect(firstResult.shortText).toBe(text);
|
|
120
|
+
expect(isBase64(firstResult.base64)).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('Chinese: 200 characters', async () => {
|
|
124
|
+
const option = { lang: 'zh' };
|
|
125
|
+
const text =
|
|
126
|
+
'如果想想生物在死之后被完全摧毁的种种方式,能够这样频繁出现化石是一件很令人惊讶的事。食腐动物和细菌的' +
|
|
127
|
+
'破坏、化学性腐烂、腐蚀以及其它地质因素都会非常不利于保存。不过,如果生物体碰巧具有矿化的骨骼并且死于' +
|
|
128
|
+
'可以迅速被沉积物掩埋的地方,摆脱被完全摧毁的几率便会大大增加。海底通常就具有上述的两方面条件,这里生' +
|
|
129
|
+
'活着很多带壳的无脊椎动物(没有脊椎的动物),不断累积的似雨的沉积颗粒会把它们掩埋起来。虽然多数的化石';
|
|
130
|
+
|
|
131
|
+
// 1. audio URL
|
|
132
|
+
const url = googleTTS.getAudioUrl(text, option);
|
|
133
|
+
await axios.get(url);
|
|
134
|
+
|
|
135
|
+
// 2. all audio URLs
|
|
136
|
+
let resultList = googleTTS.getAllAudioUrls(text, option);
|
|
137
|
+
expect(resultList.length).toBe(1);
|
|
138
|
+
expect(resultList).toStrictEqual([{ shortText: text, url }]);
|
|
139
|
+
|
|
140
|
+
// 3. audio base64
|
|
141
|
+
const base64 = await googleTTS.getAudioBase64(text, option);
|
|
142
|
+
expect(isBase64(base64)).toBe(true);
|
|
143
|
+
|
|
144
|
+
// 4. all audio base64
|
|
145
|
+
resultList = await googleTTS.getAllAudioBase64(text, option);
|
|
146
|
+
expect(resultList.length).toBe(1);
|
|
147
|
+
|
|
148
|
+
const firstResult = resultList[0];
|
|
149
|
+
expect(firstResult.shortText).toBe(text);
|
|
150
|
+
expect(isBase64(firstResult.base64)).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('Chinese: 211 characters', async () => {
|
|
154
|
+
const errorMessage = 'should be less than 200 characters';
|
|
155
|
+
const option = { lang: 'zh', splitPunct: ',、。()' };
|
|
156
|
+
const text =
|
|
157
|
+
'如果想想生物在死之后被完全摧毁的种种方式,能够这样频繁出现化石是一件很令人惊讶的事。食腐动物和细菌的' +
|
|
158
|
+
'破坏、化学性腐烂、腐蚀以及其它地质因素都会非常不利于保存。不过,如果生物体碰巧具有矿化的骨骼并且死于' +
|
|
159
|
+
'可以迅速被沉积物掩埋的地方,摆脱被完全摧毁的几率便会大大增加。海底通常就具有上述的两方面条件,这里生' +
|
|
160
|
+
'活着很多带壳的无脊椎动物(没有脊椎的动物),不断累积的似雨的沉积颗粒会把它们掩埋起来。虽然多数的化石' +
|
|
161
|
+
'是在海洋沉积岩中发现的';
|
|
162
|
+
|
|
163
|
+
// 1. audio URL
|
|
164
|
+
expect(() => {
|
|
165
|
+
googleTTS.getAudioUrl(text, option);
|
|
166
|
+
}).toThrow(errorMessage);
|
|
167
|
+
|
|
168
|
+
// 2. all audio URLs
|
|
169
|
+
let resultList = googleTTS.getAllAudioUrls(text, option);
|
|
170
|
+
expect(resultList.length).toBe(2);
|
|
171
|
+
expect(resultList.map((item) => item.shortText).join('')).toBe(text);
|
|
172
|
+
await Promise.all(resultList.map(({ url }) => axios.get(url)));
|
|
173
|
+
|
|
174
|
+
// 3. audio base64
|
|
175
|
+
await expect(() => {
|
|
176
|
+
return googleTTS.getAudioBase64(text, option);
|
|
177
|
+
}).rejects.toThrow(errorMessage);
|
|
178
|
+
|
|
179
|
+
// 4. all audio base64
|
|
180
|
+
resultList = await googleTTS.getAllAudioBase64(text, option);
|
|
181
|
+
expect(resultList.length).toBe(2);
|
|
182
|
+
expect(resultList.map((item) => item.shortText).join('')).toBe(text);
|
|
183
|
+
for (const { base64 } of resultList) {
|
|
184
|
+
expect(isBase64(base64)).toBe(true);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|