[英]I keep getting a permission denial error whenever I try to access a file in a speech recognition program
我正在嘗試語音識別並將其用作某些語句的輸入,同時讓程序使用 playsound 和 gTTS 模塊“跟我說話”。 但是我遇到了一個找不到解決方案的問題,我嘗試了最常見的解決方案但沒有成功。
該程序使用了playsound
、 speech_recognition
和gTTS
模塊以及兩個函數; 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.mp3
是speak()
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
我找到了一個似乎工作正常的解決方案; 每次使用后我都會刪除 .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.