File size: 1,294 Bytes
f8a1702 | 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 | import argparse
import json
from pathlib import Path
import soundfile as sf
from .pipeline import StreamPAPipeline
def main():
p=argparse.ArgumentParser(description='Append raw audio blocks and emit each StreamPA prefix')
p.add_argument('--audio',required=True)
p.add_argument('--bundle-dir',required=True)
p.add_argument('--device',default='cpu')
p.add_argument('--threads',type=int,default=2)
p.add_argument('--block-samples',type=int,default=1600)
p.add_argument('--output',required=True)
a=p.parse_args()
session=StreamPAPipeline(a.bundle_dir,a.device,a.threads).create_session()
dest=Path(a.output); dest.parent.mkdir(parents=True,exist_ok=True)
with sf.SoundFile(a.audio) as audio, dest.open('x',encoding='utf-8') as f:
if audio.samplerate!=16000 or audio.channels!=1: raise ValueError('Input must be mono 16000-Hz WAV')
while True:
block=audio.read(a.block_samples,dtype='float32')
if not len(block): break
for row in session.append(block):
f.write(json.dumps(row,allow_nan=False)+'\n'); f.flush()
f.write(json.dumps(session.finish(),allow_nan=False)+'\n')
print(json.dumps(dict(output=str(dest),prefixes=session.prefix_index)))
if __name__=='__main__': main()
|