This repository has been archived by the owner on Feb 11, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathapi-client.py
96 lines (78 loc) · 2.28 KB
/
api-client.py
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import argparse
import random
import logging
import sys
import grpc
import torchaudio
import numpy as np
import interfaces.libreasr_pb2 as ap
import interfaces.libreasr_pb2_grpc as apg
DEMO_AUDIO = "./demo/3729-6852-0035.flac"
CHUNK_DURATION = 0.08 # secs
PORT = 50052
def load_demo():
data, sr = torchaudio.load(DEMO_AUDIO)
data = data[0][None]
data = torchaudio.transforms.Resample(sr, 16000)(data)
sr = 16000
data = data.numpy().astype(np.float32).tobytes()
return data, sr
def grab_audio():
data, sr = load_demo()
return ap.Audio(data=data, sr=sr)
def grab_audio_stream(secs):
data, sr = load_demo()
slice_sz = int(secs * sr) * 4
l = len(data) // slice_sz
# [start] zero
yield ap.Audio(data=bytes([0] * slice_sz), sr=sr)
for i in range(l):
chunk = data[i * slice_sz : (i + 1) * slice_sz]
# pad with zeros
chunk = chunk + bytes([0] * (slice_sz - len(chunk)))
assert len(chunk) % 4 == 0
# [mid]
yield ap.Audio(data=chunk, sr=sr)
# [end] zero frames mark end
for _ in range(10):
yield ap.Audio(data=bytes([0] * slice_sz), sr=sr)
def test_asr(stub):
print("Transcribe:")
audio = grab_audio()
print("-", stub.Transcribe(audio).data)
print("TranscribeStream:\n- ", end="")
audio_stream = grab_audio_stream(secs=CHUNK_DURATION)
for transcript in stub.TranscribeStream(audio_stream):
print(transcript.data, end="")
print()
def run(args):
with grpc.insecure_channel(f"localhost:{PORT}") as channel:
stub = apg.ASRStub(channel)
test_asr(stub)
if __name__ == "__main__":
logging.basicConfig()
# parse args
parser = argparse.ArgumentParser(description="Process some integers.")
parser.add_argument(
"--source",
choices=["file", "stream"],
type=str,
default="file",
help="audio source",
)
parser.add_argument(
"--mode",
choices=["all", "chunks"],
default="all",
type=str,
nargs="+",
help="transcription mode (stream implies chunks)",
)
parser.add_argument(
"--file",
type=str,
default=DEMO_AUDIO,
help="if mode==file: what file to transcribe",
)
args = parser.parse_args()
run(args)