tencent_asr_probe.dart
2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
Future<void> main(List<String> args) async {
const secretId = 'AKID9Vgy8FEC5qSxLcllVCmXzJWaVSI0Z2Nb';
const secretKey = 'c2c5MTOBo5d9XilhaLzVSG4DE7qRuCJF';
const appId = '1308375824';
final int now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
final String voiceId = 'probe_${DateTime.now().microsecondsSinceEpoch}';
final Map<String, String> params = <String, String>{
'secretid': secretId,
'timestamp': '$now',
'expired': '${now + 86400}',
'nonce': '${(DateTime.now().microsecondsSinceEpoch % 999999999).abs() + 1}',
'engine_model_type': '16k_zh',
'voice_id': voiceId,
'voice_format': '1',
'needvad': '1',
'filter_modal': '1',
'filter_punc': '1',
'convert_num_mode': '1',
};
final sorted = params.entries.toList()
..sort((a, b) => a.key.compareTo(b.key));
final canonical = sorted.map((e) => '${e.key}=${e.value}').join('&');
final signText = 'asr.cloud.tencent.com/asr/v2/$appId?$canonical';
final digest = Hmac(sha1, utf8.encode(secretKey))
.convert(utf8.encode(signText))
.bytes;
final signature = base64.encode(digest);
final query = sorted
.map((e) => '${e.key}=${Uri.encodeQueryComponent(e.value)}')
.join('&');
final uri = Uri.parse(
'wss://asr.cloud.tencent.com/asr/v2/$appId?$query&signature=${Uri.encodeQueryComponent(signature)}');
stdout.writeln('signText=$signText');
stdout.writeln('signature=$signature');
stdout.writeln('url=$uri');
final channel = WebSocketChannel.connect(uri);
final completer = Completer<void>();
channel.stream.listen(
(dynamic m) {
stdout.writeln('RECV: $m');
if (!completer.isCompleted) completer.complete();
},
onError: (Object e) {
stdout.writeln('ERR: $e');
if (!completer.isCompleted) completer.completeError(e);
},
onDone: () {
stdout.writeln('DONE');
if (!completer.isCompleted) completer.complete();
},
);
await channel.ready.timeout(const Duration(seconds: 10));
await completer.future.timeout(const Duration(seconds: 12));
await channel.sink.close();
}