mingyang91 commited on
Commit
a446897
·
verified ·
1 Parent(s): 3cbeef4

first commit

Browse files
Files changed (8) hide show
  1. .gitignore +2 -0
  2. Cargo.lock +2438 -0
  3. Cargo.toml +27 -0
  4. src/main.rs +241 -0
  5. static/client.js +280 -0
  6. static/index.html +42 -5
  7. static/main.css +232 -0
  8. static/recorderWorkletProcessor.js +97 -0
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ /target
2
+ .idea/
Cargo.lock ADDED
@@ -0,0 +1,2438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 3
4
+
5
+ [[package]]
6
+ name = "addr2line"
7
+ version = "0.21.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
10
+ dependencies = [
11
+ "gimli",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "adler"
16
+ version = "1.0.2"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
19
+
20
+ [[package]]
21
+ name = "aho-corasick"
22
+ version = "1.1.2"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
25
+ dependencies = [
26
+ "memchr",
27
+ ]
28
+
29
+ [[package]]
30
+ name = "anstream"
31
+ version = "0.6.4"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
34
+ dependencies = [
35
+ "anstyle",
36
+ "anstyle-parse",
37
+ "anstyle-query",
38
+ "anstyle-wincon",
39
+ "colorchoice",
40
+ "utf8parse",
41
+ ]
42
+
43
+ [[package]]
44
+ name = "anstyle"
45
+ version = "1.0.4"
46
+ source = "registry+https://github.com/rust-lang/crates.io-index"
47
+ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
48
+
49
+ [[package]]
50
+ name = "anstyle-parse"
51
+ version = "0.2.2"
52
+ source = "registry+https://github.com/rust-lang/crates.io-index"
53
+ checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
54
+ dependencies = [
55
+ "utf8parse",
56
+ ]
57
+
58
+ [[package]]
59
+ name = "anstyle-query"
60
+ version = "1.0.0"
61
+ source = "registry+https://github.com/rust-lang/crates.io-index"
62
+ checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
63
+ dependencies = [
64
+ "windows-sys",
65
+ ]
66
+
67
+ [[package]]
68
+ name = "anstyle-wincon"
69
+ version = "3.0.1"
70
+ source = "registry+https://github.com/rust-lang/crates.io-index"
71
+ checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
72
+ dependencies = [
73
+ "anstyle",
74
+ "windows-sys",
75
+ ]
76
+
77
+ [[package]]
78
+ name = "arrayvec"
79
+ version = "0.7.4"
80
+ source = "registry+https://github.com/rust-lang/crates.io-index"
81
+ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
82
+
83
+ [[package]]
84
+ name = "async-stream"
85
+ version = "0.3.5"
86
+ source = "registry+https://github.com/rust-lang/crates.io-index"
87
+ checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
88
+ dependencies = [
89
+ "async-stream-impl",
90
+ "futures-core",
91
+ "pin-project-lite",
92
+ ]
93
+
94
+ [[package]]
95
+ name = "async-stream-impl"
96
+ version = "0.3.5"
97
+ source = "registry+https://github.com/rust-lang/crates.io-index"
98
+ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
99
+ dependencies = [
100
+ "proc-macro2",
101
+ "quote",
102
+ "syn",
103
+ ]
104
+
105
+ [[package]]
106
+ name = "async-trait"
107
+ version = "0.1.74"
108
+ source = "registry+https://github.com/rust-lang/crates.io-index"
109
+ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
110
+ dependencies = [
111
+ "proc-macro2",
112
+ "quote",
113
+ "syn",
114
+ ]
115
+
116
+ [[package]]
117
+ name = "autocfg"
118
+ version = "1.1.0"
119
+ source = "registry+https://github.com/rust-lang/crates.io-index"
120
+ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
121
+
122
+ [[package]]
123
+ name = "aws-config"
124
+ version = "0.56.1"
125
+ source = "registry+https://github.com/rust-lang/crates.io-index"
126
+ checksum = "fc6b3804dca60326e07205179847f17a4fce45af3a1106939177ad41ac08a6de"
127
+ dependencies = [
128
+ "aws-credential-types",
129
+ "aws-http",
130
+ "aws-sdk-sso",
131
+ "aws-sdk-sts",
132
+ "aws-smithy-async",
133
+ "aws-smithy-client",
134
+ "aws-smithy-http",
135
+ "aws-smithy-http-tower",
136
+ "aws-smithy-json",
137
+ "aws-smithy-types",
138
+ "aws-types",
139
+ "bytes",
140
+ "fastrand",
141
+ "hex",
142
+ "http",
143
+ "hyper",
144
+ "ring",
145
+ "time",
146
+ "tokio",
147
+ "tower",
148
+ "tracing",
149
+ "zeroize",
150
+ ]
151
+
152
+ [[package]]
153
+ name = "aws-credential-types"
154
+ version = "0.56.1"
155
+ source = "registry+https://github.com/rust-lang/crates.io-index"
156
+ checksum = "70a66ac8ef5fa9cf01c2d999f39d16812e90ec1467bd382cbbb74ba23ea86201"
157
+ dependencies = [
158
+ "aws-smithy-async",
159
+ "aws-smithy-types",
160
+ "fastrand",
161
+ "tokio",
162
+ "tracing",
163
+ "zeroize",
164
+ ]
165
+
166
+ [[package]]
167
+ name = "aws-http"
168
+ version = "0.56.1"
169
+ source = "registry+https://github.com/rust-lang/crates.io-index"
170
+ checksum = "3e626370f9ba806ae4c439e49675fd871f5767b093075cdf4fef16cac42ba900"
171
+ dependencies = [
172
+ "aws-credential-types",
173
+ "aws-smithy-http",
174
+ "aws-smithy-types",
175
+ "aws-types",
176
+ "bytes",
177
+ "http",
178
+ "http-body",
179
+ "lazy_static",
180
+ "percent-encoding",
181
+ "pin-project-lite",
182
+ "tracing",
183
+ ]
184
+
185
+ [[package]]
186
+ name = "aws-runtime"
187
+ version = "0.56.1"
188
+ source = "registry+https://github.com/rust-lang/crates.io-index"
189
+ checksum = "07ac5cf0ff19c1bca0cea7932e11b239d1025a45696a4f44f72ea86e2b8bdd07"
190
+ dependencies = [
191
+ "aws-credential-types",
192
+ "aws-http",
193
+ "aws-sigv4",
194
+ "aws-smithy-async",
195
+ "aws-smithy-eventstream",
196
+ "aws-smithy-http",
197
+ "aws-smithy-runtime-api",
198
+ "aws-smithy-types",
199
+ "aws-types",
200
+ "fastrand",
201
+ "http",
202
+ "percent-encoding",
203
+ "tracing",
204
+ "uuid",
205
+ ]
206
+
207
+ [[package]]
208
+ name = "aws-sdk-polly"
209
+ version = "0.33.0"
210
+ source = "registry+https://github.com/rust-lang/crates.io-index"
211
+ checksum = "4a4157655fb2b0d28bb4b838e0b0b111ea14a19d53d8b406d80b9528eb3c1eae"
212
+ dependencies = [
213
+ "aws-credential-types",
214
+ "aws-http",
215
+ "aws-runtime",
216
+ "aws-sigv4",
217
+ "aws-smithy-async",
218
+ "aws-smithy-client",
219
+ "aws-smithy-http",
220
+ "aws-smithy-json",
221
+ "aws-smithy-runtime",
222
+ "aws-smithy-runtime-api",
223
+ "aws-smithy-types",
224
+ "aws-types",
225
+ "bytes",
226
+ "http",
227
+ "regex",
228
+ "tokio-stream",
229
+ "tracing",
230
+ ]
231
+
232
+ [[package]]
233
+ name = "aws-sdk-sso"
234
+ version = "0.30.0"
235
+ source = "registry+https://github.com/rust-lang/crates.io-index"
236
+ checksum = "903f888ff190e64f6f5c83fb0f8d54f9c20481f1dc26359bb8896f5d99908949"
237
+ dependencies = [
238
+ "aws-credential-types",
239
+ "aws-http",
240
+ "aws-runtime",
241
+ "aws-smithy-async",
242
+ "aws-smithy-client",
243
+ "aws-smithy-http",
244
+ "aws-smithy-json",
245
+ "aws-smithy-runtime",
246
+ "aws-smithy-runtime-api",
247
+ "aws-smithy-types",
248
+ "aws-types",
249
+ "bytes",
250
+ "http",
251
+ "regex",
252
+ "tokio-stream",
253
+ "tracing",
254
+ ]
255
+
256
+ [[package]]
257
+ name = "aws-sdk-sts"
258
+ version = "0.30.0"
259
+ source = "registry+https://github.com/rust-lang/crates.io-index"
260
+ checksum = "a47ad6bf01afc00423d781d464220bf69fb6a674ad6629cbbcb06d88cdc2be82"
261
+ dependencies = [
262
+ "aws-credential-types",
263
+ "aws-http",
264
+ "aws-runtime",
265
+ "aws-smithy-async",
266
+ "aws-smithy-client",
267
+ "aws-smithy-http",
268
+ "aws-smithy-json",
269
+ "aws-smithy-query",
270
+ "aws-smithy-runtime",
271
+ "aws-smithy-runtime-api",
272
+ "aws-smithy-types",
273
+ "aws-smithy-xml",
274
+ "aws-types",
275
+ "http",
276
+ "regex",
277
+ "tracing",
278
+ ]
279
+
280
+ [[package]]
281
+ name = "aws-sdk-transcribestreaming"
282
+ version = "0.33.0"
283
+ source = "registry+https://github.com/rust-lang/crates.io-index"
284
+ checksum = "e004a8f20dfcca5e4548a5d071049bf704184c702832f78748588727f229336d"
285
+ dependencies = [
286
+ "aws-credential-types",
287
+ "aws-http",
288
+ "aws-runtime",
289
+ "aws-sigv4",
290
+ "aws-smithy-async",
291
+ "aws-smithy-client",
292
+ "aws-smithy-eventstream",
293
+ "aws-smithy-http",
294
+ "aws-smithy-json",
295
+ "aws-smithy-runtime",
296
+ "aws-smithy-runtime-api",
297
+ "aws-smithy-types",
298
+ "aws-types",
299
+ "bytes",
300
+ "http",
301
+ "hyper",
302
+ "regex",
303
+ "tracing",
304
+ ]
305
+
306
+ [[package]]
307
+ name = "aws-sdk-translate"
308
+ version = "0.33.0"
309
+ source = "registry+https://github.com/rust-lang/crates.io-index"
310
+ checksum = "fc4a37674add1d56a2e0dc7c5cbe41b8db4f352f117dc4ef5c892f3d58344d5b"
311
+ dependencies = [
312
+ "aws-credential-types",
313
+ "aws-http",
314
+ "aws-runtime",
315
+ "aws-smithy-async",
316
+ "aws-smithy-client",
317
+ "aws-smithy-http",
318
+ "aws-smithy-json",
319
+ "aws-smithy-runtime",
320
+ "aws-smithy-runtime-api",
321
+ "aws-smithy-types",
322
+ "aws-types",
323
+ "bytes",
324
+ "fastrand",
325
+ "http",
326
+ "regex",
327
+ "tokio-stream",
328
+ "tracing",
329
+ ]
330
+
331
+ [[package]]
332
+ name = "aws-sigv4"
333
+ version = "0.56.1"
334
+ source = "registry+https://github.com/rust-lang/crates.io-index"
335
+ checksum = "b7b28f4910bb956b7ab320b62e98096402354eca976c587d1eeccd523d9bac03"
336
+ dependencies = [
337
+ "aws-smithy-eventstream",
338
+ "aws-smithy-http",
339
+ "bytes",
340
+ "form_urlencoded",
341
+ "hex",
342
+ "hmac",
343
+ "http",
344
+ "once_cell",
345
+ "percent-encoding",
346
+ "regex",
347
+ "sha2",
348
+ "time",
349
+ "tracing",
350
+ ]
351
+
352
+ [[package]]
353
+ name = "aws-smithy-async"
354
+ version = "0.56.1"
355
+ source = "registry+https://github.com/rust-lang/crates.io-index"
356
+ checksum = "2cdb73f85528b9d19c23a496034ac53703955a59323d581c06aa27b4e4e247af"
357
+ dependencies = [
358
+ "futures-util",
359
+ "pin-project-lite",
360
+ "tokio",
361
+ "tokio-stream",
362
+ ]
363
+
364
+ [[package]]
365
+ name = "aws-smithy-client"
366
+ version = "0.56.1"
367
+ source = "registry+https://github.com/rust-lang/crates.io-index"
368
+ checksum = "c27b2756264c82f830a91cb4d2d485b2d19ad5bea476d9a966e03d27f27ba59a"
369
+ dependencies = [
370
+ "aws-smithy-async",
371
+ "aws-smithy-http",
372
+ "aws-smithy-http-tower",
373
+ "aws-smithy-types",
374
+ "bytes",
375
+ "fastrand",
376
+ "http",
377
+ "http-body",
378
+ "hyper",
379
+ "hyper-rustls",
380
+ "lazy_static",
381
+ "pin-project-lite",
382
+ "rustls",
383
+ "tokio",
384
+ "tower",
385
+ "tracing",
386
+ ]
387
+
388
+ [[package]]
389
+ name = "aws-smithy-eventstream"
390
+ version = "0.56.1"
391
+ source = "registry+https://github.com/rust-lang/crates.io-index"
392
+ checksum = "850233feab37b591b7377fd52063aa37af615687f5896807abe7f49bd4e1d25b"
393
+ dependencies = [
394
+ "aws-smithy-types",
395
+ "bytes",
396
+ "crc32fast",
397
+ ]
398
+
399
+ [[package]]
400
+ name = "aws-smithy-http"
401
+ version = "0.56.1"
402
+ source = "registry+https://github.com/rust-lang/crates.io-index"
403
+ checksum = "54cdcf365d8eee60686885f750a34c190e513677db58bbc466c44c588abf4199"
404
+ dependencies = [
405
+ "aws-smithy-eventstream",
406
+ "aws-smithy-types",
407
+ "bytes",
408
+ "bytes-utils",
409
+ "futures-core",
410
+ "http",
411
+ "http-body",
412
+ "hyper",
413
+ "once_cell",
414
+ "percent-encoding",
415
+ "pin-project-lite",
416
+ "pin-utils",
417
+ "tokio",
418
+ "tokio-util",
419
+ "tracing",
420
+ ]
421
+
422
+ [[package]]
423
+ name = "aws-smithy-http-tower"
424
+ version = "0.56.1"
425
+ source = "registry+https://github.com/rust-lang/crates.io-index"
426
+ checksum = "822de399d0ce62829a69dfa8c5cd08efdbe61a7426b953e2268f8b8b52a607bd"
427
+ dependencies = [
428
+ "aws-smithy-http",
429
+ "aws-smithy-types",
430
+ "bytes",
431
+ "http",
432
+ "http-body",
433
+ "pin-project-lite",
434
+ "tower",
435
+ "tracing",
436
+ ]
437
+
438
+ [[package]]
439
+ name = "aws-smithy-json"
440
+ version = "0.56.1"
441
+ source = "registry+https://github.com/rust-lang/crates.io-index"
442
+ checksum = "4fb1e7ab8fa7ad10c193af7ae56d2420989e9f4758bf03601a342573333ea34f"
443
+ dependencies = [
444
+ "aws-smithy-types",
445
+ ]
446
+
447
+ [[package]]
448
+ name = "aws-smithy-query"
449
+ version = "0.56.1"
450
+ source = "registry+https://github.com/rust-lang/crates.io-index"
451
+ checksum = "28556a3902091c1f768a34f6c998028921bdab8d47d92586f363f14a4a32d047"
452
+ dependencies = [
453
+ "aws-smithy-types",
454
+ "urlencoding",
455
+ ]
456
+
457
+ [[package]]
458
+ name = "aws-smithy-runtime"
459
+ version = "0.56.1"
460
+ source = "registry+https://github.com/rust-lang/crates.io-index"
461
+ checksum = "745e096b3553e7e0f40622aa04971ce52765af82bebdeeac53aa6fc82fe801e6"
462
+ dependencies = [
463
+ "aws-smithy-async",
464
+ "aws-smithy-client",
465
+ "aws-smithy-http",
466
+ "aws-smithy-runtime-api",
467
+ "aws-smithy-types",
468
+ "bytes",
469
+ "fastrand",
470
+ "http",
471
+ "http-body",
472
+ "once_cell",
473
+ "pin-project-lite",
474
+ "pin-utils",
475
+ "tokio",
476
+ "tracing",
477
+ ]
478
+
479
+ [[package]]
480
+ name = "aws-smithy-runtime-api"
481
+ version = "0.56.1"
482
+ source = "registry+https://github.com/rust-lang/crates.io-index"
483
+ checksum = "93d0ae0c9cfd57944e9711ea610b48a963fb174a53aabacc08c5794a594b1d02"
484
+ dependencies = [
485
+ "aws-smithy-async",
486
+ "aws-smithy-http",
487
+ "aws-smithy-types",
488
+ "bytes",
489
+ "http",
490
+ "tokio",
491
+ "tracing",
492
+ ]
493
+
494
+ [[package]]
495
+ name = "aws-smithy-types"
496
+ version = "0.56.1"
497
+ source = "registry+https://github.com/rust-lang/crates.io-index"
498
+ checksum = "d90dbc8da2f6be461fa3c1906b20af8f79d14968fe47f2b7d29d086f62a51728"
499
+ dependencies = [
500
+ "base64-simd",
501
+ "itoa",
502
+ "num-integer",
503
+ "ryu",
504
+ "serde",
505
+ "time",
506
+ ]
507
+
508
+ [[package]]
509
+ name = "aws-smithy-xml"
510
+ version = "0.56.1"
511
+ source = "registry+https://github.com/rust-lang/crates.io-index"
512
+ checksum = "e01d2dedcdd8023043716cfeeb3c6c59f2d447fce365d8e194838891794b23b6"
513
+ dependencies = [
514
+ "xmlparser",
515
+ ]
516
+
517
+ [[package]]
518
+ name = "aws-types"
519
+ version = "0.56.1"
520
+ source = "registry+https://github.com/rust-lang/crates.io-index"
521
+ checksum = "85aa0451bf8af1bf22a4f028d5d28054507a14be43cb8ac0597a8471fba9edfe"
522
+ dependencies = [
523
+ "aws-credential-types",
524
+ "aws-smithy-async",
525
+ "aws-smithy-client",
526
+ "aws-smithy-http",
527
+ "aws-smithy-types",
528
+ "http",
529
+ "rustc_version",
530
+ "tracing",
531
+ ]
532
+
533
+ [[package]]
534
+ name = "backtrace"
535
+ version = "0.3.69"
536
+ source = "registry+https://github.com/rust-lang/crates.io-index"
537
+ checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
538
+ dependencies = [
539
+ "addr2line",
540
+ "cc",
541
+ "cfg-if",
542
+ "libc",
543
+ "miniz_oxide",
544
+ "object",
545
+ "rustc-demangle",
546
+ ]
547
+
548
+ [[package]]
549
+ name = "base64"
550
+ version = "0.21.4"
551
+ source = "registry+https://github.com/rust-lang/crates.io-index"
552
+ checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
553
+
554
+ [[package]]
555
+ name = "base64-simd"
556
+ version = "0.8.0"
557
+ source = "registry+https://github.com/rust-lang/crates.io-index"
558
+ checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
559
+ dependencies = [
560
+ "outref",
561
+ "vsimd",
562
+ ]
563
+
564
+ [[package]]
565
+ name = "bitflags"
566
+ version = "1.3.2"
567
+ source = "registry+https://github.com/rust-lang/crates.io-index"
568
+ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
569
+
570
+ [[package]]
571
+ name = "block-buffer"
572
+ version = "0.10.4"
573
+ source = "registry+https://github.com/rust-lang/crates.io-index"
574
+ checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
575
+ dependencies = [
576
+ "generic-array",
577
+ ]
578
+
579
+ [[package]]
580
+ name = "bumpalo"
581
+ version = "3.14.0"
582
+ source = "registry+https://github.com/rust-lang/crates.io-index"
583
+ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
584
+
585
+ [[package]]
586
+ name = "bytemuck"
587
+ version = "1.14.0"
588
+ source = "registry+https://github.com/rust-lang/crates.io-index"
589
+ checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
590
+
591
+ [[package]]
592
+ name = "byteorder"
593
+ version = "1.5.0"
594
+ source = "registry+https://github.com/rust-lang/crates.io-index"
595
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
596
+
597
+ [[package]]
598
+ name = "bytes"
599
+ version = "1.5.0"
600
+ source = "registry+https://github.com/rust-lang/crates.io-index"
601
+ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
602
+
603
+ [[package]]
604
+ name = "bytes-utils"
605
+ version = "0.1.3"
606
+ source = "registry+https://github.com/rust-lang/crates.io-index"
607
+ checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9"
608
+ dependencies = [
609
+ "bytes",
610
+ "either",
611
+ ]
612
+
613
+ [[package]]
614
+ name = "cc"
615
+ version = "1.0.83"
616
+ source = "registry+https://github.com/rust-lang/crates.io-index"
617
+ checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
618
+ dependencies = [
619
+ "libc",
620
+ ]
621
+
622
+ [[package]]
623
+ name = "cfg-if"
624
+ version = "1.0.0"
625
+ source = "registry+https://github.com/rust-lang/crates.io-index"
626
+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
627
+
628
+ [[package]]
629
+ name = "clap"
630
+ version = "4.4.6"
631
+ source = "registry+https://github.com/rust-lang/crates.io-index"
632
+ checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956"
633
+ dependencies = [
634
+ "clap_builder",
635
+ "clap_derive",
636
+ ]
637
+
638
+ [[package]]
639
+ name = "clap_builder"
640
+ version = "4.4.6"
641
+ source = "registry+https://github.com/rust-lang/crates.io-index"
642
+ checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45"
643
+ dependencies = [
644
+ "anstream",
645
+ "anstyle",
646
+ "clap_lex",
647
+ "strsim",
648
+ ]
649
+
650
+ [[package]]
651
+ name = "clap_derive"
652
+ version = "4.4.2"
653
+ source = "registry+https://github.com/rust-lang/crates.io-index"
654
+ checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
655
+ dependencies = [
656
+ "heck",
657
+ "proc-macro2",
658
+ "quote",
659
+ "syn",
660
+ ]
661
+
662
+ [[package]]
663
+ name = "clap_lex"
664
+ version = "0.5.1"
665
+ source = "registry+https://github.com/rust-lang/crates.io-index"
666
+ checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
667
+
668
+ [[package]]
669
+ name = "colorchoice"
670
+ version = "1.0.0"
671
+ source = "registry+https://github.com/rust-lang/crates.io-index"
672
+ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
673
+
674
+ [[package]]
675
+ name = "core-foundation"
676
+ version = "0.9.3"
677
+ source = "registry+https://github.com/rust-lang/crates.io-index"
678
+ checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
679
+ dependencies = [
680
+ "core-foundation-sys",
681
+ "libc",
682
+ ]
683
+
684
+ [[package]]
685
+ name = "core-foundation-sys"
686
+ version = "0.8.4"
687
+ source = "registry+https://github.com/rust-lang/crates.io-index"
688
+ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
689
+
690
+ [[package]]
691
+ name = "cpufeatures"
692
+ version = "0.2.9"
693
+ source = "registry+https://github.com/rust-lang/crates.io-index"
694
+ checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
695
+ dependencies = [
696
+ "libc",
697
+ ]
698
+
699
+ [[package]]
700
+ name = "crc32fast"
701
+ version = "1.3.2"
702
+ source = "registry+https://github.com/rust-lang/crates.io-index"
703
+ checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
704
+ dependencies = [
705
+ "cfg-if",
706
+ ]
707
+
708
+ [[package]]
709
+ name = "crypto-common"
710
+ version = "0.1.6"
711
+ source = "registry+https://github.com/rust-lang/crates.io-index"
712
+ checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
713
+ dependencies = [
714
+ "generic-array",
715
+ "typenum",
716
+ ]
717
+
718
+ [[package]]
719
+ name = "data-encoding"
720
+ version = "2.4.0"
721
+ source = "registry+https://github.com/rust-lang/crates.io-index"
722
+ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
723
+
724
+ [[package]]
725
+ name = "deranged"
726
+ version = "0.3.9"
727
+ source = "registry+https://github.com/rust-lang/crates.io-index"
728
+ checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3"
729
+ dependencies = [
730
+ "powerfmt",
731
+ ]
732
+
733
+ [[package]]
734
+ name = "digest"
735
+ version = "0.10.7"
736
+ source = "registry+https://github.com/rust-lang/crates.io-index"
737
+ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
738
+ dependencies = [
739
+ "block-buffer",
740
+ "crypto-common",
741
+ "subtle",
742
+ ]
743
+
744
+ [[package]]
745
+ name = "either"
746
+ version = "1.9.0"
747
+ source = "registry+https://github.com/rust-lang/crates.io-index"
748
+ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
749
+
750
+ [[package]]
751
+ name = "encoding_rs"
752
+ version = "0.8.33"
753
+ source = "registry+https://github.com/rust-lang/crates.io-index"
754
+ checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
755
+ dependencies = [
756
+ "cfg-if",
757
+ ]
758
+
759
+ [[package]]
760
+ name = "equivalent"
761
+ version = "1.0.1"
762
+ source = "registry+https://github.com/rust-lang/crates.io-index"
763
+ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
764
+
765
+ [[package]]
766
+ name = "fastrand"
767
+ version = "2.0.1"
768
+ source = "registry+https://github.com/rust-lang/crates.io-index"
769
+ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
770
+
771
+ [[package]]
772
+ name = "fnv"
773
+ version = "1.0.7"
774
+ source = "registry+https://github.com/rust-lang/crates.io-index"
775
+ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
776
+
777
+ [[package]]
778
+ name = "form_urlencoded"
779
+ version = "1.2.0"
780
+ source = "registry+https://github.com/rust-lang/crates.io-index"
781
+ checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
782
+ dependencies = [
783
+ "percent-encoding",
784
+ ]
785
+
786
+ [[package]]
787
+ name = "futures-channel"
788
+ version = "0.3.28"
789
+ source = "registry+https://github.com/rust-lang/crates.io-index"
790
+ checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
791
+ dependencies = [
792
+ "futures-core",
793
+ ]
794
+
795
+ [[package]]
796
+ name = "futures-core"
797
+ version = "0.3.28"
798
+ source = "registry+https://github.com/rust-lang/crates.io-index"
799
+ checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
800
+
801
+ [[package]]
802
+ name = "futures-macro"
803
+ version = "0.3.28"
804
+ source = "registry+https://github.com/rust-lang/crates.io-index"
805
+ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
806
+ dependencies = [
807
+ "proc-macro2",
808
+ "quote",
809
+ "syn",
810
+ ]
811
+
812
+ [[package]]
813
+ name = "futures-sink"
814
+ version = "0.3.28"
815
+ source = "registry+https://github.com/rust-lang/crates.io-index"
816
+ checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
817
+
818
+ [[package]]
819
+ name = "futures-task"
820
+ version = "0.3.28"
821
+ source = "registry+https://github.com/rust-lang/crates.io-index"
822
+ checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
823
+
824
+ [[package]]
825
+ name = "futures-util"
826
+ version = "0.3.28"
827
+ source = "registry+https://github.com/rust-lang/crates.io-index"
828
+ checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
829
+ dependencies = [
830
+ "futures-core",
831
+ "futures-macro",
832
+ "futures-sink",
833
+ "futures-task",
834
+ "pin-project-lite",
835
+ "pin-utils",
836
+ "slab",
837
+ ]
838
+
839
+ [[package]]
840
+ name = "generic-array"
841
+ version = "0.14.7"
842
+ source = "registry+https://github.com/rust-lang/crates.io-index"
843
+ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
844
+ dependencies = [
845
+ "typenum",
846
+ "version_check",
847
+ ]
848
+
849
+ [[package]]
850
+ name = "getrandom"
851
+ version = "0.2.10"
852
+ source = "registry+https://github.com/rust-lang/crates.io-index"
853
+ checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
854
+ dependencies = [
855
+ "cfg-if",
856
+ "libc",
857
+ "wasi",
858
+ ]
859
+
860
+ [[package]]
861
+ name = "gimli"
862
+ version = "0.28.0"
863
+ source = "registry+https://github.com/rust-lang/crates.io-index"
864
+ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
865
+
866
+ [[package]]
867
+ name = "h2"
868
+ version = "0.3.21"
869
+ source = "registry+https://github.com/rust-lang/crates.io-index"
870
+ checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
871
+ dependencies = [
872
+ "bytes",
873
+ "fnv",
874
+ "futures-core",
875
+ "futures-sink",
876
+ "futures-util",
877
+ "http",
878
+ "indexmap 1.9.3",
879
+ "slab",
880
+ "tokio",
881
+ "tokio-util",
882
+ "tracing",
883
+ ]
884
+
885
+ [[package]]
886
+ name = "hashbrown"
887
+ version = "0.12.3"
888
+ source = "registry+https://github.com/rust-lang/crates.io-index"
889
+ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
890
+
891
+ [[package]]
892
+ name = "hashbrown"
893
+ version = "0.14.1"
894
+ source = "registry+https://github.com/rust-lang/crates.io-index"
895
+ checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12"
896
+
897
+ [[package]]
898
+ name = "headers"
899
+ version = "0.3.9"
900
+ source = "registry+https://github.com/rust-lang/crates.io-index"
901
+ checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270"
902
+ dependencies = [
903
+ "base64",
904
+ "bytes",
905
+ "headers-core",
906
+ "http",
907
+ "httpdate",
908
+ "mime",
909
+ "sha1",
910
+ ]
911
+
912
+ [[package]]
913
+ name = "headers-core"
914
+ version = "0.2.0"
915
+ source = "registry+https://github.com/rust-lang/crates.io-index"
916
+ checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
917
+ dependencies = [
918
+ "http",
919
+ ]
920
+
921
+ [[package]]
922
+ name = "heck"
923
+ version = "0.4.1"
924
+ source = "registry+https://github.com/rust-lang/crates.io-index"
925
+ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
926
+
927
+ [[package]]
928
+ name = "hermit-abi"
929
+ version = "0.3.3"
930
+ source = "registry+https://github.com/rust-lang/crates.io-index"
931
+ checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
932
+
933
+ [[package]]
934
+ name = "hex"
935
+ version = "0.4.3"
936
+ source = "registry+https://github.com/rust-lang/crates.io-index"
937
+ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
938
+
939
+ [[package]]
940
+ name = "hmac"
941
+ version = "0.12.1"
942
+ source = "registry+https://github.com/rust-lang/crates.io-index"
943
+ checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
944
+ dependencies = [
945
+ "digest",
946
+ ]
947
+
948
+ [[package]]
949
+ name = "hound"
950
+ version = "3.5.1"
951
+ source = "registry+https://github.com/rust-lang/crates.io-index"
952
+ checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f"
953
+
954
+ [[package]]
955
+ name = "http"
956
+ version = "0.2.9"
957
+ source = "registry+https://github.com/rust-lang/crates.io-index"
958
+ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
959
+ dependencies = [
960
+ "bytes",
961
+ "fnv",
962
+ "itoa",
963
+ ]
964
+
965
+ [[package]]
966
+ name = "http-body"
967
+ version = "0.4.5"
968
+ source = "registry+https://github.com/rust-lang/crates.io-index"
969
+ checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
970
+ dependencies = [
971
+ "bytes",
972
+ "http",
973
+ "pin-project-lite",
974
+ ]
975
+
976
+ [[package]]
977
+ name = "httparse"
978
+ version = "1.8.0"
979
+ source = "registry+https://github.com/rust-lang/crates.io-index"
980
+ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
981
+
982
+ [[package]]
983
+ name = "httpdate"
984
+ version = "1.0.3"
985
+ source = "registry+https://github.com/rust-lang/crates.io-index"
986
+ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
987
+
988
+ [[package]]
989
+ name = "hyper"
990
+ version = "0.14.27"
991
+ source = "registry+https://github.com/rust-lang/crates.io-index"
992
+ checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
993
+ dependencies = [
994
+ "bytes",
995
+ "futures-channel",
996
+ "futures-core",
997
+ "futures-util",
998
+ "h2",
999
+ "http",
1000
+ "http-body",
1001
+ "httparse",
1002
+ "httpdate",
1003
+ "itoa",
1004
+ "pin-project-lite",
1005
+ "socket2 0.4.9",
1006
+ "tokio",
1007
+ "tower-service",
1008
+ "tracing",
1009
+ "want",
1010
+ ]
1011
+
1012
+ [[package]]
1013
+ name = "hyper-rustls"
1014
+ version = "0.24.1"
1015
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1016
+ checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
1017
+ dependencies = [
1018
+ "futures-util",
1019
+ "http",
1020
+ "hyper",
1021
+ "log",
1022
+ "rustls",
1023
+ "rustls-native-certs",
1024
+ "tokio",
1025
+ "tokio-rustls",
1026
+ ]
1027
+
1028
+ [[package]]
1029
+ name = "idna"
1030
+ version = "0.4.0"
1031
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1032
+ checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
1033
+ dependencies = [
1034
+ "unicode-bidi",
1035
+ "unicode-normalization",
1036
+ ]
1037
+
1038
+ [[package]]
1039
+ name = "indexmap"
1040
+ version = "1.9.3"
1041
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1042
+ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
1043
+ dependencies = [
1044
+ "autocfg",
1045
+ "hashbrown 0.12.3",
1046
+ ]
1047
+
1048
+ [[package]]
1049
+ name = "indexmap"
1050
+ version = "2.0.2"
1051
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1052
+ checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"
1053
+ dependencies = [
1054
+ "equivalent",
1055
+ "hashbrown 0.14.1",
1056
+ ]
1057
+
1058
+ [[package]]
1059
+ name = "itoa"
1060
+ version = "1.0.9"
1061
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1062
+ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
1063
+
1064
+ [[package]]
1065
+ name = "js-sys"
1066
+ version = "0.3.64"
1067
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1068
+ checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
1069
+ dependencies = [
1070
+ "wasm-bindgen",
1071
+ ]
1072
+
1073
+ [[package]]
1074
+ name = "lazy_static"
1075
+ version = "1.4.0"
1076
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1077
+ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
1078
+
1079
+ [[package]]
1080
+ name = "libc"
1081
+ version = "0.2.149"
1082
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1083
+ checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
1084
+
1085
+ [[package]]
1086
+ name = "lock_api"
1087
+ version = "0.4.11"
1088
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1089
+ checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
1090
+ dependencies = [
1091
+ "autocfg",
1092
+ "scopeguard",
1093
+ ]
1094
+
1095
+ [[package]]
1096
+ name = "log"
1097
+ version = "0.4.20"
1098
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1099
+ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
1100
+
1101
+ [[package]]
1102
+ name = "memchr"
1103
+ version = "2.6.4"
1104
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1105
+ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
1106
+
1107
+ [[package]]
1108
+ name = "mime"
1109
+ version = "0.3.17"
1110
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1111
+ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1112
+
1113
+ [[package]]
1114
+ name = "mime_guess"
1115
+ version = "2.0.4"
1116
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1117
+ checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
1118
+ dependencies = [
1119
+ "mime",
1120
+ "unicase",
1121
+ ]
1122
+
1123
+ [[package]]
1124
+ name = "miniz_oxide"
1125
+ version = "0.7.1"
1126
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1127
+ checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
1128
+ dependencies = [
1129
+ "adler",
1130
+ ]
1131
+
1132
+ [[package]]
1133
+ name = "mio"
1134
+ version = "0.8.8"
1135
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1136
+ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
1137
+ dependencies = [
1138
+ "libc",
1139
+ "wasi",
1140
+ "windows-sys",
1141
+ ]
1142
+
1143
+ [[package]]
1144
+ name = "nu-ansi-term"
1145
+ version = "0.46.0"
1146
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1147
+ checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
1148
+ dependencies = [
1149
+ "overload",
1150
+ "winapi",
1151
+ ]
1152
+
1153
+ [[package]]
1154
+ name = "num-integer"
1155
+ version = "0.1.45"
1156
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1157
+ checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
1158
+ dependencies = [
1159
+ "autocfg",
1160
+ "num-traits",
1161
+ ]
1162
+
1163
+ [[package]]
1164
+ name = "num-traits"
1165
+ version = "0.2.17"
1166
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1167
+ checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
1168
+ dependencies = [
1169
+ "autocfg",
1170
+ ]
1171
+
1172
+ [[package]]
1173
+ name = "num_cpus"
1174
+ version = "1.16.0"
1175
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1176
+ checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
1177
+ dependencies = [
1178
+ "hermit-abi",
1179
+ "libc",
1180
+ ]
1181
+
1182
+ [[package]]
1183
+ name = "object"
1184
+ version = "0.32.1"
1185
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1186
+ checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
1187
+ dependencies = [
1188
+ "memchr",
1189
+ ]
1190
+
1191
+ [[package]]
1192
+ name = "once_cell"
1193
+ version = "1.18.0"
1194
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1195
+ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
1196
+
1197
+ [[package]]
1198
+ name = "openssl-probe"
1199
+ version = "0.1.5"
1200
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1201
+ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
1202
+
1203
+ [[package]]
1204
+ name = "outref"
1205
+ version = "0.5.1"
1206
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1207
+ checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a"
1208
+
1209
+ [[package]]
1210
+ name = "overload"
1211
+ version = "0.1.1"
1212
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1213
+ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1214
+
1215
+ [[package]]
1216
+ name = "parking_lot"
1217
+ version = "0.12.1"
1218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1219
+ checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
1220
+ dependencies = [
1221
+ "lock_api",
1222
+ "parking_lot_core",
1223
+ ]
1224
+
1225
+ [[package]]
1226
+ name = "parking_lot_core"
1227
+ version = "0.9.9"
1228
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1229
+ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
1230
+ dependencies = [
1231
+ "cfg-if",
1232
+ "libc",
1233
+ "redox_syscall",
1234
+ "smallvec",
1235
+ "windows-targets",
1236
+ ]
1237
+
1238
+ [[package]]
1239
+ name = "percent-encoding"
1240
+ version = "2.3.0"
1241
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1242
+ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
1243
+
1244
+ [[package]]
1245
+ name = "pin-project"
1246
+ version = "1.1.3"
1247
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1248
+ checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
1249
+ dependencies = [
1250
+ "pin-project-internal",
1251
+ ]
1252
+
1253
+ [[package]]
1254
+ name = "pin-project-internal"
1255
+ version = "1.1.3"
1256
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1257
+ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
1258
+ dependencies = [
1259
+ "proc-macro2",
1260
+ "quote",
1261
+ "syn",
1262
+ ]
1263
+
1264
+ [[package]]
1265
+ name = "pin-project-lite"
1266
+ version = "0.2.13"
1267
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1268
+ checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
1269
+
1270
+ [[package]]
1271
+ name = "pin-utils"
1272
+ version = "0.1.0"
1273
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1274
+ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1275
+
1276
+ [[package]]
1277
+ name = "poem"
1278
+ version = "1.3.58"
1279
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1280
+ checksum = "ebc7ae19f3e791ae8108b08801abb3708d64d3a16490c720e0b81040cae87b5d"
1281
+ dependencies = [
1282
+ "async-trait",
1283
+ "base64",
1284
+ "bytes",
1285
+ "futures-util",
1286
+ "headers",
1287
+ "http",
1288
+ "httpdate",
1289
+ "hyper",
1290
+ "mime",
1291
+ "mime_guess",
1292
+ "parking_lot",
1293
+ "percent-encoding",
1294
+ "pin-project-lite",
1295
+ "poem-derive",
1296
+ "regex",
1297
+ "rfc7239",
1298
+ "serde",
1299
+ "serde_json",
1300
+ "serde_urlencoded",
1301
+ "smallvec",
1302
+ "thiserror",
1303
+ "tokio",
1304
+ "tokio-tungstenite",
1305
+ "tokio-util",
1306
+ "tracing",
1307
+ ]
1308
+
1309
+ [[package]]
1310
+ name = "poem-derive"
1311
+ version = "1.3.58"
1312
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1313
+ checksum = "2550a0bce7273b278894ef3ccc5a6869e7031b6870042f3cc6826ed9faa980a6"
1314
+ dependencies = [
1315
+ "proc-macro-crate",
1316
+ "proc-macro2",
1317
+ "quote",
1318
+ "syn",
1319
+ ]
1320
+
1321
+ [[package]]
1322
+ name = "polyhedron"
1323
+ version = "0.1.0"
1324
+ dependencies = [
1325
+ "async-stream",
1326
+ "aws-config",
1327
+ "aws-sdk-polly",
1328
+ "aws-sdk-transcribestreaming",
1329
+ "aws-sdk-translate",
1330
+ "bytes",
1331
+ "clap",
1332
+ "futures-util",
1333
+ "hound",
1334
+ "poem",
1335
+ "symphonia",
1336
+ "tokio",
1337
+ "tokio-stream",
1338
+ "tracing-subscriber",
1339
+ ]
1340
+
1341
+ [[package]]
1342
+ name = "powerfmt"
1343
+ version = "0.2.0"
1344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1345
+ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1346
+
1347
+ [[package]]
1348
+ name = "ppv-lite86"
1349
+ version = "0.2.17"
1350
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1351
+ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
1352
+
1353
+ [[package]]
1354
+ name = "proc-macro-crate"
1355
+ version = "1.3.1"
1356
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1357
+ checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
1358
+ dependencies = [
1359
+ "once_cell",
1360
+ "toml_edit",
1361
+ ]
1362
+
1363
+ [[package]]
1364
+ name = "proc-macro2"
1365
+ version = "1.0.69"
1366
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1367
+ checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
1368
+ dependencies = [
1369
+ "unicode-ident",
1370
+ ]
1371
+
1372
+ [[package]]
1373
+ name = "quote"
1374
+ version = "1.0.33"
1375
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1376
+ checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
1377
+ dependencies = [
1378
+ "proc-macro2",
1379
+ ]
1380
+
1381
+ [[package]]
1382
+ name = "rand"
1383
+ version = "0.8.5"
1384
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1385
+ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1386
+ dependencies = [
1387
+ "libc",
1388
+ "rand_chacha",
1389
+ "rand_core",
1390
+ ]
1391
+
1392
+ [[package]]
1393
+ name = "rand_chacha"
1394
+ version = "0.3.1"
1395
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1396
+ checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1397
+ dependencies = [
1398
+ "ppv-lite86",
1399
+ "rand_core",
1400
+ ]
1401
+
1402
+ [[package]]
1403
+ name = "rand_core"
1404
+ version = "0.6.4"
1405
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1406
+ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1407
+ dependencies = [
1408
+ "getrandom",
1409
+ ]
1410
+
1411
+ [[package]]
1412
+ name = "redox_syscall"
1413
+ version = "0.4.1"
1414
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1415
+ checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
1416
+ dependencies = [
1417
+ "bitflags",
1418
+ ]
1419
+
1420
+ [[package]]
1421
+ name = "regex"
1422
+ version = "1.10.2"
1423
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1424
+ checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
1425
+ dependencies = [
1426
+ "aho-corasick",
1427
+ "memchr",
1428
+ "regex-automata",
1429
+ "regex-syntax",
1430
+ ]
1431
+
1432
+ [[package]]
1433
+ name = "regex-automata"
1434
+ version = "0.4.3"
1435
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1436
+ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
1437
+ dependencies = [
1438
+ "aho-corasick",
1439
+ "memchr",
1440
+ "regex-syntax",
1441
+ ]
1442
+
1443
+ [[package]]
1444
+ name = "regex-syntax"
1445
+ version = "0.8.2"
1446
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1447
+ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
1448
+
1449
+ [[package]]
1450
+ name = "rfc7239"
1451
+ version = "0.1.0"
1452
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1453
+ checksum = "087317b3cf7eb481f13bd9025d729324b7cd068d6f470e2d76d049e191f5ba47"
1454
+ dependencies = [
1455
+ "uncased",
1456
+ ]
1457
+
1458
+ [[package]]
1459
+ name = "ring"
1460
+ version = "0.16.20"
1461
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1462
+ checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
1463
+ dependencies = [
1464
+ "cc",
1465
+ "libc",
1466
+ "once_cell",
1467
+ "spin",
1468
+ "untrusted",
1469
+ "web-sys",
1470
+ "winapi",
1471
+ ]
1472
+
1473
+ [[package]]
1474
+ name = "rustc-demangle"
1475
+ version = "0.1.23"
1476
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1477
+ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
1478
+
1479
+ [[package]]
1480
+ name = "rustc_version"
1481
+ version = "0.4.0"
1482
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1483
+ checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
1484
+ dependencies = [
1485
+ "semver",
1486
+ ]
1487
+
1488
+ [[package]]
1489
+ name = "rustls"
1490
+ version = "0.21.7"
1491
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1492
+ checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
1493
+ dependencies = [
1494
+ "log",
1495
+ "ring",
1496
+ "rustls-webpki",
1497
+ "sct",
1498
+ ]
1499
+
1500
+ [[package]]
1501
+ name = "rustls-native-certs"
1502
+ version = "0.6.3"
1503
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1504
+ checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
1505
+ dependencies = [
1506
+ "openssl-probe",
1507
+ "rustls-pemfile",
1508
+ "schannel",
1509
+ "security-framework",
1510
+ ]
1511
+
1512
+ [[package]]
1513
+ name = "rustls-pemfile"
1514
+ version = "1.0.3"
1515
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1516
+ checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
1517
+ dependencies = [
1518
+ "base64",
1519
+ ]
1520
+
1521
+ [[package]]
1522
+ name = "rustls-webpki"
1523
+ version = "0.101.6"
1524
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1525
+ checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe"
1526
+ dependencies = [
1527
+ "ring",
1528
+ "untrusted",
1529
+ ]
1530
+
1531
+ [[package]]
1532
+ name = "ryu"
1533
+ version = "1.0.15"
1534
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1535
+ checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
1536
+
1537
+ [[package]]
1538
+ name = "schannel"
1539
+ version = "0.1.22"
1540
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1541
+ checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
1542
+ dependencies = [
1543
+ "windows-sys",
1544
+ ]
1545
+
1546
+ [[package]]
1547
+ name = "scopeguard"
1548
+ version = "1.2.0"
1549
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1550
+ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1551
+
1552
+ [[package]]
1553
+ name = "sct"
1554
+ version = "0.7.0"
1555
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1556
+ checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
1557
+ dependencies = [
1558
+ "ring",
1559
+ "untrusted",
1560
+ ]
1561
+
1562
+ [[package]]
1563
+ name = "security-framework"
1564
+ version = "2.9.2"
1565
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1566
+ checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
1567
+ dependencies = [
1568
+ "bitflags",
1569
+ "core-foundation",
1570
+ "core-foundation-sys",
1571
+ "libc",
1572
+ "security-framework-sys",
1573
+ ]
1574
+
1575
+ [[package]]
1576
+ name = "security-framework-sys"
1577
+ version = "2.9.1"
1578
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1579
+ checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
1580
+ dependencies = [
1581
+ "core-foundation-sys",
1582
+ "libc",
1583
+ ]
1584
+
1585
+ [[package]]
1586
+ name = "semver"
1587
+ version = "1.0.20"
1588
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1589
+ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
1590
+
1591
+ [[package]]
1592
+ name = "serde"
1593
+ version = "1.0.189"
1594
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1595
+ checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537"
1596
+ dependencies = [
1597
+ "serde_derive",
1598
+ ]
1599
+
1600
+ [[package]]
1601
+ name = "serde_derive"
1602
+ version = "1.0.189"
1603
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1604
+ checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5"
1605
+ dependencies = [
1606
+ "proc-macro2",
1607
+ "quote",
1608
+ "syn",
1609
+ ]
1610
+
1611
+ [[package]]
1612
+ name = "serde_json"
1613
+ version = "1.0.107"
1614
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1615
+ checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
1616
+ dependencies = [
1617
+ "itoa",
1618
+ "ryu",
1619
+ "serde",
1620
+ ]
1621
+
1622
+ [[package]]
1623
+ name = "serde_urlencoded"
1624
+ version = "0.7.1"
1625
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1626
+ checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1627
+ dependencies = [
1628
+ "form_urlencoded",
1629
+ "itoa",
1630
+ "ryu",
1631
+ "serde",
1632
+ ]
1633
+
1634
+ [[package]]
1635
+ name = "sha1"
1636
+ version = "0.10.6"
1637
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1638
+ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1639
+ dependencies = [
1640
+ "cfg-if",
1641
+ "cpufeatures",
1642
+ "digest",
1643
+ ]
1644
+
1645
+ [[package]]
1646
+ name = "sha2"
1647
+ version = "0.10.8"
1648
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1649
+ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
1650
+ dependencies = [
1651
+ "cfg-if",
1652
+ "cpufeatures",
1653
+ "digest",
1654
+ ]
1655
+
1656
+ [[package]]
1657
+ name = "sharded-slab"
1658
+ version = "0.1.7"
1659
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1660
+ checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1661
+ dependencies = [
1662
+ "lazy_static",
1663
+ ]
1664
+
1665
+ [[package]]
1666
+ name = "signal-hook-registry"
1667
+ version = "1.4.1"
1668
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1669
+ checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
1670
+ dependencies = [
1671
+ "libc",
1672
+ ]
1673
+
1674
+ [[package]]
1675
+ name = "slab"
1676
+ version = "0.4.9"
1677
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1678
+ checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1679
+ dependencies = [
1680
+ "autocfg",
1681
+ ]
1682
+
1683
+ [[package]]
1684
+ name = "smallvec"
1685
+ version = "1.11.1"
1686
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1687
+ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
1688
+
1689
+ [[package]]
1690
+ name = "socket2"
1691
+ version = "0.4.9"
1692
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1693
+ checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
1694
+ dependencies = [
1695
+ "libc",
1696
+ "winapi",
1697
+ ]
1698
+
1699
+ [[package]]
1700
+ name = "socket2"
1701
+ version = "0.5.4"
1702
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1703
+ checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
1704
+ dependencies = [
1705
+ "libc",
1706
+ "windows-sys",
1707
+ ]
1708
+
1709
+ [[package]]
1710
+ name = "spin"
1711
+ version = "0.5.2"
1712
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1713
+ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
1714
+
1715
+ [[package]]
1716
+ name = "strsim"
1717
+ version = "0.10.0"
1718
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1719
+ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
1720
+
1721
+ [[package]]
1722
+ name = "subtle"
1723
+ version = "2.5.0"
1724
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1725
+ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
1726
+
1727
+ [[package]]
1728
+ name = "symphonia"
1729
+ version = "0.5.3"
1730
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1731
+ checksum = "62e48dba70095f265fdb269b99619b95d04c89e619538138383e63310b14d941"
1732
+ dependencies = [
1733
+ "lazy_static",
1734
+ "symphonia-bundle-flac",
1735
+ "symphonia-codec-adpcm",
1736
+ "symphonia-codec-pcm",
1737
+ "symphonia-codec-vorbis",
1738
+ "symphonia-core",
1739
+ "symphonia-format-mkv",
1740
+ "symphonia-format-ogg",
1741
+ "symphonia-format-wav",
1742
+ "symphonia-metadata",
1743
+ ]
1744
+
1745
+ [[package]]
1746
+ name = "symphonia-bundle-flac"
1747
+ version = "0.5.3"
1748
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1749
+ checksum = "7f23b0482a7cb18fcdf9981ab0b78df800ef0080187d294650023c462439058d"
1750
+ dependencies = [
1751
+ "log",
1752
+ "symphonia-core",
1753
+ "symphonia-metadata",
1754
+ "symphonia-utils-xiph",
1755
+ ]
1756
+
1757
+ [[package]]
1758
+ name = "symphonia-codec-adpcm"
1759
+ version = "0.5.3"
1760
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1761
+ checksum = "870e7dc1865d818c7b6318879d060553a73a3b2a3b8443dff90910f10ac41150"
1762
+ dependencies = [
1763
+ "log",
1764
+ "symphonia-core",
1765
+ ]
1766
+
1767
+ [[package]]
1768
+ name = "symphonia-codec-pcm"
1769
+ version = "0.5.3"
1770
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1771
+ checksum = "47f1fbd220a06a641c8ce2ddad10f5ef6ee5cc0c54d9044d25d43b0d3119deaa"
1772
+ dependencies = [
1773
+ "log",
1774
+ "symphonia-core",
1775
+ ]
1776
+
1777
+ [[package]]
1778
+ name = "symphonia-codec-vorbis"
1779
+ version = "0.5.3"
1780
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1781
+ checksum = "3953397e3506aa01350c4205817e4f95b58d476877a42f0458d07b665749e203"
1782
+ dependencies = [
1783
+ "log",
1784
+ "symphonia-core",
1785
+ "symphonia-utils-xiph",
1786
+ ]
1787
+
1788
+ [[package]]
1789
+ name = "symphonia-core"
1790
+ version = "0.5.3"
1791
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1792
+ checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142"
1793
+ dependencies = [
1794
+ "arrayvec",
1795
+ "bitflags",
1796
+ "bytemuck",
1797
+ "lazy_static",
1798
+ "log",
1799
+ ]
1800
+
1801
+ [[package]]
1802
+ name = "symphonia-format-mkv"
1803
+ version = "0.5.3"
1804
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1805
+ checksum = "f5c61dfc851ad25d4043d8c231d8617e8f7cd02a6cc0edad21ade21848d58895"
1806
+ dependencies = [
1807
+ "lazy_static",
1808
+ "log",
1809
+ "symphonia-core",
1810
+ "symphonia-metadata",
1811
+ "symphonia-utils-xiph",
1812
+ ]
1813
+
1814
+ [[package]]
1815
+ name = "symphonia-format-ogg"
1816
+ version = "0.5.3"
1817
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1818
+ checksum = "9bf1a00ccd11452d44048a0368828040f778ae650418dbd9d8765b7ee2574c8d"
1819
+ dependencies = [
1820
+ "log",
1821
+ "symphonia-core",
1822
+ "symphonia-metadata",
1823
+ "symphonia-utils-xiph",
1824
+ ]
1825
+
1826
+ [[package]]
1827
+ name = "symphonia-format-wav"
1828
+ version = "0.5.3"
1829
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1830
+ checksum = "da76614728fa27c003bdcdfbac51396bd8fcbf94c95fe8e62f1d2bac58ef03a4"
1831
+ dependencies = [
1832
+ "log",
1833
+ "symphonia-core",
1834
+ "symphonia-metadata",
1835
+ ]
1836
+
1837
+ [[package]]
1838
+ name = "symphonia-metadata"
1839
+ version = "0.5.3"
1840
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1841
+ checksum = "89c3e1937e31d0e068bbe829f66b2f2bfaa28d056365279e0ef897172c3320c0"
1842
+ dependencies = [
1843
+ "encoding_rs",
1844
+ "lazy_static",
1845
+ "log",
1846
+ "symphonia-core",
1847
+ ]
1848
+
1849
+ [[package]]
1850
+ name = "symphonia-utils-xiph"
1851
+ version = "0.5.3"
1852
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1853
+ checksum = "a450ca645b80d69aff8b35576cbfdc7f20940b29998202aab910045714c951f8"
1854
+ dependencies = [
1855
+ "symphonia-core",
1856
+ "symphonia-metadata",
1857
+ ]
1858
+
1859
+ [[package]]
1860
+ name = "syn"
1861
+ version = "2.0.38"
1862
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1863
+ checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
1864
+ dependencies = [
1865
+ "proc-macro2",
1866
+ "quote",
1867
+ "unicode-ident",
1868
+ ]
1869
+
1870
+ [[package]]
1871
+ name = "thiserror"
1872
+ version = "1.0.49"
1873
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1874
+ checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
1875
+ dependencies = [
1876
+ "thiserror-impl",
1877
+ ]
1878
+
1879
+ [[package]]
1880
+ name = "thiserror-impl"
1881
+ version = "1.0.49"
1882
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1883
+ checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
1884
+ dependencies = [
1885
+ "proc-macro2",
1886
+ "quote",
1887
+ "syn",
1888
+ ]
1889
+
1890
+ [[package]]
1891
+ name = "thread_local"
1892
+ version = "1.1.7"
1893
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1894
+ checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
1895
+ dependencies = [
1896
+ "cfg-if",
1897
+ "once_cell",
1898
+ ]
1899
+
1900
+ [[package]]
1901
+ name = "time"
1902
+ version = "0.3.30"
1903
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1904
+ checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5"
1905
+ dependencies = [
1906
+ "deranged",
1907
+ "powerfmt",
1908
+ "serde",
1909
+ "time-core",
1910
+ "time-macros",
1911
+ ]
1912
+
1913
+ [[package]]
1914
+ name = "time-core"
1915
+ version = "0.1.2"
1916
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1917
+ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
1918
+
1919
+ [[package]]
1920
+ name = "time-macros"
1921
+ version = "0.2.15"
1922
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1923
+ checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
1924
+ dependencies = [
1925
+ "time-core",
1926
+ ]
1927
+
1928
+ [[package]]
1929
+ name = "tinyvec"
1930
+ version = "1.6.0"
1931
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1932
+ checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
1933
+ dependencies = [
1934
+ "tinyvec_macros",
1935
+ ]
1936
+
1937
+ [[package]]
1938
+ name = "tinyvec_macros"
1939
+ version = "0.1.1"
1940
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1941
+ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1942
+
1943
+ [[package]]
1944
+ name = "tokio"
1945
+ version = "1.33.0"
1946
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1947
+ checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
1948
+ dependencies = [
1949
+ "backtrace",
1950
+ "bytes",
1951
+ "libc",
1952
+ "mio",
1953
+ "num_cpus",
1954
+ "parking_lot",
1955
+ "pin-project-lite",
1956
+ "signal-hook-registry",
1957
+ "socket2 0.5.4",
1958
+ "tokio-macros",
1959
+ "windows-sys",
1960
+ ]
1961
+
1962
+ [[package]]
1963
+ name = "tokio-macros"
1964
+ version = "2.1.0"
1965
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1966
+ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
1967
+ dependencies = [
1968
+ "proc-macro2",
1969
+ "quote",
1970
+ "syn",
1971
+ ]
1972
+
1973
+ [[package]]
1974
+ name = "tokio-rustls"
1975
+ version = "0.24.1"
1976
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1977
+ checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1978
+ dependencies = [
1979
+ "rustls",
1980
+ "tokio",
1981
+ ]
1982
+
1983
+ [[package]]
1984
+ name = "tokio-stream"
1985
+ version = "0.1.14"
1986
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1987
+ checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
1988
+ dependencies = [
1989
+ "futures-core",
1990
+ "pin-project-lite",
1991
+ "tokio",
1992
+ ]
1993
+
1994
+ [[package]]
1995
+ name = "tokio-tungstenite"
1996
+ version = "0.20.1"
1997
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1998
+ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
1999
+ dependencies = [
2000
+ "futures-util",
2001
+ "log",
2002
+ "tokio",
2003
+ "tungstenite",
2004
+ ]
2005
+
2006
+ [[package]]
2007
+ name = "tokio-util"
2008
+ version = "0.7.9"
2009
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2010
+ checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d"
2011
+ dependencies = [
2012
+ "bytes",
2013
+ "futures-core",
2014
+ "futures-sink",
2015
+ "pin-project-lite",
2016
+ "tokio",
2017
+ "tracing",
2018
+ ]
2019
+
2020
+ [[package]]
2021
+ name = "toml_datetime"
2022
+ version = "0.6.3"
2023
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2024
+ checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
2025
+
2026
+ [[package]]
2027
+ name = "toml_edit"
2028
+ version = "0.19.15"
2029
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2030
+ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
2031
+ dependencies = [
2032
+ "indexmap 2.0.2",
2033
+ "toml_datetime",
2034
+ "winnow",
2035
+ ]
2036
+
2037
+ [[package]]
2038
+ name = "tower"
2039
+ version = "0.4.13"
2040
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2041
+ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
2042
+ dependencies = [
2043
+ "futures-core",
2044
+ "futures-util",
2045
+ "pin-project",
2046
+ "pin-project-lite",
2047
+ "tokio",
2048
+ "tower-layer",
2049
+ "tower-service",
2050
+ "tracing",
2051
+ ]
2052
+
2053
+ [[package]]
2054
+ name = "tower-layer"
2055
+ version = "0.3.2"
2056
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2057
+ checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
2058
+
2059
+ [[package]]
2060
+ name = "tower-service"
2061
+ version = "0.3.2"
2062
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2063
+ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
2064
+
2065
+ [[package]]
2066
+ name = "tracing"
2067
+ version = "0.1.39"
2068
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2069
+ checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9"
2070
+ dependencies = [
2071
+ "log",
2072
+ "pin-project-lite",
2073
+ "tracing-attributes",
2074
+ "tracing-core",
2075
+ ]
2076
+
2077
+ [[package]]
2078
+ name = "tracing-attributes"
2079
+ version = "0.1.27"
2080
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2081
+ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
2082
+ dependencies = [
2083
+ "proc-macro2",
2084
+ "quote",
2085
+ "syn",
2086
+ ]
2087
+
2088
+ [[package]]
2089
+ name = "tracing-core"
2090
+ version = "0.1.32"
2091
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2092
+ checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
2093
+ dependencies = [
2094
+ "once_cell",
2095
+ "valuable",
2096
+ ]
2097
+
2098
+ [[package]]
2099
+ name = "tracing-log"
2100
+ version = "0.1.3"
2101
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2102
+ checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
2103
+ dependencies = [
2104
+ "lazy_static",
2105
+ "log",
2106
+ "tracing-core",
2107
+ ]
2108
+
2109
+ [[package]]
2110
+ name = "tracing-subscriber"
2111
+ version = "0.3.17"
2112
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2113
+ checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
2114
+ dependencies = [
2115
+ "nu-ansi-term",
2116
+ "sharded-slab",
2117
+ "smallvec",
2118
+ "thread_local",
2119
+ "tracing-core",
2120
+ "tracing-log",
2121
+ ]
2122
+
2123
+ [[package]]
2124
+ name = "try-lock"
2125
+ version = "0.2.4"
2126
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2127
+ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
2128
+
2129
+ [[package]]
2130
+ name = "tungstenite"
2131
+ version = "0.20.1"
2132
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2133
+ checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
2134
+ dependencies = [
2135
+ "byteorder",
2136
+ "bytes",
2137
+ "data-encoding",
2138
+ "http",
2139
+ "httparse",
2140
+ "log",
2141
+ "rand",
2142
+ "sha1",
2143
+ "thiserror",
2144
+ "url",
2145
+ "utf-8",
2146
+ ]
2147
+
2148
+ [[package]]
2149
+ name = "typenum"
2150
+ version = "1.17.0"
2151
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2152
+ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
2153
+
2154
+ [[package]]
2155
+ name = "uncased"
2156
+ version = "0.9.9"
2157
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2158
+ checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68"
2159
+ dependencies = [
2160
+ "version_check",
2161
+ ]
2162
+
2163
+ [[package]]
2164
+ name = "unicase"
2165
+ version = "2.7.0"
2166
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2167
+ checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
2168
+ dependencies = [
2169
+ "version_check",
2170
+ ]
2171
+
2172
+ [[package]]
2173
+ name = "unicode-bidi"
2174
+ version = "0.3.13"
2175
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2176
+ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
2177
+
2178
+ [[package]]
2179
+ name = "unicode-ident"
2180
+ version = "1.0.12"
2181
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2182
+ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
2183
+
2184
+ [[package]]
2185
+ name = "unicode-normalization"
2186
+ version = "0.1.22"
2187
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2188
+ checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
2189
+ dependencies = [
2190
+ "tinyvec",
2191
+ ]
2192
+
2193
+ [[package]]
2194
+ name = "untrusted"
2195
+ version = "0.7.1"
2196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2197
+ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
2198
+
2199
+ [[package]]
2200
+ name = "url"
2201
+ version = "2.4.1"
2202
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2203
+ checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
2204
+ dependencies = [
2205
+ "form_urlencoded",
2206
+ "idna",
2207
+ "percent-encoding",
2208
+ ]
2209
+
2210
+ [[package]]
2211
+ name = "urlencoding"
2212
+ version = "2.1.3"
2213
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2214
+ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
2215
+
2216
+ [[package]]
2217
+ name = "utf-8"
2218
+ version = "0.7.6"
2219
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2220
+ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
2221
+
2222
+ [[package]]
2223
+ name = "utf8parse"
2224
+ version = "0.2.1"
2225
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2226
+ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
2227
+
2228
+ [[package]]
2229
+ name = "uuid"
2230
+ version = "1.4.1"
2231
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2232
+ checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
2233
+
2234
+ [[package]]
2235
+ name = "valuable"
2236
+ version = "0.1.0"
2237
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2238
+ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
2239
+
2240
+ [[package]]
2241
+ name = "version_check"
2242
+ version = "0.9.4"
2243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2244
+ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
2245
+
2246
+ [[package]]
2247
+ name = "vsimd"
2248
+ version = "0.8.0"
2249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2250
+ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
2251
+
2252
+ [[package]]
2253
+ name = "want"
2254
+ version = "0.3.1"
2255
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2256
+ checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
2257
+ dependencies = [
2258
+ "try-lock",
2259
+ ]
2260
+
2261
+ [[package]]
2262
+ name = "wasi"
2263
+ version = "0.11.0+wasi-snapshot-preview1"
2264
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2265
+ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2266
+
2267
+ [[package]]
2268
+ name = "wasm-bindgen"
2269
+ version = "0.2.87"
2270
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2271
+ checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
2272
+ dependencies = [
2273
+ "cfg-if",
2274
+ "wasm-bindgen-macro",
2275
+ ]
2276
+
2277
+ [[package]]
2278
+ name = "wasm-bindgen-backend"
2279
+ version = "0.2.87"
2280
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2281
+ checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
2282
+ dependencies = [
2283
+ "bumpalo",
2284
+ "log",
2285
+ "once_cell",
2286
+ "proc-macro2",
2287
+ "quote",
2288
+ "syn",
2289
+ "wasm-bindgen-shared",
2290
+ ]
2291
+
2292
+ [[package]]
2293
+ name = "wasm-bindgen-macro"
2294
+ version = "0.2.87"
2295
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2296
+ checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
2297
+ dependencies = [
2298
+ "quote",
2299
+ "wasm-bindgen-macro-support",
2300
+ ]
2301
+
2302
+ [[package]]
2303
+ name = "wasm-bindgen-macro-support"
2304
+ version = "0.2.87"
2305
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2306
+ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
2307
+ dependencies = [
2308
+ "proc-macro2",
2309
+ "quote",
2310
+ "syn",
2311
+ "wasm-bindgen-backend",
2312
+ "wasm-bindgen-shared",
2313
+ ]
2314
+
2315
+ [[package]]
2316
+ name = "wasm-bindgen-shared"
2317
+ version = "0.2.87"
2318
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2319
+ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
2320
+
2321
+ [[package]]
2322
+ name = "web-sys"
2323
+ version = "0.3.64"
2324
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2325
+ checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
2326
+ dependencies = [
2327
+ "js-sys",
2328
+ "wasm-bindgen",
2329
+ ]
2330
+
2331
+ [[package]]
2332
+ name = "winapi"
2333
+ version = "0.3.9"
2334
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2335
+ checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2336
+ dependencies = [
2337
+ "winapi-i686-pc-windows-gnu",
2338
+ "winapi-x86_64-pc-windows-gnu",
2339
+ ]
2340
+
2341
+ [[package]]
2342
+ name = "winapi-i686-pc-windows-gnu"
2343
+ version = "0.4.0"
2344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2345
+ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2346
+
2347
+ [[package]]
2348
+ name = "winapi-x86_64-pc-windows-gnu"
2349
+ version = "0.4.0"
2350
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2351
+ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2352
+
2353
+ [[package]]
2354
+ name = "windows-sys"
2355
+ version = "0.48.0"
2356
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2357
+ checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
2358
+ dependencies = [
2359
+ "windows-targets",
2360
+ ]
2361
+
2362
+ [[package]]
2363
+ name = "windows-targets"
2364
+ version = "0.48.5"
2365
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2366
+ checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
2367
+ dependencies = [
2368
+ "windows_aarch64_gnullvm",
2369
+ "windows_aarch64_msvc",
2370
+ "windows_i686_gnu",
2371
+ "windows_i686_msvc",
2372
+ "windows_x86_64_gnu",
2373
+ "windows_x86_64_gnullvm",
2374
+ "windows_x86_64_msvc",
2375
+ ]
2376
+
2377
+ [[package]]
2378
+ name = "windows_aarch64_gnullvm"
2379
+ version = "0.48.5"
2380
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2381
+ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
2382
+
2383
+ [[package]]
2384
+ name = "windows_aarch64_msvc"
2385
+ version = "0.48.5"
2386
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2387
+ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
2388
+
2389
+ [[package]]
2390
+ name = "windows_i686_gnu"
2391
+ version = "0.48.5"
2392
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2393
+ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
2394
+
2395
+ [[package]]
2396
+ name = "windows_i686_msvc"
2397
+ version = "0.48.5"
2398
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2399
+ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
2400
+
2401
+ [[package]]
2402
+ name = "windows_x86_64_gnu"
2403
+ version = "0.48.5"
2404
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2405
+ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
2406
+
2407
+ [[package]]
2408
+ name = "windows_x86_64_gnullvm"
2409
+ version = "0.48.5"
2410
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2411
+ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
2412
+
2413
+ [[package]]
2414
+ name = "windows_x86_64_msvc"
2415
+ version = "0.48.5"
2416
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2417
+ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
2418
+
2419
+ [[package]]
2420
+ name = "winnow"
2421
+ version = "0.5.17"
2422
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2423
+ checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
2424
+ dependencies = [
2425
+ "memchr",
2426
+ ]
2427
+
2428
+ [[package]]
2429
+ name = "xmlparser"
2430
+ version = "0.13.6"
2431
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2432
+ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
2433
+
2434
+ [[package]]
2435
+ name = "zeroize"
2436
+ version = "1.6.0"
2437
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2438
+ checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
Cargo.toml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [package]
2
+ name = "polyhedron"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7
+
8
+ [dependencies]
9
+ aws-config= { version = "0.56.1" }
10
+ aws-sdk-transcribestreaming= { version = "0.33.0" }
11
+ aws-sdk-translate = "0.33.0"
12
+ aws-sdk-polly = "0.33.0"
13
+ clap = { version = "4.4.6" , features = ["derive"]}
14
+ hound = "3.5.1"
15
+ tokio = { version = "1.33.0" , features = ["full"] }
16
+ tokio-stream = "0.1.14"
17
+ bytes = "1.0.1"
18
+ async-stream = "0.3.5"
19
+ tracing-subscriber = "0.3.17"
20
+ futures-util = "0.3.28"
21
+ #symphonia-codec-pcm = "0.5.3"
22
+ #symphonia-format-mkv = "0.5.3"
23
+ symphonia = { version = "0.5.3", features = ["mkv", "pcm"] }
24
+
25
+ [dependencies.poem]
26
+ version = "1.3.58"
27
+ features = ["websocket", "static-files"]
src/main.rs ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0.
4
+ */
5
+
6
+ #![allow(clippy::result_large_err)]
7
+
8
+ use std::default::Default;
9
+ use tokio::sync::mpsc::channel;
10
+ use async_stream::stream;
11
+ use aws_config::meta::region::RegionProviderChain;
12
+ use aws_sdk_transcribestreaming::primitives::Blob;
13
+ use aws_sdk_transcribestreaming::types::{AudioStream, AudioEvent, LanguageCode, MediaEncoding, TranscriptResultStream};
14
+ use aws_sdk_transcribestreaming::{config::Region, meta::PKG_VERSION, Client, Error};
15
+ use bytes::BufMut;
16
+ use clap::Parser;
17
+
18
+ use poem::{handler, listener::TcpListener, Server, get, Route, IntoResponse, Endpoint, EndpointExt};
19
+ use futures_util::{Sink, SinkExt};
20
+ use poem::endpoint::StaticFilesEndpoint;
21
+ use poem::web::websocket::{Message, WebSocket};
22
+ use futures_util::stream::StreamExt;
23
+
24
+ use tokio::select;
25
+ use tokio::sync::mpsc::{Receiver, Sender};
26
+
27
+
28
+ #[derive(Debug, Parser)]
29
+ struct Opt {
30
+ /// The AWS Region.
31
+ #[structopt(short, long)]
32
+ region: Option<String>,
33
+ //
34
+ // /// The name of the audio file.
35
+ // #[structopt(short, long)]
36
+ // audio_file: String,
37
+ //
38
+ /// Whether to display additional information.
39
+ #[structopt(short, long)]
40
+ verbose: bool,
41
+ }
42
+
43
+ enum ReplyEvent {
44
+ Transcribed(String),
45
+ Translated(String),
46
+ Synthesized(Vec<u8>),
47
+ }
48
+
49
+ const CHUNK_SIZE: usize = 8192;
50
+
51
+ /// Transcribes an audio file to text.
52
+ /// # Arguments
53
+ ///
54
+ /// * `-a AUDIO_FILE` - The name of the audio file.
55
+ /// It must be a WAV file, which is converted to __pcm__ format for Amazon Transcribe.
56
+ /// Amazon transcribe also supports __ogg-opus__ and __flac__ formats.
57
+ /// * `[-r REGION]` - The Region in which the client is created.
58
+ /// If not supplied, uses the value of the **AWS_REGION** environment variable.
59
+ /// If the environment variable is not set, defaults to **us-west-2**.
60
+ /// * `[-v]` - Whether to display additional information.
61
+ async fn stream_process(mut rx: Receiver<Vec<u8>>, tx: Sender<ReplyEvent>) -> Result<(), Error> {
62
+ tracing_subscriber::fmt::init();
63
+
64
+ let Opt {
65
+ region,
66
+ // audio_file,
67
+ verbose,
68
+ } = Opt::parse();
69
+
70
+ let region_provider = RegionProviderChain::first_try(region.map(Region::new))
71
+ .or_default_provider()
72
+ .or_else(Region::new("us-west-2"));
73
+
74
+ println!();
75
+
76
+ if verbose {
77
+ println!("Transcribe client version: {}", PKG_VERSION);
78
+ println!(
79
+ "Region: {}",
80
+ region_provider.region().await.unwrap().as_ref()
81
+ );
82
+ // println!("Audio filename: {}", &audio_file);
83
+ println!();
84
+ }
85
+
86
+ let shared_config = aws_config::from_env().region(region_provider).load().await;
87
+ let transcript_client = Client::new(&shared_config);
88
+ let translate_client = aws_sdk_translate::Client::new(&shared_config);
89
+ let polly_client = aws_sdk_polly::Client::new(&shared_config);
90
+
91
+ let input_stream = stream! {
92
+ while let Some(raw) = rx.recv().await {
93
+ yield Ok(AudioStream::AudioEvent(AudioEvent::builder().audio_chunk(Blob::new(raw)).build()));
94
+ }
95
+ };
96
+
97
+ let mut output = transcript_client
98
+ .start_stream_transcription()
99
+ .language_code(LanguageCode::ZhCn)//LanguageCode::EnGb
100
+ .media_sample_rate_hertz(16000)
101
+ .media_encoding(MediaEncoding::Pcm)
102
+ .audio_stream(input_stream.into())
103
+ .send()
104
+ .await?;
105
+
106
+ while let Some(event) = output.transcript_result_stream.recv().await? {
107
+ match event {
108
+ TranscriptResultStream::TranscriptEvent(transcript_event) => {
109
+ let transcript = transcript_event.transcript.expect("transcript");
110
+ for result in transcript.results.unwrap_or_default() {
111
+ if result.is_partial {
112
+ if verbose {
113
+ println!("Partial: {:?}", result);
114
+ }
115
+ } else {
116
+ let first_alternative = &result.alternatives.as_ref().expect("should have")[0];
117
+ let slice = first_alternative.transcript.as_ref().expect("should have");
118
+ println!("Line: {:?}", slice);
119
+ tx.send(ReplyEvent::Transcribed(slice.clone())).await.expect("failed to send");
120
+ let lc = result.language_code.as_ref().map(|lc| lc.as_str().to_string());
121
+ let translated = translate(&translate_client, first_alternative.transcript.clone(), lc).await;
122
+ if let Some(has) = translated {
123
+ tx.send(ReplyEvent::Transcribed(has.clone())).await.expect("failed to send");
124
+ println!("Translated: {}", has);
125
+ if let Some(synthesized) = synthesize(&polly_client, has).await {
126
+ tx.send(ReplyEvent::Synthesized(synthesized)).await.expect("failed to send");
127
+ }
128
+ }
129
+
130
+ }
131
+ }
132
+ }
133
+ otherwise => panic!("received unexpected event type: {:?}", otherwise),
134
+ }
135
+ }
136
+
137
+ Ok(())
138
+ }
139
+
140
+ async fn translate(client: &aws_sdk_translate::Client, transcript: Option<String>, source_lang_code: Option<String>) -> Option<String> {
141
+ let res = client.translate_text()
142
+ .set_text(transcript)
143
+ .set_source_language_code(Some("zh".to_string()))
144
+ .set_target_language_code(Some("en".to_string()))
145
+ .send().await;
146
+ res.expect("failed to translate").translated_text
147
+ }
148
+
149
+ async fn synthesize(client: &aws_sdk_polly::Client, transcript: String) -> Option<Vec<u8>> {
150
+ let res = client.synthesize_speech()
151
+ .set_text(Some(transcript))
152
+ .voice_id("Amy".into())
153
+ .output_format("pcm".into())
154
+ .language_code("en-US".into())
155
+ // .language_code("cmn-CN".into())
156
+ .send().await;
157
+ let bs = res.expect("failed to translate").audio_stream.collect().await.ok()?;
158
+ Some(bs.to_vec())
159
+ }
160
+
161
+ fn pcm_data(audio_file: &str) -> Vec<u8> {
162
+ let reader = hound::WavReader::open(audio_file).unwrap();
163
+ let samples_result: hound::Result<Vec<i16>> = reader.into_samples::<i16>().collect();
164
+
165
+ let mut pcm: Vec<u8> = Vec::new();
166
+ for sample in samples_result.unwrap() {
167
+ pcm.put_i16_le(sample);
168
+ }
169
+ pcm
170
+ }
171
+
172
+ #[tokio::main]
173
+ async fn main() -> Result<(), std::io::Error> { let app = Route::new().nest(
174
+ "/",
175
+ StaticFilesEndpoint::new("./static")
176
+ .show_files_listing()
177
+ .index_file("index.html"),
178
+ ).at("/translate", get(stream_translate));
179
+ let listener = TcpListener::bind("[::]:8080");
180
+ let server = Server::new(listener);
181
+
182
+ server.run(app).await
183
+ }
184
+
185
+
186
+ #[handler]
187
+ async fn stream_translate(ws: WebSocket) -> impl IntoResponse {
188
+ ws.on_upgrade(|mut socket| async move {
189
+ let (origin_tx, origin_rx) = channel::<Vec<u8>>(128);
190
+ let (translate_tx, mut translate_rx) = channel::<ReplyEvent>(128);
191
+ let stream_fut = stream_process(origin_rx, translate_tx);
192
+
193
+ let ws_fut = async {
194
+ loop {
195
+ select! {
196
+ msg = socket.next() => {
197
+ match msg.as_ref() {
198
+ Some(Ok(Message::Binary(bin))) => {
199
+ origin_tx.send(bin.to_vec()).await.expect("failed to send");
200
+ },
201
+ Some(Ok(_)) => {
202
+ println!("Other: {:?}", msg);
203
+ },
204
+ Some(Err(e)) => {
205
+ println!("Error: {:?}", e);
206
+ },
207
+ None => {
208
+ socket.close().await.expect("failed to close");
209
+ println!("Other: {:?}", msg);
210
+ break;
211
+ }
212
+ }
213
+ },
214
+ output = translate_rx.recv() => {
215
+ if let Some(reply) = output {
216
+ match reply {
217
+ ReplyEvent::Transcribed(transcript) => {
218
+ println!("Transcribed: {}", transcript);
219
+ socket.send(Message::Text(transcript)).await.expect("failed to send");
220
+ },
221
+ ReplyEvent::Translated(translated) => {
222
+ println!("Translated: {}", translated);
223
+ socket.send(Message::Text(translated)).await.expect("failed to send");
224
+ },
225
+ ReplyEvent::Synthesized(raw) => {
226
+ println!("Synthesized: {:?}", raw.len());
227
+ socket.send(Message::Binary(raw)).await.expect("failed to send");
228
+ },
229
+ }
230
+ }
231
+ },
232
+ }
233
+ }
234
+ };
235
+ select! {
236
+ _ = stream_fut => {},
237
+ _ = ws_fut => {},
238
+ }
239
+ })
240
+ }
241
+
static/client.js CHANGED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ // Google Cloud Speech Playground with node.js and socket.io
4
+ // Created by Vinzenz Aubry for sansho 24.01.17
5
+ // Feel free to improve!
6
+ // Contact: [email protected]
7
+
8
+ //connection to socket
9
+ let websocket_uri
10
+ if (location.protocol === "https:") {
11
+ websocket_uri = "wss:"
12
+ } else {
13
+ websocket_uri = "ws:"
14
+ }
15
+ websocket_uri += "//" + location.host
16
+ websocket_uri += location.pathname + "translate"
17
+ const socket = new WebSocket(websocket_uri);
18
+
19
+ //================= CONFIG =================
20
+ // Stream Audio
21
+ let bufferSize = 2048,
22
+ AudioContext,
23
+ context,
24
+ processor,
25
+ input,
26
+ globalStream;
27
+
28
+ //vars
29
+ let audioElement = document.querySelector('audio'),
30
+ finalWord = false,
31
+ resultText = document.getElementById('ResultText'),
32
+ removeLastSentence = true,
33
+ streamStreaming = false;
34
+
35
+ //audioStream constraints
36
+ const constraints = {
37
+ audio: true,
38
+ video: false,
39
+ };
40
+
41
+ //================= RECORDING =================
42
+
43
+ async function initRecording() {
44
+ // socket.emit('startGoogleCloudStream', ''); //init socket Google Speech Connection
45
+ streamStreaming = true;
46
+ AudioContext = window.AudioContext || window.webkitAudioContext;
47
+ context = new AudioContext({
48
+ // if Non-interactive, use 'playback' or 'balanced' // https://developer.mozilla.org/en-US/docs/Web/API/AudioContextLatencyCategory
49
+ latencyHint: 'interactive',
50
+ });
51
+
52
+ await context.audioWorklet.addModule('recorderWorkletProcessor.js')
53
+ context.resume();
54
+
55
+ globalStream = await navigator.mediaDevices.getUserMedia(constraints)
56
+ input = context.createMediaStreamSource(globalStream)
57
+ processor = new window.AudioWorkletNode(
58
+ context,
59
+ 'recorder.worklet'
60
+ );
61
+ processor.connect(context.destination);
62
+ context.resume()
63
+ input.connect(processor)
64
+ processor.port.onmessage = (e) => {
65
+ const audioData = e.data;
66
+ microphoneProcess(audioData)
67
+ }
68
+ }
69
+
70
+ function microphoneProcess(buffer) {
71
+ socket.send(buffer);
72
+ }
73
+
74
+ //================= INTERFACE =================
75
+ var startButton = document.getElementById('startRecButton');
76
+ startButton.addEventListener('click', startRecording);
77
+
78
+ var endButton = document.getElementById('stopRecButton');
79
+ endButton.addEventListener('click', stopRecording);
80
+ endButton.disabled = true;
81
+
82
+ var recordingStatus = document.getElementById('recordingStatus');
83
+
84
+ function startRecording() {
85
+ startButton.disabled = true;
86
+ endButton.disabled = false;
87
+ recordingStatus.style.visibility = 'visible';
88
+ initRecording();
89
+ }
90
+
91
+ function stopRecording() {
92
+ // waited for FinalWord
93
+ startButton.disabled = false;
94
+ endButton.disabled = true;
95
+ recordingStatus.style.visibility = 'hidden';
96
+ streamStreaming = false;
97
+ // socket.emit('endGoogleCloudStream', '');
98
+
99
+ let track = globalStream.getTracks()[0];
100
+ track.stop();
101
+
102
+ input.disconnect(processor);
103
+ processor.disconnect(context.destination);
104
+ context.close().then(function () {
105
+ input = null;
106
+ processor = null;
107
+ context = null;
108
+ AudioContext = null;
109
+ startButton.disabled = false;
110
+ });
111
+
112
+ // context.close();
113
+
114
+ // audiovideostream.stop();
115
+
116
+ // microphone_stream.disconnect(script_processor_node);
117
+ // script_processor_node.disconnect(audioContext.destination);
118
+ // microphone_stream = null;
119
+ // script_processor_node = null;
120
+
121
+ // audiovideostream.stop();
122
+ // videoElement.srcObject = null;
123
+ }
124
+
125
+ //================= SOCKET IO =================
126
+ socket.onmessage = function (msg) {
127
+ if (msg.data instanceof Blob) {
128
+ playAudio(msg.data)
129
+ } else {
130
+ // text
131
+ onSpeechData(msg.data)
132
+ }
133
+ }
134
+ socket.onclose = function () {
135
+ processor.stop()
136
+ }
137
+
138
+ function onSpeechData(data) {
139
+ var dataFinal = false;
140
+
141
+ if (dataFinal === false) {
142
+ // console.log(resultText.lastElementChild);
143
+ if (removeLastSentence) {
144
+ resultText.lastElementChild.remove();
145
+ }
146
+ removeLastSentence = true;
147
+
148
+ //add empty span
149
+ let empty = document.createElement('span');
150
+ resultText.appendChild(empty);
151
+
152
+ //add children to empty span
153
+ let edit = addTimeSettingsInterim(data);
154
+
155
+ for (var i = 0; i < edit.length; i++) {
156
+ resultText.lastElementChild.appendChild(edit[i]);
157
+ resultText.lastElementChild.appendChild(
158
+ document.createTextNode('\u00A0')
159
+ );
160
+ }
161
+ } else if (dataFinal === true) {
162
+ resultText.lastElementChild.remove();
163
+
164
+ //add empty span
165
+ let empty = document.createElement('span');
166
+ resultText.appendChild(empty);
167
+
168
+ //add children to empty span
169
+ let edit = addTimeSettingsFinal(data);
170
+ for (var i = 0; i < edit.length; i++) {
171
+ if (i === 0) {
172
+ edit[i].innerText = capitalize(edit[i].innerText);
173
+ }
174
+ resultText.lastElementChild.appendChild(edit[i]);
175
+
176
+ if (i !== edit.length - 1) {
177
+ resultText.lastElementChild.appendChild(
178
+ document.createTextNode('\u00A0')
179
+ );
180
+ }
181
+ }
182
+ resultText.lastElementChild.appendChild(
183
+ document.createTextNode('\u002E\u00A0')
184
+ );
185
+
186
+ console.log("Google Speech sent 'final' Sentence.");
187
+ finalWord = true;
188
+ endButton.disabled = false;
189
+
190
+ removeLastSentence = false;
191
+ }
192
+ }
193
+
194
+ //================= Juggling Spans for nlp Coloring =================
195
+ function addTimeSettingsInterim(wholeString) {
196
+ console.log(wholeString);
197
+
198
+ let nlpObject = nlp(wholeString).out('terms');
199
+
200
+ let words_without_time = [];
201
+
202
+ for (let i = 0; i < nlpObject.length; i++) {
203
+ //data
204
+ let word = nlpObject[i].text;
205
+ let tags = [];
206
+
207
+ //generate span
208
+ let newSpan = document.createElement('span');
209
+ newSpan.innerHTML = word;
210
+
211
+ //push all tags
212
+ for (let j = 0; j < nlpObject[i].tags.length; j++) {
213
+ tags.push(nlpObject[i].tags[j]);
214
+ }
215
+
216
+ //add all classes
217
+ for (let j = 0; j < nlpObject[i].tags.length; j++) {
218
+ let cleanClassName = tags[j];
219
+ // console.log(tags);
220
+ let className = `nl-${cleanClassName}`;
221
+ newSpan.classList.add(className);
222
+ }
223
+
224
+ words_without_time.push(newSpan);
225
+ }
226
+
227
+ finalWord = false;
228
+ endButton.disabled = true;
229
+
230
+ return words_without_time;
231
+ }
232
+
233
+ window.onbeforeunload = function () {
234
+ if (streamStreaming) {
235
+ // socket.emit('endGoogleCloudStream', '');
236
+ }
237
+ };
238
+
239
+ //================= SANTAS HELPERS =================
240
+
241
+ // sampleRateHertz 16000 //saved sound is awefull
242
+ function convertFloat32ToInt16(buffer) {
243
+ let l = buffer.length;
244
+ let buf = new Int16Array(l / 3);
245
+
246
+ while (l--) {
247
+ if (l % 3 == 0) {
248
+ buf[l / 3] = buffer[l] * 0xffff;
249
+ }
250
+ }
251
+ return buf.buffer;
252
+ }
253
+
254
+ function capitalize(s) {
255
+ if (s.length < 1) {
256
+ return s;
257
+ }
258
+ return s.charAt(0).toUpperCase() + s.slice(1);
259
+ }
260
+
261
+ async function playAudio(chunk) {
262
+ const audioContext = new (window.AudioContext || window.webkitAudioContext)();
263
+ const totalLength = chunk.size;
264
+
265
+ // Create an AudioBuffer of enough size
266
+ const audioBuffer = audioContext.createBuffer(1, totalLength / Int16Array.BYTES_PER_ELEMENT, 16000); // Assuming mono audio at 44.1kHz
267
+ const output = audioBuffer.getChannelData(0);
268
+
269
+ // Copy the PCM samples into the AudioBuffer
270
+ const int16Array = new Int16Array(await chunk.arrayBuffer())
271
+ for(let i = 0; i < int16Array.length; i++) {
272
+ output[i] = int16Array[i] / 32768.0; // Convert to [-1, 1] float32 range
273
+ }
274
+
275
+ // 3. Play the audio using Web Audio API
276
+ const source = audioContext.createBufferSource();
277
+ source.buffer = audioBuffer;
278
+ source.connect(audioContext.destination);
279
+ source.start();
280
+ }
static/index.html CHANGED
@@ -1,10 +1,47 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
 
3
  <head>
4
- <meta charset="UTF-8">
5
- <title>$Title$</title>
 
 
 
 
 
6
  </head>
 
7
  <body>
8
- $END$
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  </body>
 
10
  </html>
 
1
+ <!doctype html>
2
+ <html class="no-js" lang="en">
3
+
4
  <head>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
7
+ <title>GCloud Speech Recognition Node + Socket.io</title>
8
+ <meta name="description" content="Google Cloud Speech Recognition with Node and Socket.io">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1">
10
+
11
+ <link rel="stylesheet" href="main.css">
12
  </head>
13
+
14
  <body>
15
+ <div class="wrapper">
16
+ <h1>Google Cloud Speech Node with Socket.io Playground</h1>
17
+
18
+ <audio></audio>
19
+
20
+ <br>
21
+ <button id="startRecButton" type="button"> Start recording</button>
22
+ <button id="stopRecButton" type="button"> Stop recording</button>
23
+ <div id="recordingStatus">&nbsp;</div>
24
+ <br>
25
+
26
+ <div>
27
+ <p id="ResultText">
28
+ <span class="greyText">No Speech to Text yet
29
+ <span>
30
+ </p>
31
+ </div>
32
+
33
+ <br>
34
+ <br>
35
+ </div>
36
+
37
+ <!-- Nlp -->
38
+ <script src="https://unpkg.com/[email protected]/builds/compromise.min.js"></script>
39
+
40
+ <!-- Socket -->
41
+ <!--<script src="assets/js/socket.io.js"></script>-->
42
+
43
+ <!-- Client -->
44
+ <script src="client.js"></script>
45
  </body>
46
+
47
  </html>
static/main.css CHANGED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body {
2
+ font-family: sans-serif;
3
+ background-color: rgb(189, 189, 189);
4
+ }
5
+
6
+ p {
7
+ color: black;
8
+ }
9
+
10
+ a {
11
+ font-weight: bold;
12
+ text-decoration: none;
13
+ color: #2a2a2a;
14
+ }
15
+
16
+ a:visited {
17
+ font-weight: normal;
18
+ }
19
+
20
+ a:hover {
21
+ text-decoration: underline;
22
+ }
23
+
24
+ audio {
25
+ width: 300px;
26
+ height: auto;
27
+ backgorund-color: red;
28
+ }
29
+
30
+ .wrapper {
31
+ width: 90vw;
32
+ margin: 0 auto;
33
+ }
34
+
35
+ .greyText {
36
+ opacity: 0.4;
37
+ }
38
+
39
+ @-webkit-keyframes redGlow {
40
+ from {
41
+ background-color: #8c190a;
42
+ -webkit-box-shadow: 0 0 9px #9c291a;
43
+ }
44
+ 50% {
45
+ background-color: #9c291a;
46
+ -webkit-box-shadow: 0 0 18px #bdb5b4;
47
+ }
48
+ to {
49
+ background-color: #8c190a;
50
+ -webkit-box-shadow: 0 0 9px #9c291a;
51
+ }
52
+ }
53
+ #recordingStatus {
54
+ display: inline-block;
55
+ width: 18px;
56
+ height: 18px;
57
+ border-radius: 20px;
58
+ visibility: hidden;
59
+ -webkit-animation-name: redGlow;
60
+ -webkit-animation-duration: 2s;
61
+ -webkit-animation-iteration-count: infinite;
62
+ }
63
+
64
+ #ResultText {
65
+ width: 80vw;
66
+ }
67
+
68
+ #ResultText span {
69
+ display: inline-block;
70
+ margin-top: 10px;
71
+ }
72
+
73
+ #sessionSpeechData {
74
+ width: 80vw;
75
+ }
76
+
77
+ #sessionSpeechData span {
78
+ display: inline-block;
79
+ margin-top: 10px;
80
+ }
81
+
82
+ .nl-Adjective {
83
+ background-color: #1ada47;
84
+ padding: 3px;
85
+ border-radius: 5px;
86
+ }
87
+
88
+ .nl-Noun {
89
+ background-color: #151ffa;
90
+ padding: 3px;
91
+ border-radius: 5px;
92
+ color: white;
93
+ }
94
+
95
+ .nl-Verb {
96
+ background-color: #ff1616;
97
+ padding: 3px;
98
+ border-radius: 5px;
99
+ }
100
+
101
+
102
+ .hiddenForms {
103
+ opacity: 0.2;
104
+ }
105
+
106
+ h1 {
107
+ color: black;
108
+ }
109
+
110
+
111
+ /* ==========================================================================
112
+ Media Queries
113
+ ========================================================================== */
114
+
115
+ /*========== Non-Mobile First Method ==========*/
116
+
117
+ /*Above */
118
+
119
+ @media only screen and (min-width: 1201px) {}
120
+
121
+ /* Large Devices, Wide Screens */
122
+
123
+ @media only screen and (max-width: 1200px) {}
124
+
125
+ /* Medium Devices, Desktops */
126
+
127
+ @media only screen and (max-width: 992px) {}
128
+
129
+ /* Small Devices, Tablets */
130
+
131
+ @media only screen and (max-width: 768px) {}
132
+
133
+ /* Extra Small Devices, Phones */
134
+
135
+ @media only screen and (max-width: 480px) {}
136
+
137
+ /* Custom, iPhone Retina */
138
+
139
+ @media only screen and (max-width: 320px) {}
140
+
141
+ @media print, (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {}
142
+
143
+ /* ==========================================================================
144
+ Helper classes
145
+ ========================================================================== */
146
+
147
+ .hidden {
148
+ display: none !important;
149
+ visibility: hidden;
150
+ }
151
+
152
+ .visuallyhidden {
153
+ border: 0;
154
+ clip: rect(0 0 0 0);
155
+ height: 1px;
156
+ margin: -1px;
157
+ overflow: hidden;
158
+ padding: 0;
159
+ position: absolute;
160
+ width: 1px;
161
+ }
162
+
163
+ .visuallyhidden.focusable:active, .visuallyhidden.focusable:focus {
164
+ clip: auto;
165
+ height: auto;
166
+ margin: 0;
167
+ overflow: visible;
168
+ position: static;
169
+ width: auto;
170
+ }
171
+
172
+ .invisible {
173
+ visibility: hidden;
174
+ }
175
+
176
+ .clearfix:before, .clearfix:after {
177
+ content: " ";
178
+ display: table;
179
+ }
180
+
181
+ .clearfix:after {
182
+ clear: both;
183
+ }
184
+
185
+ .clearfix {
186
+ *zoom: 1;
187
+ }
188
+
189
+ /* ==========================================================================
190
+ Print styles
191
+ ========================================================================== */
192
+
193
+ @media print {
194
+ *, *:before, *:after {
195
+ background: transparent !important;
196
+ color: #000 !important;
197
+ box-shadow: none !important;
198
+ text-shadow: none !important;
199
+ }
200
+ a, a:visited {
201
+ text-decoration: underline;
202
+ }
203
+ a[href]:after {
204
+ content: " (" attr(href) ")";
205
+ }
206
+ abbr[title]:after {
207
+ content: " (" attr(title) ")";
208
+ }
209
+ a[href^="#"]:after, a[href^="javascript:"]:after {
210
+ content: "";
211
+ }
212
+ pre, blockquote {
213
+ border: 1px solid #999;
214
+ page-break-inside: avoid;
215
+ }
216
+ thead {
217
+ display: table-header-group;
218
+ }
219
+ tr, img {
220
+ page-break-inside: avoid;
221
+ }
222
+ img {
223
+ max-width: 100% !important;
224
+ }
225
+ p, h2, h3 {
226
+ orphans: 3;
227
+ widows: 3;
228
+ }
229
+ h2, h3 {
230
+ page-break-after: avoid;
231
+ }
232
+ }
static/recorderWorkletProcessor.js CHANGED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ An in-place replacement for ScriptProcessorNode using AudioWorklet
3
+ */
4
+ class RecorderProcessor extends AudioWorkletProcessor {
5
+ // 0. Determine the buffer size (this is the same as the 1st argument of ScriptProcessor)
6
+ bufferSize = 2048
7
+ // 1. Track the current buffer fill level
8
+ _bytesWritten = 0
9
+
10
+ // 2. Create a buffer of fixed size
11
+ _buffer = new Float32Array(this.bufferSize)
12
+
13
+ constructor() {
14
+ super()
15
+ this.initBuffer()
16
+ }
17
+
18
+ initBuffer() {
19
+ this._bytesWritten = 0
20
+ }
21
+
22
+ isBufferEmpty() {
23
+ return this._bytesWritten === 0
24
+ }
25
+
26
+ isBufferFull() {
27
+ return this._bytesWritten === this.bufferSize
28
+ }
29
+
30
+ /**
31
+ * @param {Float32Array[][]} inputs
32
+ * @returns {boolean}
33
+ */
34
+ process(inputs) {
35
+ // Grabbing the 1st channel similar to ScriptProcessorNode
36
+ this.append(inputs[0][0])
37
+
38
+ return true
39
+ }
40
+
41
+ /**
42
+ *
43
+ * @param {Float32Array} channelData
44
+ */
45
+ append(channelData) {
46
+ if (this.isBufferFull()) {
47
+ this.flush()
48
+ }
49
+
50
+ if (!channelData) return
51
+
52
+ for (let i = 0; i < channelData.length; i++) {
53
+ this._buffer[this._bytesWritten++] = channelData[i]
54
+ }
55
+ }
56
+
57
+ flush() {
58
+ // trim the buffer if ended prematurely
59
+ const buffer = this._bytesWritten < this.bufferSize
60
+ ? this._buffer.slice(0, this._bytesWritten)
61
+ : this._buffer
62
+ const result = this.downsampleBuffer(buffer, 44100, 16000);
63
+ this.port.postMessage(result)
64
+ this.initBuffer()
65
+ }
66
+
67
+ downsampleBuffer (buffer, sampleRate, outSampleRate) {
68
+ if (outSampleRate == sampleRate) {
69
+ return buffer;
70
+ }
71
+ if (outSampleRate > sampleRate) {
72
+ throw 'downsampling rate show be smaller than original sample rate';
73
+ }
74
+ var sampleRateRatio = sampleRate / outSampleRate;
75
+ var newLength = Math.round(buffer.length / sampleRateRatio);
76
+ var result = new Int16Array(newLength);
77
+ var offsetResult = 0;
78
+ var offsetBuffer = 0;
79
+ while (offsetResult < result.length) {
80
+ var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
81
+ var accum = 0,
82
+ count = 0;
83
+ for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
84
+ accum += buffer[i];
85
+ count++;
86
+ }
87
+
88
+ result[offsetResult] = Math.min(1, accum / count) * 0x7fff;
89
+ offsetResult++;
90
+ offsetBuffer = nextOffsetBuffer;
91
+ }
92
+ return result.buffer;
93
+ };
94
+
95
+ }
96
+
97
+ registerProcessor("recorder.worklet", RecorderProcessor)