File size: 2,503 Bytes
79cb6e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import random
import uuid
import numpy
import os
import random
import fnmatch

from tqdm.auto import tqdm
from scipy.io import wavfile

from bark.generation import load_model, SAMPLE_RATE
from bark.api import semantic_to_waveform

from bark import text_to_semantic
from bark.generation import load_model

from training.data import load_books, random_split_chunk

output = 'training/data/output'
output_wav = 'training/data/output_wav'


def prepare_semantics_from_text(num_generations):
    loaded_data = load_books(True)

    print('Loading semantics model')
    load_model(use_gpu=True, use_small=False, force_reload=False, model_type='text')

    if not os.path.isdir(output):
        os.mkdir(output)

    loop = 1
    while 1:
        filename = uuid.uuid4().hex + '.npy'
        file_name = os.path.join(output, filename)
        text = ''
        while not len(text) > 0:
            text = random_split_chunk(loaded_data)  # Obtain a short chunk of text
            text = text.strip()
        print(f'{loop} Generating semantics for text:', text)
        loop+=1 
        semantics = text_to_semantic(text, temp=round(random.uniform(0.6, 0.8), ndigits=2))
        numpy.save(file_name, semantics)


def prepare_wavs_from_semantics():
    if not os.path.isdir(output):
        raise Exception('No \'output\' folder, make sure you run create_data.py first!')
    if not os.path.isdir(output_wav):
        os.mkdir(output_wav)

    print('Loading coarse model')
    load_model(use_gpu=True, use_small=False, force_reload=False, model_type='coarse')
    print('Loading fine model')
    load_model(use_gpu=True, use_small=False, force_reload=False, model_type='fine')

    files = fnmatch.filter(os.listdir(output), '*.npy')
    current = 1
    total = len(files)

    for i, f in tqdm(enumerate(files), total=len(files)):
        real_name = '.'.join(f.split('.')[:-1])  # Cut off the extension
        file_name = os.path.join(output, f)
        out_file = os.path.join(output_wav, f'{real_name}.wav')
        if not os.path.isfile(out_file) and os.path.isfile(file_name):  # Don't process files that have already been processed, to be able to continue previous generations
            print(f'Processing ({i+1}/{total}) -> {f}')
            wav = semantic_to_waveform(numpy.load(file_name), temp=round(random.uniform(0.6, 0.8), ndigits=2))
            # Change to PCM16
            # wav = (wav * 32767).astype(np.int16)
            wavfile.write(out_file, SAMPLE_RATE, wav)

    print('Done!')