Python Client for Alexa Voice Service (AVS)
Project description
Python Client for Alexa Voice Service (AVS)
Installation
pip install git+https://github.com/richtier/alexa-browser-client.git@0.4.0#egg=alexa_browser_client
Usage
File audio
from avs_client import AlexaVoiceServiceClient
alexa_client = AlexaVoiceServiceClient(
client_id='my-client-id',
secret='my-secret',
refresh_token='my-refresh-token',
)
alexa_client.connect() # authenticate and other handshaking steps
with open('./tests/resources/alexa_what_time_is_it.wav', 'rb') as f:
alexa_response_audio = alexa_client.send_audio_file(f)
with open('./output.wav', 'wb') as f:
f.write(alexa_response_audio)
Now listen to output.wave and Alexa should tell you the time.
Microphone audio
from io import BytesIO
import pyaudio
from avs_client import AlexaVoiceServiceClient
buffer = BytesIO()
def callback(in_data, frame_count, time_info, status):
buffer.write(in_data)
return (in_data, pyaudio.paContinue)
p = pyaudio.PyAudio()
stream = p.open(
format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True,
stream_callback=callback,
)
alexa_client = AlexaVoiceServiceClient(
client_id='my-client-id',
secret='my-secret',
refresh_token='my-refresh-token',
)
try:
stream.start_stream()
print('listening. Press CTRL + C to exit.')
alexa_client.connect()
alexa_response_audio = alexa_client.send_audio_file(buffer)
if alexa_response_audio:
with open('./output.wav', 'wb') as f:
f.write(alexa_response_audio)
finally:
stream.stop_stream()
stream.close()
p.terminate()
Authentication
To use AVS you must first have a developer account. Then register your product here. Choose “Application” under “Is your product an app or a device”?
The client requires your client_id, secret and refresh_token:
client kwarg |
Notes |
---|---|
client_id |
Retrieve by clicking on the your product listed here |
secret |
Retrieve by clicking on the your product listed here |
refresh_token |
You must generate this. See here |
Refresh token
You will need to login to Amazon via a web browser to get your refresh token.
To enable this first go here and click on your product to set some security settings under Security Profile:
setting |
value |
---|---|
Allowed Origins |
|
Allowed Return URLs |
Then run:
python ./avs_client/refreshtoken/serve.py \
--device-type-id=enter-device-type-id-here \
--client-id=enter-client-id-here \
--client-secret=enter-client-secret-here
Follow the on-screen instructions shown at http://localhost:9000 in your web browser. On completion Amazon will return your refresh_token.
Steaming audio to AVS
alexa_client.send_audio_file streaming uploads a file-like object to AVS for great latency. The file-like object can be an actual file on your filesystem, an in-memory BytesIo buffer containing audio from your microphone, or even audio streaming from your browser over a websocket in real-time.
AVS requires the audio data to be 16bit Linear PCM (LPCM16), 16kHz sample rate, single-channel, and little endian.
Persistent AVS connection
Calling alexa_client.connect() creates a persistent connection to AVS. The connection may get forcefully closed due to inactivity. Keep open by calling alexa_client.alexa_client.conditional_ping():
import threading
def ping_avs():
while True:
alexa_client.conditional_ping()
ping_thread = threading.Thread(target=ping_avs)
ping_thread.start()
You will only need this if you intend to run the process for more than five minutes. More information.
Other projects
This library is used by alexa-browser-client, which allows you to talk to Alexa from your browser.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for avs_client-0.4.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16ba682e4c1f735ce798a0d8c3fd439e72e23fae6ec206d44d6348a27f905c18 |
|
MD5 | 1d3125311c9e10603284ec572e27ad19 |
|
BLAKE2b-256 | 779935831e3d120bbc0ee7874a39ddacdb3e499396db3ef80d3ac99590996126 |