每当我尝试访问语音识别程序中的文件时,我总是收到权限拒绝错误

I keep getting a permission denial error whenever I try to access a file in a speech recognition program

我正在尝试语音识别并将其用作某些语句的输入,同时让程序使用 playsound 和 gTTS 模块“跟我说话”。但是我 运行 遇到了一个我找不到解决方案的问题,我尝试了最常见的解决方案但没有成功。

程序使用了playsoundspeech_recognitiongTTS模块和两个函数; speak() 允许程序使用 google 的文本向用户回复语音 运行slation,并且 get_audio() 使用 [=13= 从用户的麦克风接收输入]的识别器和麦克风类.

import os
import time
import playsound
import speech_recognition as sr
from gtts import gTTS

run = True

def speak(text):
    tts = gTTS(text=text, lang="en")
    filename = "voice.mp3"
    tts.save(filename)
    playsound.playsound(filename)

def get_audio():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        audio = r.listen(source)
        said = ""

        try:
            said = r.recognize_google(audio)
            print(said)
        except Exception as e:
            print("Exception: " + str(e))

    return said

while run == True:

    text = get_audio()

    if "hello" in text:
        speak("Hello, how are you?")

    if "what are you" in text:
        print("")
        speak("I am a speech recognition program")
    
    if "goodbye" in text:
        speak("Talk to you later" or "Bye" or "Cya")
        run = False

我在程序中设置了一个 while 循环,这样就可以进行对话,而且只有在用户说“再见”时对话才会中断。问题似乎是 .mp3 文件(voice.mp3 这是 speak() 函数用来存储音频以供程序播放的文件)在创建后无法访问。 python 文件和 mp3 文件都存储在同一个文件夹中。

完整的错误信息如下:

who are you
hello
Traceback (most recent call last):
  File "c:\Users\User\OneDrive\Documents\VS Code Projects\Speech Recognition\main_va.py", line 34, in <module>
    speak("Hello, how are you?")
  File "c:\Users\User\OneDrive\Documents\VS Code Projects\Speech Recognition\main_va.py", line 12, in speak   
    tts.save(filename)
  File "C:\Python\Python310\lib\site-packages\gtts\tts.py", line 328, in save
    with open(str(savefile), "wb") as f:
PermissionError: [Errno 13] Permission denied: 'voice.mp3'
PS C:\Users\User\OneDrive\Documents\VS Code Projects\Speech Recognition> 

我在第一次通话时收到了回复(“你是谁”),但在第二次通话后弹出错误消息(“你好”)。

规格:python3.10.4

我找到了一个似乎工作正常的解决方案;每次使用后我都会删除 .mp3 文件,所以在 speak() 函数的末尾我只使用 os.remove(filename) 然后下次它想说什么时创建一个新文件。

我发现其他一些解决方案说每次创建文件时都应该重命名文件名,但这对我来说太混乱了。

这是我对代码所做的更改,它只是 speak() 函数中的一行:

def speak(text):
    tts = gTTS(text=text, lang="en")
    filename = "voice.mp3"
    tts.save(filename)
    playsound.playsound(filename)
    os.remove("voice.mp3")

到目前为止,这对我来说非常有效,它可以根据需要接受尽可能多的输入,因为每次使用 speak() 函数时都会删除并重新创建文件。

再一次,如果有人建议或找到更好更有效的解决方案,我会很乐意接受。

您的解决方案工作正常。

我只是将其调整为保留文件(如果您想出于测试目的收听它),而是在开头将其删除(如果存在)。

同时将文件名传递给您的函数可确保没有任何硬编码

def speak(text, filename):
    if os.path.exists(filename):
        os.remove(filename) 
    tts = gTTS(text=text, lang="en")
    tts.save(filename)
    playsound.playsound(filename)