Неисправность передачи строковой переменной для возврата данных из функции python, которые будут использоваться глобально в любом месте скрипта или программы python - для ясности отредактировано - PullRequest
0 голосов
/ 27 августа 2018

Я редактирую свой вопрос, чтобы отразить проблему, возникшую в моем заявлении.

Я пытаюсь взять потоковое аудио и преобразовать его в текст, используя текст Google в речь.Затем передайте этот текст в качестве входных данных разговору, а не Уотсону.Затем Уотсон возвращает свой ответ.

Последняя половина прекрасно работает.

Проблема, с которой я столкнулся, заключается в том, что я не могу заставить скрипт передать текст из записанной речи в службу WatsonЯ создал.

Я не получаю ошибку, я просто ничего не получаю.Микрофон работает (я проверил его другим скриптом).Программа на самом деле указывает, что я мог понять мой ответ (без текста я предполагаю).Вот мой код

import os
import watson_developer_cloud

import speech_recognition as sr
from gtts import gTTS
import watson_developer_cloud
import time

# Set up Assistant service.
service = watson_developer_cloud.AssistantV1(
  #username = 'USERNAME', # replace with service username
  #password = 'PASSWORD', # replace with service password

  iam_api_key = 'xxxxxxxxxx', # replace with service username
  url = 'xxxxxxxxxx', # replace with service password
  version = 'xxxxxxxxxx'
)
workspace_id = 'xxxxxxxxxxxxxx' # replace with workspace ID

def getaudiodevices():
    devices = os.popen("arecord -l")
    device_string = devices.read()
    device_string = device_string.split("\n")
    for line in device_string:
        if line.find("card") != -1:
            print("hw:" + line[line.find("card") + 5] + "," + line[line.find("device") + 7])

def speak(audiostring):
    print(audiostring)
    tts = gTTS(text=audiostring, lang='en')
    tts.save('audio.mp3')
    os.system('mpg321 audio.mp3')

def recordaudio():
    # Record Audio
    r = sr.Recognizer()
    with sr.Microphone(0) as source:
        print("Say something!")
        audio = r.listen(source,phrase_time_limit=10)
    # Speech recognition ******
    data = " "
    try:
        data = r.recognize_google(audio)
        print("You said: " + data)
    except sr.UnknownValueError:
        print("Google Speech Recognition could not understand audio")
    except sr.RequestError as e:
        print("Could not request results from Google Speech Recognition service; {0}".format(e))

    return data

# Initialize with empty value to start the conversation.
user_input = ''
context = {}
current_action = ''

# Main input/output loop
while current_action != 'end_conversation':

  # Send message to Assistant service.
  response = service.message(
    workspace_id = workspace_id,
    input = {
      'text': user_input
    },
    context = context
  )

  # Print the output from dialog, if any.
  if response['output']['text']:
    print(response['output']['text'][0])
    speak(response['output']['text'][0])

  # Update the stored context with the latest received from the dialog.
  context = response['context']
  # Check for action flags sent by the dialog.
  if 'action' in response['output']:
    current_action = response['output']['action']
  # User asked what time it is, so we output the local system time.
  if current_action == 'display_time':
    print('The current time is ' + time.strftime('%I:%M:%S %p') + '.')
    speak('The current time is ' + time.strftime('%I:%M:%S %p') + '.')
  # If we're not done, prompt for next round of input.
  if current_action != 'end_conversation':
    user_input = input('>> ')

Примечание: в настоящее время я могу написать речь с клавиатуры, и она работает.Я хочу, чтобы пользовательский ввод исходил из текста, сгенерированного из транскрибируемого звука с использованием Google Text в речь.Мне нужно передать данные из записанного аудио в основную часть моего скрипта на python, где он взаимодействует со службой Watson.

Может кто-нибудь помочь мне разобраться?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Итак, решение от @Denziloe было правильным с еще несколькими дополнениями.

В основном я поместил весь цикл, пока микрофон активен, затем я инициировал пользовательский ввод для запуска сервисного соединения.Затем я вставил еще один цикл с data = recordaudio () и установил для ввода данных пользователя.

Теперь он работает.

Спасибо всем.

0 голосов
/ 27 августа 2018

Есть некоторые тонкости, которые лучше всего изучить на примерах, которые я приведу ниже.Важное ключевое слово - «глобальный».Вы можете использовать ключевое слово «global» внутри функции, чтобы гарантировать, что Python знает, что вы хотите работать с глобальной переменной с этим именем, и не объявлять локальную переменную.

Списки и другие коллекции интересны, потому что Pythonможет понять, когда вы пытаетесь изменить существующую коллекцию, а не объявлять новую.Пример этого включен в демонстрационный код.

# These are global variables accessible anywhere in the script.
# They do not belong to any function or class.
my_string = ""
my_list = [1]


def a():
    return "a"


def b():
    my_string = "b" # this *is not* the global my_string


def c():
    global my_string
    my_string = "c" # this *is* the global my_string


def d():
    my_list = [7] # this *is not* the global my_list


def e():
    my_list[0] = 4 # this *is* the global my_list


def f():
    global my_list
    my_list = [1, 2, 3] # this *is* the global my_list


my_string = a()
print(my_string) # my_string has been assigned "a"


b()
print(my_string) # my_string is still "a"


c()
print(my_string) # my_string is now "c"


d()
print(my_list) # my_list is still [1]


e()
print(my_list) # my_list is now [7]


f()
print(my_list) # my_list is now [1, 2, 3]
...