HY-2012's picture
First commit
b32e11f verified
Raw
History Blame Contribute Delete
1.92 kB
#!/usr/bin/env python3
"""FastEnhancer 16kHz AX650 demo — denoise a wav on the board.
Usage (on AX650 board):
python3 demo.py --model ../models/model.axmodel --input noisy.wav --output enhanced.wav
If --input is omitted, a bundled noisy sample is used.
"""
import argparse
import os
import sys
import wave
import numpy as np
sys.path.insert(0, os.path.dirname(__file__))
from fastenhancer_sdk import FastEnhancer
def read_wav(path):
with wave.open(path, "rb") as w:
sr = w.getframerate()
n = w.getnframes()
ch = w.getnchannels()
data = np.frombuffer(w.readframes(n), dtype=np.int16).astype(np.float32) / 32768.0
if ch > 1:
data = data.reshape(-1, ch).mean(axis=1)
return data, sr
def write_wav(path, data, sr):
data = np.clip(data, -1, 1)
with wave.open(path, "wb") as w:
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(sr)
w.writeframes((data * 32767).astype(np.int16).tobytes())
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--model", default="../models/model.axmodel")
ap.add_argument("--input", default="sample_noisy.wav")
ap.add_argument("--output", default="enhanced.wav")
args = ap.parse_args()
if not os.path.exists(args.model):
print("ERROR: model not found: %s" % args.model)
sys.exit(1)
wav, sr = read_wav(args.input)
fe = FastEnhancer(args.model)
if sr != fe.sr:
print("WARNING: input sr=%d, model expects %d Hz. Resample first." % (sr, fe.sr))
enhanced = fe.enhance(wav)
rms_in = float(np.sqrt(np.mean(wav ** 2)))
rms_out = float(np.sqrt(np.mean(enhanced ** 2)))
write_wav(args.output, enhanced, fe.sr)
print("FastEnhancer 16kHz done.")
print(" input rms = %.4f" % rms_in)
print(" output rms = %.4f" % rms_out)
print(" saved: %s" % args.output)
if __name__ == "__main__":
main()