簡體   English   中英

每當我嘗試訪問語音識別程序中的文件時,我總是收到權限拒絕錯誤

[英]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 的文本到聲音翻譯向用戶回復,而get_audio()使用speech_recognition的識別器和麥克風類從用戶的麥克風接收輸入。

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.mp3speak() function 用來存儲音頻以供程序播放的文件)在創建后無法訪問。 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> 

我在第一次呼叫時收到了回復(“你是誰”),但在第二次呼叫(“你好”)后彈出了錯誤消息。

規格:python 3.10.4

  • 播放聲音 1.2.2
  • Rest 是最新的

我找到了一個似乎工作正常的解決方案; 每次使用后我都會刪除 .mp3 文件,所以在speak() function 結束時我只使用os.remove(filename)然后下次它想說些什么時創建一個新文件。

我發現其他一些解決方案說每次創建文件時都應該重命名文件名,但這對我來說太混亂了。

這是我對代碼所做的更改,它只是speak() function 中的一行:

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

到目前為止,這對我來說非常有效,它可以根據需要接收盡可能多的輸入,因為每次使用speak() function 時都會刪除並重新創建文件。

同樣,如果建議或找到更好、更有效的解決方案,我會很樂意接受。

您的解決方案工作正常。

我只是會調整它以留下文件(以防您想出於測試目的收聽它),而是在開頭將其刪除(如果存在)。

還將文件名傳遞給您的 function 確保沒有任何硬編碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM