File size: 1,707 Bytes
0e80266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
047d4ce
 
0e80266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Transcribe a short WAV or FLAC recording with Chaka-ASR."""
import argparse
from math import gcd
import numpy as np
import soundfile as sf
import torch
from scipy.signal import resample_poly
from transformers import AutoProcessor, AutoModelForCTC


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("audio", help="Path to a WAV or FLAC recording")
    parser.add_argument("--revision", default="main", help="Model commit or branch")
    args = parser.parse_args()
    audio, sample_rate = sf.read(args.audio, dtype="float32", always_2d=True)
    audio = audio.mean(axis=1)
    if audio.size == 0:
        raise ValueError("Audio recording is empty")
    if not np.isfinite(audio).all():
        raise ValueError("Audio contains non-finite samples")
    processor = AutoProcessor.from_pretrained("caesar-abrham/Chaka-ASR", revision=args.revision)
    model = AutoModelForCTC.from_pretrained("caesar-abrham/Chaka-ASR", revision=args.revision)
    target_rate = processor.feature_extractor.sampling_rate
    if sample_rate != target_rate:
        divisor = gcd(sample_rate, target_rate)
        audio = resample_poly(audio, target_rate // divisor, sample_rate // divisor).astype("float32")
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device).eval()
    inputs = processor(audio, sampling_rate=target_rate, return_tensors="pt")
    inputs = {key: value.to(device) for key, value in inputs.items()}
    with torch.inference_mode():
        predicted = model(**inputs).logits.argmax(dim=-1)
    print(processor.batch_decode(predicted.cpu())[0])


if __name__ == "__main__":
    main()