同时运行代码的Python(TTS和print函数)

2024-09-29 17:15:19 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在返回文本后同时运行以下代码或运行TTS函数?你知道吗

代码:

def main(q):
    # CODE BEFORE THIS. 
    # TTS IS JUST A SIMPLE TEXT TO SPEECH FUNCTION
    time.sleep(random.uniform(0.5, 2))
    response = 'BOT: '+ response

    # TTS
    # SIMULTANEOUSLY RUN BELOW
    if(responsetts!=None):
        tts(responsetts)
    else:
        tts(response)
    return response

if __name__ == '__main__':
    while True:
       query=input('U: ')
       print(main(query))

Tags: 函数代码文本ifismainresponsedef
1条回答
网友
1楼 · 发布于 2024-09-29 17:15:19

如果希望tts函数在打印响应后运行,那么简单的解决方案是,让main在调用tts之前打印响应。但是为了更灵活和更好地响应提示,可以为tts调用使用单独的线程。你知道吗

线程模块提供了一个Timer,它是Thread的子类。Timer有一个interval参数,用于在执行目标函数之前添加睡眠。如果需要,可以使用它来添加延迟,如果不需要这个特性,可以使用Thread。我在示例中使用espeak而不是tts:

import time
import random
import subprocess
from threading import Timer
from functools import partial


def _espeak(msg):
    # Speak slowly in a female english voice
    cmd = ["espeak", '-s130', '-ven+f5', msg]
    subprocess.run(cmd)


def _vocalize(response, responsetts=None, interval=0):
    # "Comparisons to singletons like None should always be done with is or
    # is not, never the equality operators." -PEP 8
    if responsetts is not None:
        response = responsetts
    Timer(interval=interval, function=_espeak, args=(response,)).start()


def _get_response(q):
    time.sleep(random.uniform(0.5, 2))
    response = '42'
    response = 'BOT: '+ response
    return response


def _handle_query(q):
    response = _get_response(q)
    print(response)
    _vocalize(response, interval=0)


def main():
    prompt = partial(input, 'U: ')
    # alternative to using partial: iter(lambda: input('U: '), 'q')
    for query in iter(prompt, 'q'): # quits on input 'q'
        _handle_query(query)


if __name__ == '__main__':
    main()

相关问题 更多 >

    热门问题