File size: 1,878 Bytes
0c723b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""End-to-end ONNX inference: text -> acoustic.onnx -> mel -> bigvgan.onnx -> wav."""

import argparse
import os
import sys

import numpy as np
import onnxruntime as ort
import soundfile as sf

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from cn_frontend import text_to_sequence


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--text", required=True)
    parser.add_argument("--acoustic", default="export/acoustic_female.onnx")
    parser.add_argument("--vocoder", default="export/bigvgan_base.onnx")
    parser.add_argument("--output", default="export/onnx_demo.wav")
    parser.add_argument("--max_text", type=int, default=256)
    parser.add_argument("--max_mel", type=int, default=2048)
    parser.add_argument("--noise_scale", type=float, default=0.3)
    parser.add_argument("--seed", type=int, default=0)
    args = parser.parse_args()

    from infer_board import split_sentences, text_to_inputs, tail_stretch
    ac = ort.InferenceSession(args.acoustic, providers=["CPUExecutionProvider"])
    vc = ort.InferenceSession(args.vocoder, providers=["CPUExecutionProvider"])

    pieces = []
    for s in split_sentences(args.text):
        x, x_lengths, noise_z = text_to_inputs(s, args.noise_scale, args.seed)
        mel, y_lengths = ac.run(None, {
            "x": x, "x_lengths": x_lengths, "noise_z": noise_z,
        })
        T = int(y_lengths[0])
        mel = mel[:, :, :T]
        mel = tail_stretch(mel)
        print(f"  sentence mel: {mel.shape} (y_lengths={T})")
        wav = vc.run(None, {"mel": mel})[0]  # [1,1,T*256]
        pieces.append(wav[0, 0])
    wav = np.concatenate(pieces) if len(pieces) > 1 else pieces[0]
    wav = wav / (np.abs(wav).max() + 1e-8) * 0.95
    sf.write(args.output, wav, 24000)
    print(f"saved: {args.output} ({len(wav)/24000:.2f}s)")


if __name__ == "__main__":
    main()