Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help with espeak in python
#1
Hello,

I'm using arch-linux (Manjaro Gnome) and I downloaded espeak-ng successfully by doing:
sudo pacman -S espeak-ng
.
I can test it in the terminal by inputting:
espeak-ng "This is a test"
and it will speak it.

However, I'm trying it implement it into my python code. I tried adding
import espeak
&
from espeakng import ESpeakNG
but I get an error saying there is no module named 'espeak' or 'espeakng'.

My question is how do I import espeak into my code so I can get it to work?
I've been scouring the internet and haven't found anything useful.

Any help will be greatly appreciated.

Thanks.

(I also tried running the code without importing espeak and just using pyttsx3 but I get another error (see below)).

My Code:
import json
import random
import datetime
import operator
import wikipedia
import wolframalpha
import pyttsx3
import speech_recognition as sr 

Commander = "Commander"
print ("Initialising B.A.X.T.E.R...")

def speak(text):
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    engine.setProperty('voice',voices[1].id)
    engine.setProperty('rate', 125 )
    engine.setProperty('volume',1.0)
    engine.say(text)
    engine.runAndWait()

def wishMe():
    hour = int(datetime.datetime.now().hour)
    if hour>=0 and hour<12:
        speak("Good Morning" + Commander)
    elif hour>=12 and hour<18:
        speak("Good Afternoon" + Commander)   
    else:
        speak("Good Evening" + Commander) 
    speak("How may I be of service?")   

    def listenCommand():
    command=0
    hear = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        audio = hear.listen(source)

#---------------------------
# Uses google API to listen
    try:
        print("Recognizing...")
        command = hear.recognize_google(audio, language='en-in')
        print(f'{BOSS} : {command}\n')

    except:
            pass

    return command 

#--------------------------------

speak("Initialising Baxter..........")
wishMe()

def main():
    command = listenCommand()
    command=str(command).lower()

    if ('who is' in command) or ('what is' in command):
        speak('Searching Wikipedia...')
        command = command.replace("who is","")
        command = command.replace("what is","")
        results = wikipedia.summary(command, sentences = 1)
        print("Baxter:",results)
        return speak(results) 

elif 'stop' in command:
        speak("Shutting Down...")
        return exit()
       
    else:
        return 0 

while True:
    main()  
If I run that code I get this error:
Error:
Initialising B.A.X.T.E.R... Traceback (most recent call last): File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/__init__.py", line 20, in init eng = _activeEngines[driverName] File "/usr/lib/python3.9/weakref.py", line 137, in __getitem__ o = self.data[key]() KeyError: None During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/commander/BAXTERTest2.py", line 53, in <module> speak("Initialising Baxter..........") File "/home/commander/BAXTERTest2.py", line 14, in speak engine = pyttsx3.init() File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/__init__.py", line 22, in init eng = Engine(driverName, debug) File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/engine.py", line 30, in __init__ self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug) File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/driver.py", line 50, in __init__ self._module = importlib.import_module(name) File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/drivers/espeak.py", line 9, in <module> from . import _espeak, toUtf8, fromUtf8 File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/drivers/_espeak.py", line 18, in <module> dll = cdll.LoadLibrary('libespeak.so.1') File "/usr/lib/python3.9/ctypes/__init__.py", line 452, in LoadLibrary return self._dlltype(name) File "/usr/lib/python3.9/ctypes/__init__.py", line 374, in __init__ self._handle = _dlopen(self._name, mode) OSError: libespeak.so.1: cannot open shared object file: No such file or directory
Reply
#2
Have you installed the python espeakng module?

It looks like you've installed the espeak library, but not the python interface. Presumably you need to also pip install espeakng in your python environment.
Reply
#3
(Jan-01-2022, 01:13 AM)bowlofred Wrote: Have you installed the python espeakng module?

It looks like you've installed the espeak library, but not the python interface. Presumably you need to also pip install espeakng in your python environment.


Thanks for your response. The error disappeared and I got it to mostly work. It will recognize and execute my commands but it won't speak the results.

If I do
mySpeaker.say('Initializing Baxter')
it will speak it, but I can't get it to speak anything else.

If I do
 speak("Good Afternoon" + Commander)
since it's in the speak function, it won't work.
def speak(text):
    mySpeaker = espeakng.Speaker()


And if I do
mySpeaker.say('Good Afternoon" + Commander')
It also won't work.

Why is that and how can I fix it?

Thanks.



import json
import random
import datetime
import operator
import wikipedia
import wolframalpha
import pyttsx3
import espeakng
import speech_recognition as sr 

Commander = "Commander"
print ("Initializing B.A.X.T.E.R...")

def speak(text):
    mySpeaker = espeakng.Speaker()
    #mySpeaker.say('Initializing Baxter')
    

def wishMe():
    hour = int(datetime.datetime.now().hour)
    if hour>=0 and hour<12:
        speak("Good Morning" + Commander)
    elif hour>=12 and hour<18:
        speak("Good Afternoon" + Commander)   
    else:
        speak("Good Evening" + Commander) 
    speak("How may I be of service?")   

def listenCommand():
    command=0
    hear = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        audio = hear.listen(source)

#---------------------------
# Uses google API to listen
    try:
        print("Recognizing...")
        command = hear.recognize_google(audio, language='en-in')
        print(f'{Commander} : {command}\n')

    except:
            pass

    return command 

#--------------------------------

speak("Initializing Baxter..........")
wishMe()

def main():
    command = listenCommand()
    command=str(command).lower()

    if ('who is' in command) or ('what is' in command):
        speak('Searching Wikipedia...')
        command = command.replace("who is","")
        command = command.replace("what is","")
        results = wikipedia.summary(command, sentences = 1)
        print("Baxter:",results)
        return speak(results) 
        

    elif 'stop' in command:
        speak("Shutting Down...")
        return exit()
       
    else:
        return 0 

while True:
    main()  
Reply
#4
Using a basic function, this works for me

import pyttsx3

def speak(text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()


speak('Hi there, what is your name?')
The wishme function

def wishme():
    engine
    hour = datetime.now().hour
    if hour < 24:
        engine.say('Good evening.')
    elif hour < 18:
        engine.say('Good afternoon.')
    else:
        engine.say('Good morning.')
    engine.say('How can I be of service?')
    engine.runAndWait()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#5
(Jan-02-2022, 08:20 PM)menator01 Wrote: Using a basic function, this works for me

import pyttsx3

def speak(text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()


speak('Hi there, what is your name?')
The wishme function

def wishme():
    engine
    hour = datetime.now().hour
    if hour < 24:
        engine.say('Good evening.')
    elif hour < 18:
        engine.say('Good afternoon.')
    else:
        engine.say('Good morning.')
    engine.say('How can I be of service?')
    engine.runAndWait()

If I use the pyttsx3 engine I still get this error and it doesn't work.


Error:
Initializing B.A.X.T.E.R... Traceback (most recent call last): File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/__init__.py", line 20, in init eng = _activeEngines[driverName] File "/usr/lib/python3.9/weakref.py", line 137, in __getitem__ o = self.data[key]() KeyError: None During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/commander/BAXTERTest2.py", line 53, in <module> speak("Initialising Baxter..........") File "/home/commander/BAXTERTest2.py", line 14, in speak engine = pyttsx3.init() File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/__init__.py", line 22, in init eng = Engine(driverName, debug) File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/engine.py", line 30, in __init__ self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug) File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/driver.py", line 50, in __init__ self._module = importlib.import_module(name) File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/drivers/espeak.py", line 9, in <module> from . import _espeak, toUtf8, fromUtf8 File "/home/commander/.local/lib/python3.9/site-packages/pyttsx3/drivers/_espeak.py", line 18, in <module> dll = cdll.LoadLibrary('libespeak.so.1') File "/usr/lib/python3.9/ctypes/__init__.py", line 452, in LoadLibrary return self._dlltype(name) File "/usr/lib/python3.9/ctypes/__init__.py", line 374, in __init__ self._handle = _dlopen(self._name, mode) OSError: libespeak.so.1: cannot open shared object file: No such file or directory
Reply
#6
As bowlofred suggested, make sure you have the correct library of espeak or espeak-dev installed.
Is your script using the desired version of python?
When on my linux box I use the #! /usr/bin/env python3 at the top of my scripts.
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#7
I added
#! /usr/bin/env python3
at the top of my script and no luck (I also downloaded espeak-ng from the manjaro app store and did the
pip install espeakng


I still get that OSError for libespeak. Then I found this: ROS Index and according to this the libespeak-dev is not supported on Arch-Linux (which I am using).

Is that the reason my espeak won't work?
Is there another offline TTS alternative that I can use?

Thanks.

Or is there a way to send the text I want to speak to the terminal where it would execute
 espeak-ng "this is a test"
since that seems to work. So it would replace the "this is a test" text with the text I want it to speak from my code. Is that possible?
Reply
#8
I do not have any experience with arch linux but, did find this on a quick search
https://aur.archlinux.org/packages/?O=0&..._Search=Go
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#9
(Jan-02-2022, 09:12 PM)menator01 Wrote: I do not have any experience with arch linux but, did find this on a quick search
https://aur.archlinux.org/packages/?O=0&..._Search=Go

Thanks for your help. I'll look into that.

Although I was thinking and came up with kind of a wild idea.

I have an Arduino with a Speech Synthesizer shield attached to it (it's called a Movi Shield) and I was wondering it it was possible to send the strings/text I want to be spoken from my Python script to my Arduino and have the Movi shield (speech synthesizer) read out/speak the text.

Is that something that can be done via serial commands?
Reply
#10
One of the more experienced people will have to answer that one. Like Arch Linux, I;m not familiar with Arduino. Sorry I could not be more help.
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  python espeak on Windows?? Extra 4 5,560 Mar-01-2022, 10:28 AM
Last Post: DeaD_EyE
  Voice packs for Linux espeak gr3yali3n 0 1,658 Dec-24-2020, 07:42 PM
Last Post: gr3yali3n

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020