0

ソケットから xml を読み取り、テキストを wav ファイルに変換してからオーディオ出力デバイスで再生する既存のプログラムを使用しています。

テキストをオーディオに直接再生するだけになるように、それを取り除きたいと思います。

現在、正しいコードを持っているかどうかを判断し、実際に wav ファイルを作成しているかどうかを理解するのに苦労しています。

テキスト読み上げ機能を呼び出す関数

def generate_audio(self, language, voice=None):
    info = self.get_first_info(language, bestmatch=False)
    if info is None:
        self.media_info[language] = None
        return False

    truncate = not self.broadcast_immediately() and bcastplayer.Config.setting('alerts_truncate')
    message_text = info.get_message_text(truncate)

    location = bcastplayer.ObData.get_datadir() + "/alerts"
    if os.access(location, os.F_OK) == False:
        os.mkdir(location)
    filename = self.reference(self.sent, self.identifier) + "-" + language + ".wav"

    resources = info.get_resources('audio')
    if resources:
        if resources[0].write_file(os.path.join(location, filename)) is False:
            return False

    elif message_text:
        self.write_tts_file(os.path.join(location, filename), message_text, voice)

    else:
        return False

これを変更してオーディオを直接再生できますか?

def write_tts_file(self, path, message_text, voice=None):
    if not voice:
        voice = 'en'
    proc = subprocess.Popen([ 'espeak', '-m', '-v', voice, '-s', '130', '--stdout' ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
    (stdout, stderr) = proc.communicate(message_text.encode('utf-8') + b" <break time=\"2s\" /> " + message_text.encode('utf-8') + b" <break time=\"3s\" /> ")
    proc.wait()

    with open(path, 'wb') as f:
        f.write(stdout)

process、、、subprocessを使用しstdoutたこのようなコードは見たことがありませんPIPE

aplaywav ファイルを作成せずに、出力をパイプまたはリダイレクトするだけのものにサブプロセス コードを変更するのは簡単ですか?

手がかりを与える別の答えがありましたが、繰り返しになりますが、私の初心者の理解では、このコードをその答えに変換する方法がわかりません

espeak と aplay で python Popen を使用する方法

4

1 に答える 1