首页 > 编程问答 >问题:函数在开始时只运行一次

问题:函数在开始时只运行一次

时间:2024-07-23 04:55:56浏览次数:10  
标签:python python-3.x python-2.7 pyautogui pydub

该程序从流式麦克风获取输入,并通过在listen_print_loop() 中对其进行处理来生成输出。 点击有效,但向上或向下移动仅有效一次。 在添加 pydub 库之前它工作正常。

import queue
import sys

import pyautogui as pag

from pydub import AudioSegment
from pydub.playback import play

from google.api_core.client_options import ClientOptions
from google.cloud import speech

import pyaudio

RATE = 16000
CHUNK = int(RATE / 10)

class MicrophoneStream:

    def __init__(self: object, rate: int = RATE, chunk: int = CHUNK) -> None:
        self._rate = rate
        self._chunk = chunk
        self._buff = queue.Queue()
        self.closed = True

    def __enter__(self: object) -> object:
        self._audio_interface = pyaudio.PyAudio()
        self._audio_stream = self._audio_interface.open(
            format=pyaudio.paInt16,
            channels=1,
            rate=self._rate,
            input=True,
            frames_per_buffer=self._chunk,
            stream_callback=self._fill_buffer,
        )

        self.closed = False

        return self

    def __exit__(
        self: object,
        type: object,
        value: object,
        traceback: object,
    ) -> None:

        self._audio_stream.stop_stream()
        self._audio_stream.close()
        self.closed = True
        self._buff.put(None)
        self._audio_interface.terminate()

    def _fill_buffer(
        self: object,
        in_data: object,
        frame_count: int,
        time_info: object,
        status_flags: object,
    ) -> object:
        self._buff.put(in_data)
        return None, pyaudio.paContinue

    def generator(self: object) -> object:
        while not self.closed:
            chunk = self._buff.get()
            if chunk is None:
                return
            data = [chunk]

            while True:
                try:
                    chunk = self._buff.get(block=False)
                    if chunk is None:
                        return
                    data.append(chunk)
                except queue.Empty:
                    break

            yield b"".join(data)


def listen_print_loop(responses: object) -> str:

    b= 1
    b2= 0

    num_chars_printed = 0
    for response in responses:
        if not response.results:
            continue

        result = response.results[0]
        if not result.alternatives:
            continue

        transcript = result.alternatives[0].transcript

        overwrite_chars = " " * (num_chars_printed - len(transcript))

        if not result.is_final:
            sys.stdout.write(transcript + overwrite_chars + "\r")
            sys.stdout.flush()

            num_chars_printed = len(transcript)

        else:
            print(transcript + overwrite_chars)

            if b == 1:

                if transcript.strip()== "exit":
                    play(AudioSegment.from_wav("5.wav"))
                    sys.exit()
                
                if transcript.strip()== "single click":
                    pag.click()
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript.strip()== "double click":
                    pag.doubleClick()
                    play(AudioSegment.from_wav("2.wav"))
        
                elif transcript.strip()== "right click":
                    pag.click(button= "right")
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript[:7].strip()== "move up":
                    pag.move( 0, -int(transcript[8:].replace(" ", "").replace(",", "")), 0.5, pag.easeOutQuad)
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript[:9].strip()== "move down":
                    pag.move( 0, int(transcript[10:].replace(" ", "").replace(",", "")), 0.5, pag.easeOutQuad)
                    play(AudioSegment.from_wav("2.wav"))
            
            num_chars_printed = 0

    return transcript


def main() -> None:
    play(AudioSegment.from_wav("1.wav"))
    play(AudioSegment.from_wav("2.wav"))


    language_code = "en-US"

    client = speech.SpeechClient.from_service_account_file('Key.json')
    config = speech.RecognitionConfig(
        encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=RATE,
        language_code=language_code,
    )

    streaming_config = speech.StreamingRecognitionConfig(
        config=config, interim_results=True
    )

    with MicrophoneStream(RATE, CHUNK) as stream:
        
        audio_generator = stream.generator()
        requests = (
            speech.StreamingRecognizeRequest(audio_content=content)
            for content in audio_generator
        )

        responses = client.streaming_recognize(streaming_config, requests)

        listen_print_loop(responses)

if __name__ == "__main__":
    main()

我重新启动了 VS Code 以检查这是否只是一个小问题,但它不起作用。


问题在于变量 b listen_print_loop 函数中被设置为 1 ,并且在条件语句之外从未被修改过。这意味着该条件 if b == 1: 始终为真,因此与“向上移动”和“向下移动”相关的代码块只会被执行 一次 ,即第一次满足此条件时。

为了解决这个问题,需要在每次成功识别“向上移动”或“向下移动”命令后将 b 的值更改为其他值(例如 0 )。

以下是更新后的 listen_print_loop 函数:

def listen_print_loop(responses: object) -> str:
    num_chars_printed = 0
    b = 1  # 初始化 b

    for response in responses:
        # ... [现有代码] ...

        else:
            print(transcript + overwrite_chars)

            if b == 1:
                if transcript.strip() == "exit":
                    play(AudioSegment.from_wav("5.wav"))
                    sys.exit()

                elif transcript.strip() == "single click":
                    pag.click()
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript.strip() == "double click":
                    pag.doubleClick()
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript.strip() == "right click":
                    pag.click(button="right")
                    play(AudioSegment.from_wav("2.wav"))

                elif transcript[:7].strip() == "move up":
                    pag.move(0, -int(transcript[8:].replace(" ", "").replace(",", "")), 0.5, pag.easeOutQuad)
                    play(AudioSegment.from_wav("2.wav"))
                    b = 0  # 修改 b 的值

                elif transcript[:9].strip() == "move down":
                    pag.move(0, int(transcript[10:].replace(" ", "").replace(",", "")), 0.5, pag.easeOutQuad)
                    play(AudioSegment.from_wav("2.wav"))
                    b = 0  # 修改 b 的值

            num_chars_printed = 0

    return transcript

通过在每次成功识别“向上移动”或“向下移动”后将 b 设置为 0 ,确保 if b == 1: 条件在第一次之后不再为真,从而允许后续识别这些命令。

请注意,变量 b2 似乎没有被使用,可以将其从代码中删除。

标签:python,python-3.x,python-2.7,pyautogui,pydub
From: 78780741

相关文章

  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......
  • 如何使用 Selenium Python 搜索 Excel 文件中的文本
    我有一些数据在Excel文件中。我想要转到Excel文件,然后搜索文本(取自网站表),然后获取该行的所有数据,这些数据将用于在浏览器中填充表格。示例:我希望selenium搜索ST0003然后获取名称,该学生ID的父亲姓名,以便我可以在大学网站中填写此信息。我想我会从网站......
  • Python 套接字请求在很多情况下都会失败
    我在python中尝试了超过5种不同的方法,尽管人们说它在其他论坛上有效,但所有这些方法都惨遭失败。importsocketmessage="test"clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('1.1.1.1',80))clientsocket.send(mes......
  • Python 网络套接字
    我一直尝试通过Python访问该网站的websocket,但是需要绕过CloudFlare,现在我尝试通过cookie进行绕过,但是这不起作用。我已经尝试在没有cookie的情况下执行此操作,但这也不起作用。importwebsocketimportbase64importosdriver=selenium.webdriver.Firefox()driver.ge......
  • 如何在Python中使用Selenium提取data-v-xxx?
    因为我想查看每个class='num'内的文本是否大于0。如果测试通过,那么我需要获取venuen-name内的文本。我观察到,data-v是相同的。所以我的方法是获取相同的data-v-<hashvalue>来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?这是DOM<div......
  • Python:添加异常上下文
    假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?我想出了以下方法,但对我来说有点可疑:definternal_function():raiseValueError("smellysocks!")defcontext_function():try:internal_function()exceptExceptionase:......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......