В этом кратком руководстве вы будете использовать пакет SDK для службы «Речь» для создания пользовательского приложения голосового помощника, которое подключается к боту, который вы уже создали и настроили. Если необходимо создать бот, см. дополнительные сведения в исчерпывающем руководстве.
После выполнения нескольких предварительных требований подключение пользовательского интерфейса пользователя займет всего несколько шагов:
- Создайте объект BotFrameworkConfig , содержащий ключ и регион подписки.
- Создайте объект DialogServiceConnector , используя приведенный выше объект BotFrameworkConfig .
- С помощью объекта DialogServiceConnector запустите процесс прослушивания для одного речевого фрагмента.
- Проверьте возвращенный результат ActivityReceivedEventArgs .
Пакет SDK службы «Речь» для C++, JavaScript, Objective-C, Python и Swift поддерживает пользовательские голосовые помощники, но здесь пока нет соответствующего руководства.
ЧУДО! ГОВОРЯЩАЯ ЗАРЯДКА. Как автоматизировать процессы в телефоне. Обзор приложения MACRODROID
Вы можете просмотреть или скачать все примеры для пакета SDK службы «Речь» для C# на сайте GitHub.
Предварительные требования
Перед началом работы нужно сделать следующее:
- создавать ресурс службы «Речь»;
- Настройка среды разработки и создание пустого проекта
- Создание программы-робота, подключенной к Каналу Direct Line Speech
- Убедитесь, что у вас есть доступ к микрофону для аудиозахвата.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Откройте проект в Visual Studio.
Сначала необходимо убедиться, что проект открыт в Visual Studio.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
- Откройте MainPage.xaml в обозревателе решений.
- В представлении XAML конструктора замените все содержимое следующим фрагментом кода, который определяет элементарный пользовательский интерфейс:
» Margin=»10,10,10,20″ TextWrapping=»Wrap» />
Конструктор обновляется для отображения пользовательского интерфейса приложения.
- В Обозревателе решений откройте исходный файл кода программной части MainPage.xaml.cs . (Он сгруппирован в MainPage.xaml .) Замените содержимое этого файла приведенным ниже, которое включает:
using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; using Microsoft.CognitiveServices.Speech.Dialog; using System; using System.Diagnostics; using System.IO; using System.Text; using Windows.Foundation; using Windows.Storage.Streams; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; namespace helloworld < public sealed partial class MainPage : Page < private DialogServiceConnector connector; private enum NotifyType < StatusMessage, ErrorMessage >; public MainPage() < this.InitializeComponent(); >private async void EnableMicrophone_ButtonClicked( object sender, RoutedEventArgs e) < bool isMicAvailable = true; try < var mediaCapture = new Windows.Media.Capture.MediaCapture(); var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings(); settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio; await mediaCapture.InitializeAsync(settings); >catch (Exception) < isMicAvailable = false; >if (!isMicAvailable) < await Windows.System.Launcher.LaunchUriAsync( new Uri(«ms-settings:privacy-microphone»)); >else < NotifyUser(«Microphone was enabled», NotifyType.StatusMessage); >> private void NotifyUser( string strMessage, NotifyType type = NotifyType.StatusMessage) < // If called from the UI thread, then update immediately. // Otherwise, schedule a task on the UI thread to perform the update. if (Dispatcher.HasThreadAccess) < UpdateStatus(strMessage, type); >else < var task = Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () =>UpdateStatus(strMessage, type)); > > private void UpdateStatus(string strMessage, NotifyType type) < switch (type) < case NotifyType.StatusMessage: StatusBorder.Background = new SolidColorBrush( Windows.UI.Colors.Green); break; case NotifyType.ErrorMessage: StatusBorder.Background = new SolidColorBrush( Windows.UI.Colors.Red); break; >StatusBlock.Text += string.IsNullOrEmpty(StatusBlock.Text) ? strMessage : «n» + strMessage; if (!string.IsNullOrEmpty(StatusBlock.Text)) < StatusBorder.Visibility = Visibility.Visible; StatusPanel.Visibility = Visibility.Visible; >else < StatusBorder.Visibility = Visibility.Collapsed; StatusPanel.Visibility = Visibility.Collapsed; >// Raise an event if necessary to enable a screen reader // to announce the status update. var peer = Windows.UI.Xaml.Automation.Peers.FrameworkElementAutomationPeer.FromElement(StatusBlock); if (peer != null) < peer.RaiseAutomationEvent( Windows.UI.Xaml.Automation.Peers.AutomationEvents.LiveRegionChanged); >> // Waits for and accumulates all audio associated with a given // PullAudioOutputStream and then plays it to the MediaElement. Long spoken // audio will create extra latency and a streaming playback solution // (that plays audio while it continues to be received) should be used — // see the samples for examples of this. private void SynchronouslyPlayActivityAudio( PullAudioOutputStream activityAudio) < var playbackStreamWithHeader = new MemoryStream(); playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes(«RIFF»), 0, 4); // ChunkID playbackStreamWithHeader.Write(BitConverter.GetBytes(UInt32.MaxValue), 0, 4); // ChunkSize: max playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes(«WAVE»), 0, 4); // Format playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes(«fmt «), 0, 4); // Subchunk1ID playbackStreamWithHeader.Write(BitConverter.GetBytes(16), 0, 4); // Subchunk1Size: PCM playbackStreamWithHeader.Write(BitConverter.GetBytes(1), 0, 2); // AudioFormat: PCM playbackStreamWithHeader.Write(BitConverter.GetBytes(1), 0, 2); // NumChannels: mono playbackStreamWithHeader.Write(BitConverter.GetBytes(16000), 0, 4); // SampleRate: 16kHz playbackStreamWithHeader.Write(BitConverter.GetBytes(32000), 0, 4); // ByteRate playbackStreamWithHeader.Write(BitConverter.GetBytes(2), 0, 2); // BlockAlign playbackStreamWithHeader.Write(BitConverter.GetBytes(16), 0, 2); // BitsPerSample: 16-bit playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes(«data»), 0, 4); // Subchunk2ID playbackStreamWithHeader.Write(BitConverter.GetBytes(UInt32.MaxValue), 0, 4); // Subchunk2Size byte[] pullBuffer = new byte[2056]; uint lastRead = 0; do < lastRead = activityAudio.Read(pullBuffer); playbackStreamWithHeader.Write(pullBuffer, 0, (int)lastRead); >while (lastRead == pullBuffer.Length); var task = Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () => < mediaElement.SetSource( playbackStreamWithHeader.AsRandomAccessStream(), «audio/wav»); mediaElement.Play(); >); > private void InitializeDialogServiceConnector() < // New code will go here >private async void ListenButton_ButtonClicked( object sender, RoutedEventArgs e) < // New code will go here >> >
- Добавьте следующий фрагмент кода в текст метода InitializeDialogServiceConnector . Этот код создает DialogServiceConnector с помощью сведений о подписке.
// Create a BotFrameworkConfig by providing a Speech service subscription key // the botConfig.Language property is optional (default en-US) const string speechSubscriptionKey = «YourSpeechSubscriptionKey»; // Your subscription key const string region = «YourServiceRegion»; // Your subscription service region. var botConfig = BotFrameworkConfig.FromSubscription(speechSubscriptionKey, region); botConfig.Language = «en-US»; connector = new DialogServiceConnector(botConfig);
Примечание Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Сделал Говорящую Зарядку
Примечание Для получения сведений о настройке бота см. документацию по Bot Framework для канала Direct Line Speech.
// ActivityReceived is the main way your bot will communicate with the client // and uses bot framework activities connector.ActivityReceived += (sender, activityReceivedEventArgs) => < NotifyUser( $»Activity received, hasAudio=activity=»); if (activityReceivedEventArgs.HasAudio) < SynchronouslyPlayActivityAudio(activityReceivedEventArgs.Audio); >>; // Canceled will be signaled when a turn is aborted or experiences an error condition connector.Canceled += (sender, canceledEventArgs) => < NotifyUser($»Canceled, reason=»); if (canceledEventArgs.Reason == CancellationReason.Error) < NotifyUser( $»Error: code=, details=»); > >; // Recognizing (not ‘Recognized’) will provide the intermediate recognized text // while an audio stream is being processed connector.Recognizing += (sender, recognitionEventArgs) => < NotifyUser($»Recognizing! in-progress text=»); >; // Recognized (not ‘Recognizing’) will provide the final recognized text // once audio capture is completed connector.Recognized += (sender, recognitionEventArgs) => < NotifyUser($»Final speech to text result: »»); >; // SessionStarted will notify when audio begins flowing to the service for a turn connector.SessionStarted += (sender, sessionEventArgs) => < NotifyUser($»Now Listening! Session started, >; // SessionStopped will notify when a turn is complete and // it’s safe to begin listening again connector.SessionStopped += (sender, sessionEventArgs) => < NotifyUser($»Listening complete. Session ended, >;
Создание и запуск приложения
Теперь можно приступать к созданию приложения и проверке пользовательского голосового помощника, используя службу «Речь».
- В строке меню выберите Сборка>Построить решение, чтобы создать приложение. Теперь код должен компилироваться без ошибок.
- Выберите Отладка>Начать отладку(или нажмите клавишу F5), чтобы запустить приложение. Откроется окно helloworld.
- Выберите Включить микрофон, а когда появится запрос на разрешение доступа, выберите Да.
- Щелкните Talk to your bot (Разговор с ботом) и произнесите фразу или предложение на английском языке в микрофон устройства. Ваша речь передастся в канал «Речь Direct Line» и преобразуется в текст, который появится в том же окне.
Дальнейшие действия
Вы можете просмотреть или скачать все примеры для пакета SDK службы «Речь» для Java на сайте GitHub.
Выберите целевую среду
- Среда выполнения Java
- Android
Предварительные требования
Перед началом работы нужно сделать следующее:
- создавать ресурс службы «Речь»;
- Настройка среды разработки и создание пустого проекта
- Создание программы-робота, подключенной к Каналу Direct Line Speech
- Убедитесь, что у вас есть доступ к микрофону для аудиозахвата.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Создание и настройка проекта
Кроме того, для включения ведения журнала обновите файл pom.xml, чтобы добавить следующие зависимости.
org.slf4j slf4j-simple 1.7.5
Добавление примеров кода
- Выберите Файл>Создать>Класс, чтобы добавить пустой класс в проект Java.
- В окне New Java Class (Новый класс Java) введите speechsdk.quickstart в поле Пакет и Main в поле Имя.
- Откройте только что созданный класс Main и замените содержимое файла Main.java следующим начальным кодом.
package speechsdk.quickstart; import com.microsoft.cognitiveservices.speech.audio.AudioConfig; import com.microsoft.cognitiveservices.speech.audio.PullAudioOutputStream; import com.microsoft.cognitiveservices.speech.dialog.BotFrameworkConfig; import com.microsoft.cognitiveservices.speech.dialog.DialogServiceConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import java.io.InputStream; public class Main < final Logger log = LoggerFactory.getLogger(Main.class); public static void main(String[] args) < // New code will go here >private void playAudioStream(PullAudioOutputStream audio) < ActivityAudioStream stream = new ActivityAudioStream(audio); final ActivityAudioStream.ActivityAudioFormat audioFormat = stream.getActivityAudioFormat(); final AudioFormat format = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, audioFormat.getSamplesPerSecond(), audioFormat.getBitsPerSample(), audioFormat.getChannels(), audioFormat.getFrameSize(), audioFormat.getSamplesPerSecond(), false); try < int bufferSize = format.getFrameSize(); final byte[] data = new byte[bufferSize]; SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(format); if (line != null) < line.start(); int nBytesRead = 0; while (nBytesRead != -1) < nBytesRead = stream.read(data); if (nBytesRead != -1) < line.write(data, 0, nBytesRead); >> line.drain(); line.stop(); line.close(); > stream.close(); > catch (Exception e) < e.printStackTrace(); >> >
- Замените строку YourSubscriptionKey ключом ресурса службы «Речь», который можно получить на портале Azure.
- Замените строку YourServiceRegion на регион, связанный с вашим ресурсом службы «Речь».
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
final String subscriptionKey = «YourSubscriptionKey»; // Your subscription key final String region = «YourServiceRegion»; // Your speech subscription service region final BotFrameworkConfig botConfig = BotFrameworkConfig.fromSubscription(subscriptionKey, region); // Configure audio input from a microphone. final AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput(); // Create a DialogServiceConnector instance. final DialogServiceConnector connector = new DialogServiceConnector(botConfig, audioConfig);
// Recognizing will provide the intermediate recognized text while an audio stream is being processed. connector.recognizing.addEventListener((o, speechRecognitionResultEventArgs) -> < log.info(«Recognizing speech event text: <>», speechRecognitionResultEventArgs.getResult().getText()); >); // Recognized will provide the final recognized text once audio capture is completed. connector.recognized.addEventListener((o, speechRecognitionResultEventArgs) -> < log.info(«Recognized speech event reason text: <>», speechRecognitionResultEventArgs.getResult().getText()); >); // SessionStarted will notify when audio begins flowing to the service for a turn. connector.sessionStarted.addEventListener((o, sessionEventArgs) -> < log.info(«Session Started event id: <>», sessionEventArgs.getSessionId()); >); // SessionStopped will notify when a turn is complete and it’s safe to begin listening again. connector.sessionStopped.addEventListener((o, sessionEventArgs) -> < log.info(«Session stopped event id: <>», sessionEventArgs.getSessionId()); >); // Canceled will be signaled when a turn is aborted or experiences an error condition. connector.canceled.addEventListener((o, canceledEventArgs) -> < log.info(«Canceled event details: <>», canceledEventArgs.getErrorDetails()); connector.disconnectAsync(); >); // ActivityReceived is the main way your bot will communicate with the client and uses Bot Framework activities. connector.activityReceived.addEventListener((o, activityEventArgs) -> < final String act = activityEventArgs.getActivity().serialize(); log.info(«Received activity <>audio», activityEventArgs.hasAudio() ? «with» : «without»); if (activityEventArgs.hasAudio()) < playAudioStream(activityEventArgs.getAudio()); >>);
connector.connectAsync(); // Start listening. System.out.println(«Say something . «); connector.listenOnceAsync(); // connector.sendActivityAsync(. )
Создание и запуск приложения
Нажмите клавишу F11 или выберите Запустить>Отладка. На консоли отобразится сообщение Say something (Скажите что-нибудь). В этот момент вы можете произнести на английском языке фразу или предложение, которое бот сможет распознать.
Ваша речь передается боту через канал «Речь Direct Line», где она распознается и обрабатывается ботом. Ответ возвратится в качестве действия. Если ваш бот в качестве ответа возвращает речь, аудио воспроизводится с помощью класса AudioPlayer .
Источник: learn.microsoft.com
Создаем голосового помощника на Python.
У всех моих друзей есть Alexa, а у меня нет, из-за чего они надо мной смеются. Натерпевшись вдоволь, я решил: “Хватит!”.
Я связался со своей командой, и как только с моих уст прозвучало “Alexa”, кто-то из ребят выкрикнул: “Не покупай Alexa! Создай свою. Это можно сделать в 20 строк кода”.
О чем этот проект?
Его цель — сэкономить деньги и создать собственную Alexa, способную выполнять для вас массу полезных вещей.
Ваша бабушка будет в восторге! Ей ничего не придется делать вручную, достаточно будет голосовых команд, и виртуальный помощник сделает все, что нужно.
Немного терминологии
Модуль/библиотека:
Предопределенный или предварительно написанный кем-то код, который можно бесплатно использовать в своем проекте.
Класс:
Концепция из ООП, которая позволяет группировать код и в некотором смысле является схемой для создания объектов. Классы позволяют использовать код повторно.
Объект:
Экземпляр класса, который можно задействовать для обращения к атрибутам и методам класса.
У Alexa есть две задачи
1. Слушать
Прослушивание команд является основной функциональностью любого виртуального помощника. Команды бывают различные, например: “Алекса, включи музыку” или “Алекса, сколько время?”
Помощник должен прослушать команду, понять ее и выполнить действие.
2. Говорить
Прослушивая и понимая команды, Alexa выполняет определенные действия. В ходе этого процесса она предоставляет голосовую обратную связь.
Реализация этих функций
Нам понадобятся два модуля Python:
- SpeechRecognition.
- Python Text-To-Speech (pyttsx3).
1. SpeechRecognition
Эта библиотека реализует распознавание речи: она помогает помощнику слушать ваши команды, понимать их и выполнять нужные действия.
Любой сторонний продукт нужно так или иначе устанавливать. Для этого выполните в терминале:
pip install SpeechRecognition
После установки можно использовать библиотеку в проекте. В процессе работы с модулем нам понадобятся три важных компонента.
1) Класс Recognizer: это основной класс модуля, который содержит все ключевые функции, нужные для создания приложения распознания речи.
Для начала нужно создать этот класс, а также его объекты:
r = sr.Recognizer()
Здесь r представляет просто произвольное имя, заданное для объекта. В его качестве можно использовать любую допустимую переменную Python.
2) Доступ к микрофону: так как помощнику нужно прослушивать команды, вам потребуется предоставить ему доступ к микрофону устройства. Для этого можно использовать класс Microphone :
# открываем микрофон и начинаем запись
with Microphone() as source:
# выполнение действий — «source« — это экземпляр микрофона, #созданный выше
pass
3) Прослушивание речи пользователя: после организации доступа к микрофону останется прописать прослушивание команд. Это можно сделать с помощью метода listen() , предоставляемого классом Recognizer :
# Прослушивает речь пользователя
# Принимает аудио-источник в качестве параметра
r.listen(source)
Таким образом происходит работа с распознаванием речи в Python. Разобравшись с основами этого модуля, можно переходить к следующему.
2. Python Text-To-Speech (pyttsx3)
Это библиотека Text-to-Speech (TTS) для Python 2 и Python 3, которая работает без обращения к интернету и каких-либо задержек.
Поскольку это сторонний модуль, сначала его нужно также установить:
pip install pyttsx3
Теперь с помощью этого модуля ваш помощник обретет дар речи.
Секрет: здесь мы просто преобразуем текст в речь.
Все остальное будет очень легко. Сначала нужно инициализировать модуль pyttsx3 с помощью метода init() и создать его объект. Затем можно использовать его функции для преобразования текста в речь:
engine = pyttsx3.init() engine.say(«Text to Speak Here») engine.runAndWait()
Здесь say() выполняет основную работу по преобразованию текста в речь, а runAndWait() ожидает, пока модуль закончит проговаривать конкретное предложение, после чего переходит к следующей задаче.
Разобравшись и с этим модулем, пора переходить к самому интересному.
Самое интересное
Голосовой помощник на Python
Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.
В этом уроке мы узнаем, как написать код собственного голосового помощника на Python.
Перед тем, как начать, мы должны определиться, какими функциями должен обладать наш голосовой помощник:
- Отправка электронных писем
- Воспроизведение музыки
- Запросы в Википедию
- Открытие сайтов, таких как Google, YouTube, Stackoverflow, freecodecamp и т.д. в браузере
- Открытие редактора кода или IDE одной голосовой командой
И всё это без ручного ввода запросов в браузере!
А теперь приступим, собственно, к написанию нашего помощника.
И да: не забудьте сперва придумать ему имя :з
Настройка среды
Я использую PyCharm, но вы можете выбрать абсолютно любой удобный вам редактор.
Сперва мы импортируем/установим все необходимые библиотеки:
- pyttsx3;
- datetime;
- speech recognition;
- wikipedia;
- webbrowser;
- os.path;
- smtplib.
Определение функции воспроизведения речи
Интеллектуальному голосовому помощнику прежде всего полагается говорить. Чтобы бот говорил, мы определим функцию speak() , которая принимает на входе аудио и произносит его.
def speak(audio): pass #пока так, позже мы напишем все условия.
Теперь нам нужно аудио, чтобы обеспечить коммуникацию пользователя и ассистента. Для этого мы установим модуль pyttsx3 .
Что такое pyttsx3 ?
Это библиотека Python, которая поможет нам конвертировать текст в устную речь. Она работает оффлайн и доступна как для Python 3, так и для Python 2.
pip install pyttsx3
После успешной установки pyttsx3 нужно импортировать модуль в нашу программу.
import pyttsx3 engine = pyttsx3.init(‘sapi5’) voices = engine.getProperty(‘voices’) #даёт подробности о текущем установленном голосе engine.setProperty(‘voice’, voice[1].id) # 0-мужской , 1-женский
Что такое sapi5? Microsoft Speech API (SAPI5) – технология для распознавания и синтеза речи, предоставленная Microsoft.
VoiceId помогает нам выбирать разные голоса:
- voice[0].id = мужской голос
- voice[1].id = женский голос
Создание функции speak()
def speak(audio): engine.say(audio) engine.runAndWait() #Без этой команды мы не услышим речь
Создание функции main()
Теперь определим функцию main() и вызовем функцию speak() внутри неё.
if __name__==»__main__» : speak(‘Hello Sir, I am Friday, your Artificial intelligence assistant. Please tell me how may I help you’)
P.S. Я назову своего ассистента Friday (Пятница).
Всё, что вы передадите функции speak() , будет полностью преобразовано в звук. Поздравляю: наш голосовой помощник обрел свой голос и готов с нами болтать!
Создание функции wishme()
Теперь мы напишем функцию wishme() , благодаря которой наш голосовой помощник будет приветствовать нас разными способами в зависимости от времени на компьютере.
Чтобы предоставить нашему ассистенту информацию о времени, мы должны импортировать модуль datetime, делается это следующей командой:
import datetime
Теперь напишем функцию wishme() :
def wishme(): hour = int(datetime.datetime.now().hour)
Здесь мы сохраняем целочисленное значение текущего часа в переменную hour . Используем это значение в конструкции if-else :
def wishMe(): hour = int(datetime.datetime.now().hour) if hour>=0 and hour=12 and hour
Определение функции takeCommand():
Следующий важный аспект в нашем помощнике: он должен уметь принимать команду с помощью микрофона нашей системы. Для этого мы создадим функцию takeCommand() .
С помощью takeCommand() наш интеллектуальный ассистент сможет возвращать строку, принимая голосовые команды по микрофону.
Но перед определением takeCommand() мы должны установить модуль speechRecognition следующей командой:
pip install speechRecognition
После установки импортируем модуль в программу:
import speechRecognition as sr
Начнём написание функции takeCommand() :
def takeCommand(): #Принимает на входе аудио от микрофона, возвращает строку с нашими словами r = sr.Recognizer() with sr.Microphone() as source: print(«Listening. «) r.pause_threshold = 1 audio = r.listen(source)