Reputation: 29
Hi there so I wanted to make a spotify voice assistant and found a tutorial of a person who just went through his code and explained it and left a github link down below and I used that and changed the setting to work for me but i'm getting an annoying error I'll put the code for the 3 files I have main.py, pepper.py and setup.txt
main.py:
import pandas as pd
from speech_recognition import Microphone, Recognizer, UnknownValueError
import spotipy as sp
from spotipy.oauth2 import SpotifyOAuth
from pepper import *
# Set variables from setup.txt
setup = pd.read_csv('C:\Users\Yousif\Documents\Python spotify\setup.txt', sep='=', index_col=0, squeeze=True, header=None)
client_id = setup['client_id']
client_secret = setup['client_secret']
device_name = setup['device_name']
redirect_uri = setup['redirect_uri']
scope = setup['scope']
username = setup['username']
# Connecting to the Spotify account
auth_manager = SpotifyOAuth(
client_id=client_id,
client_secret=client_secret,
redirect_uri=redirect_uri,
scope=scope,
username=username)
spotify = sp.Spotify(auth_manager=auth_manager)
# Selecting device to play from
devices = spotify.devices()
deviceID = None
for d in devices['devices']:
d['name'] = d['name'].replace('’', '\'')
if d['name'] == device_name:
deviceID = d['id']
break
# Setup microphone and speech recognizer
r = Recognizer()
m = None
input_mic = 'High Definition Audio Device' # Use whatever is your desired input
for i, microphone_name in enumerate(Microphone.list_microphone_names()):
if microphone_name == "High Definition Audio Device":
m = Microphone(device_index=i)
while True:
with m as source:
r.adjust_for_ambient_noise(source=source)
audio = r.listen(source=source)
command = None
try:
command = r.recognize_google(audio_data=audio).lower()
except UnknownValueError:
continue
print(command)
words = command.split()
if len(words) <= 1:
print('Could not understand. Try again')
continue
name = ' '.join(words[1:])
try:
if words[0] == 'album':
uri = get_album_uri(spotify=spotify, name=name)
play_album(spotify=spotify, device_id=deviceID, uri=uri)
elif words[0] == 'artist':
uri = get_artist_uri(spotify=spotify, name=name)
play_artist(spotify=spotify, device_id=deviceID, uri=uri)
elif words[0] == 'play':
uri = get_track_uri(spotify=spotify, name=name)
play_track(spotify=spotify, device_id=deviceID, uri=uri)
else:
print('Specify either "album", "artist" or "play". Try Again')
except InvalidSearchError:
print('InvalidSearchError. Try Again')
pepper.py:
from spotipy import Spotify
class InvalidSearchError(Exception):
pass
def get_album_uri(spotify: Spotify, name: str) -> str:
"""
:param spotify: Spotify object to make the search from
:param name: album name
:return: Spotify uri of the desired album
"""
# Replace all spaces in name with '+'
original = name
name = name.replace(' ', '+')
results = spotify.search(q=name, limit=1, type='album')
if not results['albums']['items']:
raise InvalidSearchError(f'No album named "{original}"')
album_uri = results['albums']['items'][0]['uri']
return album_uri
def get_artist_uri(spotify: Spotify, name: str) -> str:
"""
:param spotify: Spotify object to make the search from
:param name: album name
:return: Spotify uri of the desired artist
"""
# Replace all spaces in name with '+'
original = name
name = name.replace(' ', '+')
results = spotify.search(q=name, limit=1, type='artist')
if not results['artists']['items']:
raise InvalidSearchError(f'No artist named "{original}"')
artist_uri = results['artists']['items'][0]['uri']
print(results['artists']['items'][0]['name'])
return artist_uri
def get_track_uri(spotify: Spotify, name: str) -> str:
"""
:param spotify: Spotify object to make the search from
:param name: track name
:return: Spotify uri of the desired track
"""
# Replace all spaces in name with '+'
original = name
name = name.replace(' ', '+')
results = spotify.search(q=name, limit=1, type='track')
if not results['tracks']['items']:
raise InvalidSearchError(f'No track named "{original}"')
track_uri = results['tracks']['items'][0]['uri']
return track_uri
def play_album(spotify=None, device_id=None, uri=None):
spotify.start_playback(device_id=device_id, context_uri=uri)
def play_artist(spotify=None, device_id=None, uri=None):
spotify.start_playback(device_id=device_id, context_uri=uri)
def play_track(spotify=None, device_id=None, uri=None):
spotify.start_playback(device_id=device_id, uris=[uri])
and setup.txt:
client_id=...
client_secret=...
device_name=Yousif
redirect_uri=https://yousifisdaddy.com/
username=wsk5vzl3hw3i611coxgxog2il
scope=user-read-private user-read-playback-state user-modify-playback-state
and I did put my redirect uri thats found in my spotify app and i put my client id and secret id and my setup.txt location but obviously had to blur out the client id and secret id
And the error I got is:
File "c:/Users/Yousif/Documents/Python spotify/main.py", line 9
setup = pd.read_csv('C:\Users\Yousif\Documents\Python spotify\setup.txt', sep='=', index_col=0, squeeze=True, header=None)
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Upvotes: 1
Views: 92
Reputation: 2095
Change
setup = pd.read_csv('C:\Users\Yousif\Documents\Python spotify\setup.txt', sep='=', index_col=0, squeeze=True, header=None)
to
setup = pd.read_csv(r'C:\Users\Yousif\Documents\Python spotify\setup.txt', sep='=', index_col=0, squeeze=True, header=None)
Marking the path as a raw string will prevent backslash escapes from kicking in.
Reason for this:
Python uses string escape sequences to allow for unicode support:
From the docs:
\N{name}: Character named name in the Unicode database
\uxxxx: Character with 16-bit hex value xxxx
\Uxxxxxxxx: Character with 32-bit hex value xxxxxxxx
Upvotes: 1