Многопроцессорная обработка с загрузкой хорошо обученной модели.(через Python3) - PullRequest
0 голосов
/ 06 июня 2018

Вот моя ситуация: у меня есть хорошо обученная модель синтеза речи.Я собираюсь ускорить синтезирование шагов с помощью многопроцессорной обработки, которая предварительно загружает модель в каждый процессор, а затем продолжает вводить предложения для преобразования текста в речь.

Вот мой пробный скрипт:

####################################################################
#!/usr/bin/python3
####################################################################

from multiprocessing import Process, Pool, cpu_count
import os,time

####################################################################

from tacotron.demo_synthesizer import Synthesizer
from splitting_sent import splitting_para
import tensorflow as tf
from datasets import audio

####################################################################

from pypinyin import pinyin, Style

####################################################################

BASE_DIR = os.path.split(os.path.realpath(__file__))[0]
VOICE = BASE_DIR + "/tmp"
TXT = BASE_DIR + "/txt"
os.makedirs(VOICE, exist_ok=True)
os.makedirs(TXT, exist_ok=True)

####################################################################

def syn(py):
    synthesizer = Synthesizer()
    synthesizer.load("/path/to/the/model")
    wav_name = time.time()
    wav_path = VOICE + "/" + str(wav_name)
    wav = synthesizer.synthesize(py)
    audio.save_wav(wav, wav_path)

if __name__ =='__main__':

    with open(os.path.join(TXT, "content.txt"), "r") as f:
        lines = f.read().splitlines()
    lines = "".join(lines)

    sentences = splitting_para(lines)
    # splitting paragraph into individual sentences.

    py_list = []
    for sent in sentences:
        py_sent = pinyin(sent, style=Style.TONE3)
        py_sent = " ".join([i[0] for i in py_sent if i[0].isalnum()])
        py_list.append(py_sent)
    # as I am trying the Chinese TTS, it is the inevitable prerequisite step of translating Chinese character into Pinyin.

    print('Run the main process (%s).' % (os.getpid()))
    mainStart = time.time()
    p = Pool(cpu_count())
    for py in py_list:
        p.apply_async(syn,args=(py,))

    print('Waiting for all subprocesses done ...')
    p.close()
    p.join()
    print('All subprocesses done')
    mainEnd = time.time()
    print('All process ran %0.2f seconds.' % (mainEnd-mainStart))

Я застрял в этой проблеме: я мог только предварительно загрузить 12 моделей в 12 процессов для синтеза случайных предложений.Однако невозможно продолжать ввод следующих 12 предложений в модель предварительной загрузки.Процессы были прерваны после того, как первый набор из 12 предложений-TTS был закончен.Я полностью потерян здесь.: (

Я очень ценю, если есть предложение. :)

1 Ответ

0 голосов
/ 06 июня 2018

Я получил ответ от моего друга, который следующим образом:

####################################################################

import multiprocessing
from multiprocessing import Process, Pool, cpu_count, Queue
import os, time, sys

####################################################################

from tacotron.demo_synthesizer import Synthesizer
from splitting_sent import splitting_para
import tensorflow as tf
from datasets import audio

####################################################################

from pypinyin import pinyin, Style

####################################################################

BASE_DIR = os.path.split(os.path.realpath(__file__))[0]
VOICE = BASE_DIR + "/tmp"
TXT = BASE_DIR + "/txt"
os.makedirs(VOICE, exist_ok=True)
os.makedirs(TXT, exist_ok=True)

####################################################################

num_cpu = cpu_count() - 1
q = []
q_re = []

for tmp in range(num_cpu):
    q.append(Queue())

def syn(id):
    synthesizer = Synthesizer()
    synthesizer.load("/home/chris/Pictures/tts-server/logs-Tacotron/model.ckpt-1255000")
    print("LOADED at {} CPU".format(id))
    while not q[id].empty():
        input_py = q[id].get(True)
        print("Starting decode:", id)
        wav_name = time.time()
        wav_path = VOICE + "/" + str(wav_name)
        wav = synthesizer.synthesize(input_py)
        audio.save_wav(wav, wav_path)
        print("Decoded:", id)

if __name__ =='__main__':

    with open(os.path.join(TXT, "content.txt"), "r") as f:
        lines = f.read().splitlines()
    lines = "".join(lines)

    sentences = splitting_para(lines)

    py_list = []
    for sent in sentences:
        py_sent = pinyin(sent, style=Style.TONE3)
        py_sent = " ".join([i[0] for i in py_sent if i[0].isalnum()])
        py_list.append(py_sent)

    for x in range(num_cpu):
        p = multiprocessing.Process(target=syn, args=(x,))
        p.start()

    # decoding
    for index, py in enumerate(py_list):
        q[index % num_cpu].put(py)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...