我正在尝试在没有语音帽的情况下在 Raspberry Pi 上使用谷歌助手 aiy,因为它很快就卖光了。
我找到了一个我遵循的教程。
http://www.androidauthority.com/build-google-assistant-raspberry-pi-770296/
它以前工作过,但是由于我更新了所有内容,因此在尝试运行 check_audio.py 时出现此错误
Playing a test sound...
Traceback (most recent call last):
File "/home/pi/voice-recognizer-raspi/checkpoints/check_audio.py", line 198, in <module>
main()
File "/home/pi/voice-recognizer-raspi/checkpoints/check_audio.py", line 191, in main
do_checks()
File "/home/pi/voice-recognizer-raspi/checkpoints/check_audio.py", line 172, in do_checks
if not check_speaker_works():
File "/home/pi/voice-recognizer-raspi/checkpoints/check_audio.py", line 130, in check_speaker_works
play_wav(TEST_SOUND_PATH)
File "/home/pi/voice-recognizer-raspi/checkpoints/check_audio.py", line 77, in play_wav
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
File "/usr/lib/python3.4/subprocess.py", line 561, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['python3', '/home/pi/voice-recognizer-raspi/src/aiy/audio.py', 'play', '/usr/share/sounds/alsa/Front_Center.wav']' returned non-zero exit status 1
这是我的文件:
#!/usr/bin/env python3
# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Check that the voiceHAT audio input and output are both working.
"""
import os
import subprocess
import tempfile
import textwrap
import time
import traceback
CARDS_PATH = '/proc/asound/cards'
VOICEHAT_ID = 'bcm2835'
SERVICE_NAME = 'voice-recognizer'
ACTIVE_STR = 'ActiveState=active'
INACTIVE_STR = 'ActiveState=inactive'
STOP_DELAY = 1.0
VOICE_RECOGNIZER_PATH = os.path.realpath(os.path.join(__file__, '..', '..'))
PYTHON3 = 'python3'
AUDIO_PY = VOICE_RECOGNIZER_PATH + '/src/aiy/audio.py'
TEST_SOUND_PATH = '/usr/share/sounds/alsa/Front_Center.wav'
RECORD_DURATION_SECONDS = '3'
def get_sound_cards():
"""Read a dictionary of ALSA cards from /proc, indexed by number."""
cards = {}
with open(CARDS_PATH) as f: # pylint: disable=invalid-name
for line in f.read().splitlines():
try:
index = int(line.strip().split()[0])
except (IndexError, ValueError):
continue
cards[index] = line
return cards
def is_service_active():
"""Returns True if the voice-recognizer service is active."""
output = subprocess.check_output(['systemctl', 'show', SERVICE_NAME]).decode('utf-8')
if ACTIVE_STR in output:
return True
elif INACTIVE_STR in output:
return False
else:
print('WARNING: failed to parse output:')
print(output)
return False
def play_wav(wav_path):
"""Play a WAV file."""
subprocess.check_call([PYTHON3, AUDIO_PY, 'play', wav_path],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
def ask(prompt):
"""Get a yes or no answer from the user."""
ans = input(prompt + ' (y/n) ')
while not ans or ans[0].lower() not in 'yn':
ans = input('Please enter y or n: ')
return ans[0].lower() == 'y'
def stop_service():
"""Stop the voice-recognizer so we can use the mic.
Returns:
True if the service has been stopped.
"""
if not is_service_active():
return False
subprocess.check_call(['sudo', 'systemctl', 'stop', SERVICE_NAME], stdout=subprocess.PIPE)
time.sleep(STOP_DELAY)
if is_service_active():
print('WARNING: failed to stop service, mic may not work.')
return False
return True
def start_service():
"""Start the voice-recognizer again."""
subprocess.check_call(['sudo', 'systemctl', 'start', SERVICE_NAME], stdout=subprocess.PIPE)
def check_voicehat_present():
"""Check that the voiceHAT is present."""
return any(VOICEHAT_ID in card for card in get_sound_cards().values())
def check_voicehat_is_first_card():
"""Check that the voiceHAT is the first card on the system."""
cards = get_sound_cards()
return 0 in cards and VOICEHAT_ID in cards[0]
def check_speaker_works():
"""Check the speaker makes a sound."""
print('Playing a test sound...')
play_wav(TEST_SOUND_PATH)
return ask('Did you hear the test sound?')
def check_mic_works():
"""Check the microphone records correctly."""
temp_file, temp_path = tempfile.mkstemp(suffix='.wav')
os.close(temp_file)
try:
input("When you're ready, press enter and say 'Testing, 1 2 3'...")
print('Recording...')
subprocess.check_call(
[PYTHON3, AUDIO_PY, 'dump', temp_path,
'-d', RECORD_DURATION_SECONDS],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
print('Playing back recorded audio...')
play_wav(temp_path)
finally:
try:
os.unlink(temp_path)
except FileNotFoundError:
pass
return ask('Did you hear your own voice?')
def do_checks():
"""Run all audio checks and print status."""
if not check_voicehat_present():
print(textwrap.fill(
"""Failed to find the voiceHAT soundcard. Refer to HACKING.md for
how to setup the voiceHAT driver: https://git.io/v99yK"""))
return
if not check_voicehat_is_first_card():
print(textwrap.fill(
"""The voiceHAT not the first sound device, so the voice recognizer
may be unable to find it. Please try removing other sound drivers."""))
return
if not check_speaker_works():
print(textwrap.fill(
"""There may be a problem with your speaker. Check that it's
connected properly."""))
return
if not check_mic_works():
print(textwrap.fill(
"""There may be a problem with your microphone. Check that it's
connected properly."""))
return
print('The audio seems to be working.')
def main():
"""Run all checks, stopping the voice-recognizer if necessary."""
should_restart = stop_service()
do_checks()
if should_restart:
start_service()
if __name__ == '__main__':
try:
main()
input('Press Enter to close...')
except: # pylint: disable=bare-except
traceback.print_exc()
input('Press Enter to close...')
我更新了本教程:http ://eduncan911.com/stem/embedded/aiy-google-assistant-upgrades-may-2017.html
我还通过本教程更改了触发器。我的扬声器和麦克风使用 aplay 和 arecord 命令。