From d25b08a8904e6bbd43e8ba9f6f970746fc8433e4 Mon Sep 17 00:00:00 2001 From: Nick Felker Date: Wed, 23 Aug 2017 14:50:00 -0700 Subject: [PATCH] Initial commit --- CONTRIBUTING.md | 34 +++ LICENSE | 202 +++++++++++++ Makefile | 71 +++++ README.md | 88 ++++++ assistant_config.h | 23 ++ audio_input.h | 102 +++++++ audio_input_alsa.cc | 104 +++++++ audio_input_alsa.h | 30 ++ audio_input_file.cc | 55 ++++ audio_input_file.h | 28 ++ audio_output_alsa.cc | 128 ++++++++ audio_output_alsa.h | 40 +++ embedded_assistant.proto | 401 +++++++++++++++++++++++++ get_credentials.sh | 66 ++++ json_util.cc | 105 +++++++ json_util.h | 48 +++ json_util_test.cc | 71 +++++ resources/switch_to_channel_5.raw | Bin 0 -> 160000 bytes resources/weather_in_mountain_view.raw | Bin 0 -> 43008 bytes run_assistant.cc | 298 ++++++++++++++++++ scope_exit.h | 31 ++ service_account_util.cc | 101 +++++++ service_account_util.h | 29 ++ 23 files changed, 2055 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 assistant_config.h create mode 100644 audio_input.h create mode 100644 audio_input_alsa.cc create mode 100644 audio_input_alsa.h create mode 100644 audio_input_file.cc create mode 100644 audio_input_file.h create mode 100644 audio_output_alsa.cc create mode 100644 audio_output_alsa.h create mode 100644 embedded_assistant.proto create mode 100755 get_credentials.sh create mode 100644 json_util.cc create mode 100644 json_util.h create mode 100644 json_util_test.cc create mode 100644 resources/switch_to_channel_5.raw create mode 100644 resources/weather_in_mountain_view.raw create mode 100644 run_assistant.cc create mode 100644 scope_exit.h create mode 100644 service_account_util.cc create mode 100644 service_account_util.h diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d4ff4d6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# How to become a contributor and submit your own code + +## Contributor License Agreements + +We'd love to accept your sample apps and patches! Before we can take them, we +have to jump a couple of legal hurdles. + +Please fill out either the individual or corporate Contributor License Agreement (CLA). + + * If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an [individual CLA] + (https://developers.google.com/open-source/cla/individual). + * If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a [corporate CLA] + (https://developers.google.com/open-source/cla/corporate). + +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. + +## Contributing A Patch + +1. Submit an issue describing your proposed change to the repo in question. +1. The repo owner will respond to your issue promptly. +1. If your proposed change is accepted, and you haven't already done so, sign a + Contributor License Agreement (see details above). +1. Fork the desired repo, develop and test your code changes. +1. Ensure that your code adheres to the existing style in the sample to which + you are contributing. Refer to the + [Google C++ style guide] + (https://google.github.io/styleguide/cppguide.html) for the + recommended coding standards for this organization. +1. Ensure that your code has an appropriate set of unit tests which all pass. +1. Submit a pull request. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f0ca828 --- /dev/null +++ b/Makefile @@ -0,0 +1,71 @@ +# Copyright 2016 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. +GRPC_SRC_PATH ?= ../grpc +GOOGLEAPIS_GENS_PATH ?= ../googleapis/gens +GOOGLEAPIS_API_CCS = $(shell find $(GOOGLEAPIS_GENS_PATH)/google/api \ + -name '*.pb.cc') +GOOGLEAPIS_RPC_CCS = $(shell find $(GOOGLEAPIS_GENS_PATH)/google/rpc \ + -name '*.pb.cc') + +GOOGLEAPIS_CCS = $(GOOGLEAPIS_API_CCS) $(GOOGLEAPIS_RPC_CCS) + +GOOGLEAPIS_ASSISTANT_CCS = embedded_assistant.pb.cc embedded_assistant.grpc.pb.cc + +HOST_SYSTEM = $(shell uname | cut -f 1 -d_) +SYSTEM ?= $(HOST_SYSTEM) +CXX = g++ +CPPFLAGS += -I/usr/local/include -pthread -I$(GOOGLEAPIS_GENS_PATH) \ + -I$(GRPC_SRC_PATH) +CXXFLAGS += -std=c++11 +# grpc_cronet is for JSON functions in gRPC library. +ifeq ($(SYSTEM),Darwin) +LDFLAGS += -L/usr/local/lib `pkg-config --libs grpc++ grpc` \ + -lgrpc++_reflection -lgrpc_cronet \ + -lprotobuf -lpthread -ldl -lcurl +else +LDFLAGS += -L/usr/local/lib `pkg-config --libs grpc++ grpc` \ + -lgrpc_cronet -Wl,--no-as-needed -lgrpc++_reflection \ + -Wl,--as-needed -lprotobuf -lpthread -ldl -lcurl +endif + +AUDIO_SRCS = +ifeq ($(SYSTEM),Linux) +AUDIO_SRCS += audio_input_alsa.cc audio_output_alsa.cc +LDFLAGS += `pkg-config --libs alsa` +endif + +.PHONY: all +all: run_assistant + +googleapis.ar: $(GOOGLEAPIS_CCS:.cc=.o) + ar r $@ $? + +run_assistant.o: $(GOOGLEAPIS_ASSISTANT_CCS:.cc=.h) + +run_assistant: run_assistant.o $(GOOGLEAPIS_ASSISTANT_CCS:.cc=.o) googleapis.ar \ + $(AUDIO_SRCS:.cc=.o) audio_input_file.o json_util.o service_account_util.o + $(CXX) $^ $(LDFLAGS) -o $@ + +json_util_test: json_util.o json_util_test.o + $(CXX) $^ $(LDFLAGS) -o $@ + +$(GOOGLEAPIS_ASSISTANT_CCS:.cc=.h) $(GOOGLEAPIS_ASSISTANT_CCS): embedded_assistant.proto + protoc --proto_path=.:$(GOOGLEAPIS_GENS_PATH)/..:/usr/local/include \ + --cpp_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_cpp_plugin $^ + +clean: + rm -f *.o run_assistant googleapis.ar \ + $(GOOGLEAPIS_CCS:.cc=.o) \ + $(GOOGLEAPIS_ASSISTANT_CCS) $(GOOGLEAPIS_ASSISTANT_CCS:.cc=.h) \ + $(GOOGLEAPIS_ASSISTANT_CCS:.cc=.o) diff --git a/README.md b/README.md new file mode 100644 index 0000000..cc28795 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# gRPC C++ samples for Google Assistant SDK + +## Requirements + +This project is officially supported on Ubuntu 14.04. Other Linux distributions may be able to run +this sample. + +Refer to the [Assistant SDK documentation](https://developers.google.com/assistant/sdk/) for more information. + +## Setup instructions + +1. Remove previously installed Protobuf/gRPC/related packages and files. If you have not setup before, you can skip this step: +``` +sudo apt-get purge libc-ares-dev # https://github.com/grpc/grpc/pull/10706#issuecomment-302775038 +sudo apt-get purge libprotobuf-dev libprotoc-dev +sudo rm -rf /usr/local/bin/grpc_* /usr/local/bin/protoc \ + /usr/local/include/google/protobuf/ /usr/local/include/grpc/ /usr/local/include/grpc++/ \ + /usr/local/lib/libproto* /usr/local/lib/libgpr* /usr/local/lib/libgrpc* \ + /usr/local/lib/pkgconfig/protobuf* /usr/local/lib/pkgconfig/grpc* \ + /usr/local/share/grpc/ +``` + +2. Install dependencies +``` +sudo apt-get install autoconf automake libtool build-essential curl unzip +sudo apt-get install libasound2-dev # For ALSA sound output +sudo apt-get install libcurl4-openssl-dev # CURL development library +``` + +3. Build Protocol Buffer, gRPC and Google APIs +``` +git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc +cd grpc/ +git submodule update --init + +cd third_party/protobuf +./autogen.sh && ./configure && make +sudo make install +sudo ldconfig + +cd ../../ +make +sudo make install +sudo ldconfig + +cd ../ +git clone https://github.com/googleapis/googleapis.git +cd googleapis/ +make LANGUAGE=cpp +``` + +4. Make sure you setup env variable `$GOOGLEAPIS_GENS_PATH` +``` +export GOOGLEAPIS_GENS_PATH=./gens +``` + +5. Clone and build assistant-grpc +``` +cd ../ +git clone https://github.com/googlebowang/assistant-grpc.git + +cd assistant-grpc/ +make run_assistant +``` + +6. Get credentials file. It can be either an end-user's credentials, or a service account's credentials. + +For end-user's credentials: + +* Download the client secret json file from Google Cloud Platform Console following [these instructions](https://developers.google.com/assistant/sdk/develop/python/config-dev-project-and-account) +* Move it in this folder and rename it to `client_secret.json` +* run `get_credentials.sh` in this folder. It will create the file `credentials.json`. + +For service account's credentials in Google Cloud Platform Console: + +* Open **API Manager -> Credentials** +* Click **Create credentials -> Service account key**. Choose key type **JSON**, and click **Create** +* The service account's credentials JSON file will be downloaded. Notice that this JSON file can only be downloaded once, so keep it for future reference. + +7. Start `run_assistant` +``` +./run_assistant --audio_input ./resources/switch_to_channel_5.raw --credentials_file ./credentials.json --credentials_type USER_ACCOUNT +./run_assistant --audio_input ./resources/weather_in_mountain_view.raw --credentials_file --credentials_type SERVICE_ACCOUNT +# On Linux workstation, you can also use ALSA audio input: +./run_assistant --audio_input ALSA_INPUT --credentials_file ./credentials.json --credentials_type USER_ACCOUNT +``` + +Default Assistant gRPC API endpoint is embeddedassistant.googleapis.com. If you want to test with a custom Assistant gRPC API endpoint, you can pass an extra "--api_endpoint CUSTOM_API_ENDPOINT" to run_assistant. diff --git a/assistant_config.h b/assistant_config.h new file mode 100644 index 0000000..4b2c698 --- /dev/null +++ b/assistant_config.h @@ -0,0 +1,23 @@ +/* +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 + + https://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. +*/ + +#ifndef ASSISTANT_CONFIG_H +#define ASSISTANT_CONFIG_H + +// This is the endpoint to send gRPC data. +#define ASSISTANT_ENDPOINT "embeddedassistant.googleapis.com" + +#endif diff --git a/audio_input.h b/audio_input.h new file mode 100644 index 0000000..e8f5d40 --- /dev/null +++ b/audio_input.h @@ -0,0 +1,102 @@ +/* +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 + + https://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. +*/ + +#ifndef AUDIO_INPUT_H +#define AUDIO_INPUT_H + +#include +#include +#include +#include +#include +#include + +// Base class for audio input. Input data should be mono, s16_le, 16000kz. +// This class uses a separate thread to send audio data to listeners. +class AudioInput { + public: + virtual ~AudioInput() {} + + // Listeners might be called in different thread. + void AddDataListener( + std::function>)> + listener) { + data_listeners_.push_back(listener); + } + void AddStopListener(std::function listener) { + stop_listeners_.push_back(listener); + } + + // This thread should: + // 1. Initialize necessary resources; + // 2. If |is_running_| is still true, keep sending audio data; + // 3. Finalize necessary resources. + // 4. Call |OnStop|. + virtual std::unique_ptr GetBackgroundThread() = 0; + + // Asynchronously starts audio input. Starts internal thread to send audio. + void Start() { + std::unique_lock lock(is_running_mutex_); + if (is_running_) { + return; + } + + send_thread_ = std::move(GetBackgroundThread()); + is_running_ = true; + return; + } + + // Synchronously stops audio input. + void Stop() { + std::unique_lock lock(is_running_mutex_); + if (!is_running_) { + return; + } + is_running_ = false; + // |send_thread_| might have finished. + if (send_thread_->joinable()) { + send_thread_->join(); + } + } + + // Whether audio input is being sent to listeners. + bool IsRunning() { + std::unique_lock lock(is_running_mutex_); + return is_running_; + } + + protected: + // Function to call when audio input is stopped. + void OnStop() { + for (auto& stop_listener : stop_listeners_) { + stop_listener(); + } + } + + // Listeners which will be called when audio input data arrives. + std::vector>)>> + data_listeners_; + + // Whether audio input is being sent to listeners. + bool is_running_ = false; + + private: + std::vector> stop_listeners_; + std::mutex is_running_mutex_; + std::unique_ptr send_thread_; +}; + +#endif diff --git a/audio_input_alsa.cc b/audio_input_alsa.cc new file mode 100644 index 0000000..16a2b7f --- /dev/null +++ b/audio_input_alsa.cc @@ -0,0 +1,104 @@ +/* +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 + + https://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. +*/ + +#include "audio_input_alsa.h" + +#include + +#include + +std::unique_ptr AudioInputALSA::GetBackgroundThread() { + return std::unique_ptr(new std::thread([this]() { + // Initialize. + snd_pcm_t* pcm_handle; + int pcm_open_ret = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_CAPTURE, 0); + if (pcm_open_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_open returned " << pcm_open_ret << std::endl; + return; + } + int pcm_nonblock_ret = snd_pcm_nonblock(pcm_handle, SND_PCM_NONBLOCK); + if (pcm_nonblock_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_nonblock returned " << pcm_nonblock_ret << std::endl; + return; + } + snd_pcm_hw_params_t* pcm_params; + int malloc_param_ret = snd_pcm_hw_params_malloc(&pcm_params); + if (malloc_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params_malloc returned " << malloc_param_ret + << std::endl; + return; + } + snd_pcm_hw_params_any(pcm_handle, pcm_params); + int set_param_ret = + snd_pcm_hw_params_set_access(pcm_handle, pcm_params, SND_PCM_ACCESS_RW_INTERLEAVED); + if (set_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params_set_access returned " << set_param_ret + << std::endl; + return; + } + set_param_ret = + snd_pcm_hw_params_set_format(pcm_handle, pcm_params, SND_PCM_FORMAT_S16_LE); + if (set_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params_set_format returned " << set_param_ret + << std::endl; + return; + } + set_param_ret = + snd_pcm_hw_params_set_channels(pcm_handle, pcm_params, 1); + if (set_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params_set_channels returned " << set_param_ret + << std::endl; + return; + } + unsigned int rate = 16000; + set_param_ret = + snd_pcm_hw_params_set_rate_near(pcm_handle, pcm_params, &rate, nullptr); + if (set_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params_set_rate_near returned " << set_param_ret + << std::endl; + return; + } + set_param_ret = snd_pcm_hw_params(pcm_handle, pcm_params); + if (set_param_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_hw_params returned " << set_param_ret << std::endl; + return; + } + snd_pcm_hw_params_free(pcm_params); + + while (is_running_) { + std::shared_ptr> audio_data( + new std::vector(kFramesPerPacket * kBytesPerFrame)); + int pcm_read_ret = snd_pcm_readi(pcm_handle, &(*audio_data.get())[0], kFramesPerPacket); + if (pcm_read_ret == -EAGAIN) { + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } else if (pcm_read_ret < 0) { + std::cerr << "AudioInputALSA snd_pcm_readi returned " << pcm_read_ret << std::endl; + break; + } else if (pcm_read_ret > 0) { + audio_data->resize(kBytesPerFrame * pcm_read_ret); + for (auto& listener : data_listeners_) { + listener(audio_data); + } + } + } + + // Finalize. + snd_pcm_close(pcm_handle); + + // Call |OnStop|. + OnStop(); + })); +} diff --git a/audio_input_alsa.h b/audio_input_alsa.h new file mode 100644 index 0000000..68f9180 --- /dev/null +++ b/audio_input_alsa.h @@ -0,0 +1,30 @@ +/* +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 + + https://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. +*/ + +#include "audio_input.h" + +class AudioInputALSA : public AudioInput { + public: + ~AudioInputALSA() override {} + + virtual std::unique_ptr GetBackgroundThread() override; + + private: + // For 16000Hz, it's about 0.1 second. + static constexpr int kFramesPerPacket = 1600; + // 1 channel, S16LE, so 2 bytes each frame. + static constexpr int kBytesPerFrame = 2; +}; diff --git a/audio_input_file.cc b/audio_input_file.cc new file mode 100644 index 0000000..2e331e4 --- /dev/null +++ b/audio_input_file.cc @@ -0,0 +1,55 @@ +/* +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 + + https://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. +*/ + +#include "audio_input_file.h" + +#include +#include + +std::unique_ptr AudioInputFile::GetBackgroundThread() { + return std::unique_ptr(new std::thread([this]() { + // Initialize. + std::ifstream file_stream(file_path_); + if (!file_stream) { + std::cerr << "AudioInputFile cannot open file " << file_path_ << std::endl; + return; + } + + const size_t chunk_size = 20 * 1024; // 20KB + std::shared_ptr> chunk( + new std::vector); + chunk->resize(chunk_size); + while (is_running_) { + // Read another chunk from the file. + std::streamsize bytes_read = + file_stream.rdbuf()->sgetn((char*)&(*chunk.get())[0], chunk->size()); + if (bytes_read > 0) { + chunk->resize(bytes_read); + for (auto& listener : data_listeners_) { + listener(chunk); + } + } + if (bytes_read < chunk->size()) { + break; + } + // Wait a second before writing the next chunk. + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + + // Call |OnStop|. + OnStop(); + })); +} diff --git a/audio_input_file.h b/audio_input_file.h new file mode 100644 index 0000000..86a4466 --- /dev/null +++ b/audio_input_file.h @@ -0,0 +1,28 @@ +/* +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 + + https://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. +*/ + +#include "audio_input.h" + +class AudioInputFile : public AudioInput { + public: + AudioInputFile(const std::string& file_path): file_path_(file_path) {} + ~AudioInputFile() override {} + + virtual std::unique_ptr GetBackgroundThread() override; + + private: + const std::string file_path_; +}; diff --git a/audio_output_alsa.cc b/audio_output_alsa.cc new file mode 100644 index 0000000..c5cb51b --- /dev/null +++ b/audio_output_alsa.cc @@ -0,0 +1,128 @@ +/* +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 + + https://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. +*/ + +#include "audio_output_alsa.h" + +#include + +#include + +bool AudioOutputALSA::Start() { + std::unique_lock lock(isRunningMutex); + + if (isRunning) { + return true; + } + + snd_pcm_t* pcm_handle; + int pcm_open_ret = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0); + if (pcm_open_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_open returned " << pcm_open_ret << std::endl; + return false; + } + snd_pcm_hw_params_t* pcm_params; + int malloc_param_ret = snd_pcm_hw_params_malloc(&pcm_params); + if (malloc_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params_malloc returned " << malloc_param_ret + << std::endl; + return false; + } + snd_pcm_hw_params_any(pcm_handle, pcm_params); + int set_param_ret = + snd_pcm_hw_params_set_access(pcm_handle, pcm_params, SND_PCM_ACCESS_RW_INTERLEAVED); + if (set_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params_set_access returned " << set_param_ret + << std::endl; + return false; + } + set_param_ret = + snd_pcm_hw_params_set_format(pcm_handle, pcm_params, SND_PCM_FORMAT_S16_LE); + if (set_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params_set_format returned " << set_param_ret + << std::endl; + return false; + } + set_param_ret = + snd_pcm_hw_params_set_channels(pcm_handle, pcm_params, 1); + if (set_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params_set_channels returned " << set_param_ret + << std::endl; + return false; + } + unsigned int rate = 16000; + set_param_ret = + snd_pcm_hw_params_set_rate_near(pcm_handle, pcm_params, &rate, nullptr); + if (set_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params_set_rate_near returned " << set_param_ret + << std::endl; + return false; + } + set_param_ret = snd_pcm_hw_params(pcm_handle, pcm_params); + if (set_param_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_hw_params returned " << set_param_ret << std::endl; + return false; + } + snd_pcm_hw_params_free(pcm_params); + + isRunning = true; + alsaThread.reset(new std::thread([this, pcm_handle]() { + while (isRunning) { + std::unique_lock lock(audioDataMutex); + while (audioData.size() == 0 && isRunning) { + audioDataCv.wait_for(lock, std::chrono::milliseconds(100)); + } + if (!isRunning) { + break; + } + + std::shared_ptr> data = audioData[0]; + audioData.erase(audioData.begin()); + int frames = data->size() / 2; // 1 channel, S16LE, so 2 bytes each frame. + int pcm_write_ret = snd_pcm_writei(pcm_handle, &(*data.get())[0], frames); + if (pcm_write_ret < 0) { + int pcm_recover_ret = snd_pcm_recover(pcm_handle, pcm_write_ret, 0); + if (pcm_recover_ret < 0) { + std::cerr << "AudioOutputALSA snd_pcm_recover returns " << pcm_recover_ret << std::endl; + break; + } + } + } + // Wait for all data to be consumed. + snd_pcm_drain(pcm_handle); + snd_pcm_close(pcm_handle); + })); + std::cout << "AudioOutputALSA Start() succeeded" << std::endl; + return true; +} + +void AudioOutputALSA::Stop() { + std::unique_lock lick(isRunningMutex); + + if (!isRunning) { + return; + } + + isRunning = false; + alsaThread->join(); + alsaThread.reset(nullptr); + std::cout << "AudioOutputALSA Stop() succeeded" << std::endl; +} + +void AudioOutputALSA::Send(std::shared_ptr> data) { + std::unique_lock lock(audioDataMutex); + audioData.push_back(data); + audioDataCv.notify_one(); +} diff --git a/audio_output_alsa.h b/audio_output_alsa.h new file mode 100644 index 0000000..4bacc98 --- /dev/null +++ b/audio_output_alsa.h @@ -0,0 +1,40 @@ +/* +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 + + https://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. +*/ + +#include +#include +#include +#include + +// Audio output using ALSA. +class AudioOutputALSA { + public: + bool Start(); + + void Stop(); + + void Send(std::shared_ptr> data); + + friend void fill_audio(void* userdata, unsigned char* stream, int len); + + private: + std::vector>> audioData; + std::mutex audioDataMutex; + std::condition_variable audioDataCv; + std::unique_ptr alsaThread; + bool isRunning = false; + std::mutex isRunningMutex; +}; diff --git a/embedded_assistant.proto b/embedded_assistant.proto new file mode 100644 index 0000000..587ff4d --- /dev/null +++ b/embedded_assistant.proto @@ -0,0 +1,401 @@ +syntax = "proto3"; + +package google.assistant.embedded.v1alpha1; + +option java_multiple_files = true; +option java_outer_classname = "AssistantProto"; +option java_package = "com.google.assistant.embedded.v1alpha1"; + +import "google/api/annotations.proto"; +import "google/rpc/status.proto"; + +// Service that implements Google Assistant API. +service EmbeddedAssistant { + // Initiates or continues a conversation with the embedded assistant service. + // Each call performs one round-trip, sending an audio request to the service + // and receiving the audio response. Uses bidirectional streaming to receive + // results, such as the `END_OF_UTTERANCE` event, while sending audio. + // + // A conversation is one or more gRPC connections, each consisting of several + // streamed requests and responses. + // For example, the user says *Add to my shopping list* and the assistant + // responds *What do you want to add?*. The sequence of streamed requests and + // responses in the first gRPC message could be: + // + // * ConverseRequest.config + // * ConverseRequest.audio_in + // * ConverseResponse.interim_spoken_request_text "add" + // * ConverseRequest.audio_in + // * ConverseResponse.interim_spoken_request_text "add to my" + // * ConverseRequest.audio_in + // * ConverseResponse.interim_spoken_request_text "add to my shopping" + // * ConverseRequest.audio_in + // * ConverseResponse.event_type.END_OF_UTTERANCE + // * ConverseResponse.result.microphone_mode.DIALOG_FOLLOW_ON + // * ConverseResponse.audio_out + // * ConverseResponse.audio_out + // * ConverseResponse.audio_out + // + // Note that interim_spoken_request_text is returned asynchronously, which + // means that it could arrive in any order before the END_OF_UTTERANCE event + // occurs. + // + // The user then says *bagels* and the assistant responds + // *OK, I've added bagels to your shopping list*. This is sent as another gRPC + // connection call to the `Converse` method, again with streamed requests and + // responses, such as: + // + // * ConverseRequest.config + // * ConverseRequest.audio_in + // * ConverseRequest.audio_in + // * ConverseRequest.audio_in + // * ConverseResponse.event_type.END_OF_UTTERANCE + // * ConverseResponse.result.microphone_mode.CLOSE_MICROPHONE + // * ConverseResponse.screen_out + // * ConverseResponse.audio_out + // * ConverseResponse.audio_out + // * ConverseResponse.audio_out + // * ConverseResponse.audio_out + // + // Although the precise order of responses is not guaranteed, sequential + // ConverseResponse.audio_out messages will always contain sequential portions + // of audio. + rpc Converse(stream ConverseRequest) returns (stream ConverseResponse); +} + +// Specifies how to process the `ConverseRequest` messages. +message ConverseConfig { + // *Required* Specifies how to process the subsequent incoming audio. + AudioInConfig audio_in_config = 1; + + // *Required* Specifies how to format the audio that will be returned. + AudioOutConfig audio_out_config = 2; + + // *Required* Represents the current dialog state. + ConverseState converse_state = 3; + + // Device configuration that uniquely identifies a specific device. + DeviceConfig device_config = 4; +} + +// Specifies how to process the `audio_in` data that will be provided in +// subsequent requests. For recommended settings, see the Google Assistant SDK +// [best practices](https://developers.google.com/assistant/sdk/best-practices/audio). +message AudioInConfig { + // Audio encoding of the data sent in the audio message. + // Audio must be one-channel (mono). The only language supported is "en-US". + enum Encoding { + // Not specified. Will return result [google.rpc.Code.INVALID_ARGUMENT][]. + ENCODING_UNSPECIFIED = 0; + + // Uncompressed 16-bit signed little-endian samples (Linear PCM). + // This encoding includes no header, only the raw audio bytes. + LINEAR16 = 1; + + // [`FLAC`](https://xiph.org/flac/documentation.html) (Free Lossless Audio + // Codec) is the recommended encoding because it is + // lossless--therefore recognition is not compromised--and + // requires only about half the bandwidth of `LINEAR16`. This encoding + // includes the `FLAC` stream header followed by audio data. It supports + // 16-bit and 24-bit samples, however, not all fields in `STREAMINFO` are + // supported. + FLAC = 2; + } + + // *Required* Encoding of audio data sent in all `audio_in` messages. + Encoding encoding = 1; + + // *Required* Sample rate (in Hertz) of the audio data sent in all `audio_in` + // messages. Valid values are from 16000-24000, but 16000 is optimal. + // For best results, set the sampling rate of the audio source to 16000 Hz. + // If that's not possible, use the native sample rate of the audio source + // (instead of re-sampling). + int32 sample_rate_hertz = 2; +} + +// Specifies the desired format for the server to use when it returns +// `audio_out` messages. +message AudioOutConfig { + // Audio encoding of the data returned in the audio message. All encodings are + // raw audio bytes with no header, except as indicated below. + enum Encoding { + // Not specified. Will return result [google.rpc.Code.INVALID_ARGUMENT][]. + ENCODING_UNSPECIFIED = 0; + + // Uncompressed 16-bit signed little-endian samples (Linear PCM). + LINEAR16 = 1; + + // MP3 audio encoding. The sample rate is encoded in the payload. + MP3 = 2; + + // Opus-encoded audio wrapped in an ogg container. The result will be a + // file which can be played natively on Android and in some browsers (such + // as Chrome). The quality of the encoding is considerably higher than MP3 + // while using the same bitrate. The sample rate is encoded in the payload. + OPUS_IN_OGG = 3; + } + + // *Required* The encoding of audio data to be returned in all `audio_out` + // messages. + Encoding encoding = 1; + + // *Required* The sample rate in Hertz of the audio data returned in + // `audio_out` messages. Valid values are: 16000-24000. + int32 sample_rate_hertz = 2; + + // *Required* Current volume setting of the device's audio output. + // Valid values are 1 to 100 (corresponding to 1% to 100%). + int32 volume_percentage = 3; +} + +// Provides information about the current dialog state. +message ConverseState { + // *Required* The `conversation_state` value returned in the prior + // `ConverseResponse`. Omit (do not set the field) if there was no prior + // `ConverseResponse`. If there was a prior `ConverseResponse`, do not omit + // this field; doing so will end that conversation (and this new request will + // start a new conversation). + bytes conversation_state = 1; + + // *Optional* A way to provide context to assist the Assistant. + ConverseContext context = 3; + + // Specifies user is in SIGN_OUT mode. That means user credential is not + // available on the client. Note that client still needs to provide valid + // credentials to do server to server authentication (i.e., service account). + bool is_signed_out_mode = 4; +} + +// The audio containing the Assistant's response to the query. Sequential chunks +// of audio data are received in sequential `ConverseResponse` messages. +message AudioOut { + // *Output-only* The audio data containing the assistant's response to the + // query. Sequential chunks of audio data are received in sequential + // `ConverseResponse` messages. + bytes audio_data = 1; +} + +// The visual containing the Assistant's response to the query. Contains the +// whole visual output. +message ScreenOut { + // Possible formats of the visual data. + enum Format { + // No format specified. + FORMAT_UNSPECIFIED = 0; + + // Data will contain a fully-formed HTML5 layout encoded in UTF-8, e.g. + // "
...
". It is intended to be rendered + // along with the audio response. Note that HTML5 doctype should be included + // in the actual HTML data. + HTML = 1; + } + + // *Output-only* The format of the provided visual data. + Format format = 1; + + // *Output-only* The raw visual data to be displayed as the result of the + // Assistant query. + bytes data = 2; +} + +// The semantic result for the user's spoken query. Multiple of these messages +// could be received, for example one containing the recognized transcript in +// spoken_request_text followed by one containing the semantics of the response, +// i.e. containing the relevant data among conversation_state, microphone_mode, +// and volume_percentage. +message ConverseResult { + // *Output-only* The recognized transcript of what the user said. + string spoken_request_text = 1; + + // *Output-only* The text of the assistant's spoken response. This is only + // returned for an IFTTT action. + string spoken_response_text = 2; + + // *Output-only* State information for subsequent `ConverseRequest`. This + // value should be saved in the client and returned in the + // `conversation_state` with the next `ConverseRequest`. (The client does not + // need to interpret or otherwise use this value.) There is no need to save + // this information across device restarts. + bytes conversation_state = 3; + + // Possible states of the microphone after a `Converse` RPC completes. + enum MicrophoneMode { + // No mode specified. + MICROPHONE_MODE_UNSPECIFIED = 0; + + // The service is not expecting a follow-on question from the user. + // The microphone should remain off until the user re-activates it. + CLOSE_MICROPHONE = 1; + + // The service is expecting a follow-on question from the user. The + // microphone should be re-opened when the `AudioOut` playback completes + // (by starting a new `Converse` RPC call to send the new audio). + DIALOG_FOLLOW_ON = 2; + } + + // *Output-only* Specifies the mode of the microphone after this `Converse` + // RPC is processed. + MicrophoneMode microphone_mode = 4; + + // *Output-only* Updated volume level. The value will be 0 or omitted + // (indicating no change) unless a voice command such as "Increase the volume" + // or "Set volume level 4" was recognized, in which case the value will be + // between 1 and 100 (corresponding to the new volume level of 1% to 100%). + // Typically, a client should use this volume level when playing the + // `audio_out` data, and retain this value as the current volume level and + // supply it in the `AudioOutConfig` of the next `ConverseRequest`. (Some + // clients may also implement other ways to allow the current volume level to + // be changed, for example, by providing a knob that the user can turn.) + int32 volume_percentage = 5; +} + +// The top-level message sent by the client. Clients must send at least two, and +// typically numerous `ConverseRequest` messages. The first message must +// contain a `config` message and must not contain `audio_in` data. All +// subsequent messages must contain `audio_in` data and must not contain a +// `config` message. +message ConverseRequest { + + // Exactly one of these fields must be specified in each `ConverseRequest`. + oneof converse_request { + // The `config` message provides information to the recognizer that + // specifies how to process the request. + // The first `ConverseRequest` message must contain a `config` message. + ConverseConfig config = 1; + + // The audio data to be recognized. Sequential chunks of audio data are sent + // in sequential `ConverseRequest` messages. The first `ConverseRequest` + // message must not contain `audio_in` data and all subsequent + // `ConverseRequest` messages must contain `audio_in` data. The audio bytes + // must be encoded as specified in `AudioInConfig`. + // Audio must be sent at approximately real-time (16000 samples per second). + // An error will be returned if audio is sent significantly faster or + // slower. + bytes audio_in = 2; + } +} + +// The top-level message received by the client. A series of one or more +// `ConverseResponse` messages are streamed back to the client. +message ConverseResponse { + // Indicates the type of event. + enum EventType { + // No event specified. + EVENT_TYPE_UNSPECIFIED = 0; + + // This event indicates that the server has detected the end of the user's + // speech utterance and expects no additional speech. Therefore, the server + // will not process additional audio (although it may subsequently return + // additional results). The client should stop sending additional audio + // data, half-close the gRPC connection, and wait for any additional results + // until the server closes the gRPC connection. + END_OF_UTTERANCE = 1; + } + + // Exactly one of these fields will be populated in each `ConverseResponse`. + oneof converse_response { + // *Output-only* If set, returns a [google.rpc.Status][] message that + // specifies the error for the operation. + // If an error occurs during processing, this message will be set and there + // will be no further messages sent. + google.rpc.Status error = 1; + + // *Output-only* Indicates the type of event. + EventType event_type = 2; + + // *Output-only* The audio containing the Assistant's response to the query. + AudioOut audio_out = 3; + + // *Output-only* The visual containing the Assistant's response to the + // query. + ScreenOut screen_out = 8; + + // *Output-only* Contains the action triggered by the query with the + // appropriate payloads and semantic parsing. + DeviceAction device_action = 9; + + // *Output-only* The interim recognition result that corresponds to the + // audio currently being processed. The text returned is purely + // informational and will not be issued as commands to the Assistant. Once + // the user's spoken query has been fully recognized, the final complete + // utterance issued to the Assistant is returned in 'spoken_request_text' in + // [ConverseResult](google.assistant.embedded.v1alpha1.ConverseResult) + InterimSpokenRequestText interim_spoken_request_text = 6; + + // *Output-only* The final semantic result for the user's spoken query. + ConverseResult result = 5; + } +} + +// The interim speech recognition text as the user is speaking. Contains the +// estimated transcription of what the user has spoken thus far from the input +// audio. It can be used to display the current guess of the user's query. +message InterimSpokenRequestText { + // *Output-only* Transcript text representing the words that the user spoke. + string transcript = 1; + + // *Output-only* An estimate of the likelihood that the Assistant will not + // change its guess about this result. Values range from 0.0 (completely + // unstable) to 1.0 (completely stable). The default of 0.0 is a sentinel + // value indicating `stability` was not set. + double stability = 2; +} + +// The identification information for devices integrated with the Assistant. +// These fields should be populated for any queries sent from 3P devices. +message DeviceConfig { + // *Required* Unique identifier for the device. Example: DBCDW098234. This + // MUST match the device_id returned from device registration. This device_id + // is used matched against the user's registered devices to lookup the + // supported traits and capabilities of this device. + string device_id = 1; + + // *Optional* The model of this device as registered in the Device Model + // Registration API. This is only required for syndication partners. + string device_model_id = 3; +} + +// Context provided to the Assistant to enhance its capabilities for the +// Converse API. +message ConverseContext { + // *Optional* A list of strings containing words and phrases "hints" so that + // the speech recognition is more likely to recognize them. This can be used + // to improve the accuracy for specific words and phrases, such as words + // or commands that the user is likely to say (for example, choices displayed + // on-screen). + repeated string hinted_phrases = 1; + + // *Optional* Custom context from the device passed along to 3P fulfillment + // service. This can provide information about the device's current state. + // This data is opaque to the Assistant and is defined by the 3P provider, + // such as a JSON string or binary data. For passing binary data, the data + // should be base64 encoded. + string third_party_context = 2; +} + +// The response returned to the device if any 3P Custom Device Grammar is +// triggered. The 3P Custom Device Grammar is enabled through the specific +// [DeviceConfig](google.assistant.embedded.v1alpha1.DeviceConfig) provided by +// this device, and should be handled appropriately. For example, a 3P device +// which supports the customized query "do a dance" would receive a DeviceAction +// with action_type: "device_control" and a JSON payload containing the +// semantics of the request. +message DeviceAction { + // The type of action to be executed on the device. + enum ActionType { + // Unknown action type. + ACTION_TYPE_UNSPECIFIED = 0; + + // 3P custom device action. + DEVICE_CONTROL = 1; + } + + // What type of action this DeviceAction contains. + ActionType action_type = 1; + + // JSON containing the device control response generated from the triggered 3P + // Custom Device Grammar. The format is given by the [action.devices.EXECUTE]( + // https://developers.google.com/actions/smarthome/create-app#actiondevicesexecute) + // request type. + string device_control_json = 2; +} diff --git a/get_credentials.sh b/get_credentials.sh new file mode 100755 index 0000000..b196129 --- /dev/null +++ b/get_credentials.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# +# 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 +# +# https://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. +# + +# The input of this file is client_secret json file. Please download it to this folder and rename it to client_secret.json +# If succeeded, it will output credentials.json, which can be used with run_assistant. + +CLIENT_SECRET_FILE="client_secret.json" +if ! [ -f $CLIENT_SECRET_FILE ] ; then + echo "Please download client_secret json file to this folder, and change its name to '$CLIENT_SECRET_FILE'." + exit 1 +fi + +CLIENT_ID=`cat $CLIENT_SECRET_FILE | grep -o -e '"client_id":"[^"]*"' | sed -e 's/.*"client_id":"\([^"]*\)".*/\1/g'` +if [ -z $CLIENT_ID ]; then + echo "No client_id found in client secret file $CLIENT_SECRET_FILE. Exiting." + exit 1 +fi +echo "Client id: $CLIENT_ID" +CLIENT_SECRET=`cat $CLIENT_SECRET_FILE | grep -o -e '"client_secret":"[^"]*"' | sed -e 's/.*"client_secret":"\([^"]*\)".*/\1/g'` +if [ -z $CLIENT_SECRET ]; then + echo "No client_secret found in client secret file $CLIENT_SECRET_FILE. Exiting." + exit 1 +fi +echo "Client secret: $CLIENT_SECRET" +echo "" + +echo "Please go to the following link to authorize, and copy back the code here:" +echo "https://accounts.google.com/o/oauth2/v2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fassistant-sdk-prototype&access_type=offline&include_granted_scopes=true&state=state&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=$CLIENT_ID" +echo "" +echo -n "Code: " +read CODE + +CREDENTIALS_FILE="credentials.json" +curl -s -X POST -d 'code='$CODE'&client_id='$CLIENT_ID'&client_secret='$CLIENT_SECRET'&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code' https://www.googleapis.com/oauth2/v4/token -o $CREDENTIALS_FILE +REFRESH_TOKEN=`cat $CREDENTIALS_FILE | grep -o -e '"refresh_token": "[^"]*"' | sed -e 's/"refresh_token": "\([^"]*\)"/\1/g'` +if [ -z $REFRESH_TOKEN ]; then + echo "Failed to get refresh token. Exiting. OAuth server response:" + cat $CREDENTIALS_FILE + exit 1 +fi + +cat < $CREDENTIALS_FILE +{ + "client_id": "$CLIENT_ID", + "client_secret": "$CLIENT_SECRET", + "refresh_token": "$REFRESH_TOKEN", + "type": "authorized_user" +} +EOF +echo "" +echo "$CREDENTIALS_FILE is ready for use :-)" diff --git a/json_util.cc b/json_util.cc new file mode 100644 index 0000000..b6e102c --- /dev/null +++ b/json_util.cc @@ -0,0 +1,105 @@ +/* +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 + + https://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. +*/ + +#include "json_util.h" +#include "scope_exit.h" + +extern "C" { +#include +} + +#include +#include + +grpc_json* GetJsonValueOrNullFromDict(grpc_json* dict_node, const char* key) { + if (dict_node->type != GRPC_JSON_OBJECT) { + return nullptr; + } + + grpc_json* child = dict_node->child; + while (child != nullptr) { + if (child->key != nullptr && strcmp(child->key, key) == 0) { + return child; + } + child = child->next; + } + return nullptr; +} + +grpc_json* GetJsonValueOrNullFromArray(grpc_json* array_node, int index) { + if (array_node->type != GRPC_JSON_ARRAY) { + return nullptr; + } + + grpc_json* child = array_node->child; + while (child != nullptr && index != 0) { + child = child->next; + index--; + } + return child; +} + +std::unique_ptr GetCustomResponseOrNull( + const std::string& device_control_request_json) { + if (device_control_request_json.length() == 0) { + return nullptr; + } + std::unique_ptr s(new char[device_control_request_json.length()]); + memcpy(s.get(), device_control_request_json.c_str(), + device_control_request_json.length()); + grpc_json* json = grpc_json_parse_string_with_len(s.get(), + device_control_request_json.length()); + if (json == nullptr) { + std::cerr << "Failed to parse json string: \"" + << device_control_request_json << "\"" << std::endl; + return nullptr; + } + ScopeExit destroy_json([json]() { + grpc_json_destroy(json); + }); + +#define RETURN_NULLPTR_IF_NULLPTR(var) if (var == nullptr) { return nullptr; } + grpc_json* inputsArray = GetJsonValueOrNullFromDict(json, "inputs"); + RETURN_NULLPTR_IF_NULLPTR(inputsArray); + grpc_json* input = GetJsonValueOrNullFromArray(inputsArray, 0); + RETURN_NULLPTR_IF_NULLPTR(input); + + grpc_json* payload = GetJsonValueOrNullFromDict(input, "payload"); + RETURN_NULLPTR_IF_NULLPTR(payload); + + grpc_json* commandsArray = GetJsonValueOrNullFromDict(payload, "commands"); + RETURN_NULLPTR_IF_NULLPTR(commandsArray); + grpc_json* command = GetJsonValueOrNullFromArray(commandsArray, 0); + RETURN_NULLPTR_IF_NULLPTR(command); + + grpc_json* executionsArray = GetJsonValueOrNullFromDict(command, "execution"); + RETURN_NULLPTR_IF_NULLPTR(executionsArray); + grpc_json* execution = GetJsonValueOrNullFromArray(executionsArray, 0); + RETURN_NULLPTR_IF_NULLPTR(execution); + + grpc_json* params = GetJsonValueOrNullFromDict(execution, "params"); + RETURN_NULLPTR_IF_NULLPTR(params); + + grpc_json* custom_response = GetJsonValueOrNullFromDict(params, "customResponse"); + RETURN_NULLPTR_IF_NULLPTR(custom_response); +#undef RETURN_NULLPTR_IF_NULLPTR + if (custom_response && custom_response->type == GRPC_JSON_STRING) { + return std::unique_ptr( + new std::string(custom_response->value)); + } + + return nullptr; +} diff --git a/json_util.h b/json_util.h new file mode 100644 index 0000000..cd80b5a --- /dev/null +++ b/json_util.h @@ -0,0 +1,48 @@ +/* +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 + + https://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. +*/ + +#ifndef JSON_UTIL_H +#define JSON_UTIL_H + +#include +#include + +/* Extracts "customResponse" field from json string. E.g. + { + "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", + "inputs": [{ + "intent": "action.devices.EXECUTE", + "payload": { + "commands": [{ + "devices": [{ + "id": "12345" + }], + "execution": [{ + "command": "action.devices.commands.Custom", + "params": { + "customResponse": "CUSTOM RESPONSE FROM 3P OEM CLOUD" + } + }] + }] + } + }] + } + Should output "CUSTOM RESPONSE FROM 3P OEM CLOUD". + */ +std::unique_ptr GetCustomResponseOrNull( + const std::string& device_control_request_json); + +#endif diff --git a/json_util_test.cc b/json_util_test.cc new file mode 100644 index 0000000..7ac81a1 --- /dev/null +++ b/json_util_test.cc @@ -0,0 +1,71 @@ +/* +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 + + https://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. +*/ + +#include "json_util.h" + +#include + +bool check_result(const std::string& input_json, + std::unique_ptr intended_result) { + std::unique_ptr result = GetCustomResponseOrNull(input_json); + return (intended_result == nullptr && result == nullptr) + || (intended_result != nullptr && result != nullptr + && *intended_result == *result); +} + +int main() { + std::string invalid_json = ""; + std::unique_ptr intended_result(nullptr); + if (!check_result(invalid_json, std::move(intended_result))) { + std::cerr << "Test failed for invalid JSON" << std::endl; + return 1; + } + + std::string incomplete_json = "{}"; + intended_result.reset(nullptr); + if (!check_result(incomplete_json, std::move(intended_result))) { + std::cerr << "Test failed for incomplete JSON" << std::endl; + return 1; + } + + std::string valid_json = R"({ + "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", + "inputs": [{ + "intent": "action.devices.EXECUTE", + "payload": { + "commands": [{ + "devices": [{ + "id": "12345" + }], + "execution": [{ + "command": "action.devices.commands.Custom", + "params": { + "customResponse": "CUSTOM RESPONSE FROM 3P OEM CLOUD" + } + }] + }] + } + }] + })"; + intended_result.reset( + new std::string("CUSTOM RESPONSE FROM 3P OEM CLOUD")); + if (!check_result(valid_json, std::move(intended_result))) { + std::cerr << "Test failed for valid JSON" << std::endl; + return 1; + } + + std::cerr << "Test passed" << std::endl; +} diff --git a/resources/switch_to_channel_5.raw b/resources/switch_to_channel_5.raw new file mode 100644 index 0000000000000000000000000000000000000000..af52c0539576d30bc25ba3ea9e276e99ec59cdd9 GIT binary patch literal 160000 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
U^mn2i3 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

UJg8wpi~J-iM! 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 I0>dc;0OTBLH2?qr literal 0 HcmV?d00001 diff --git a/run_assistant.cc b/run_assistant.cc new file mode 100644 index 0000000..81935c3 --- /dev/null +++ b/run_assistant.cc @@ -0,0 +1,298 @@ +/* +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 + + https://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. +*/ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __linux__ +#define ENABLE_ALSA +#endif + +#ifdef ENABLE_ALSA +#include "audio_input_alsa.h" +#include "audio_output_alsa.h" +#endif + +#include "embedded_assistant.pb.h" +#include "embedded_assistant.grpc.pb.h" + +#include "assistant_config.h" +#include "audio_input.h" +#include "audio_input_file.h" +#include "json_util.h" +#include "service_account_util.h" + +using google::assistant::embedded::v1alpha1::EmbeddedAssistant; +using google::assistant::embedded::v1alpha1::ConverseRequest; +using google::assistant::embedded::v1alpha1::ConverseResponse; +using google::assistant::embedded::v1alpha1::AudioInConfig; +using google::assistant::embedded::v1alpha1::AudioOutConfig; +using google::assistant::embedded::v1alpha1::DeviceConfig; +using google::assistant::embedded::v1alpha1::ConverseResponse_EventType_END_OF_UTTERANCE; + +using grpc::CallCredentials; +using grpc::Channel; +using grpc::ClientReaderWriter; + +static const std::string kCredentialsTypeUserAccount = "USER_ACCOUNT"; +static const std::string kCredentialsTypeServiceAccount = "SERVICE_ACCOUNT"; +static const std::string kALSAAudioInput = "ALSA_INPUT"; + +// Creates a channel to be connected to Google. +std::shared_ptr CreateChannel(const std::string& host) { + std::ifstream file("robots.pem"); + std::stringstream buffer; + buffer << file.rdbuf(); + std::string roots_pem = buffer.str(); + + std::cout << "assistant_sdk robots_pem: " << roots_pem << std::endl; + ::grpc::SslCredentialsOptions ssl_opts = {roots_pem, "", ""}; + auto creds = ::grpc::SslCredentials(ssl_opts); + std::string server = host + ":443"; + std::cout << "assistant_sdk CreateCustomChannel(" << server << ", creds, arg)" + + << std::endl << std::endl; + ::grpc::ChannelArguments channel_args; + return CreateCustomChannel(server, creds, channel_args); +} + +void PrintUsage() { + std::cerr << "Usage: ./run_assistant " + << "--audio_input <" << kALSAAudioInput << "|] " + << "--credentials_file " + << "--credentials_type <" << kCredentialsTypeUserAccount << "|" + << kCredentialsTypeServiceAccount << "> " + << "[--api_endpoint ]" << std::endl; +} + +bool GetCommandLineFlags( + int argc, char** argv, std::string* audio_input, + std::string* credentials_file_path, std::string* credentials_type, + std::string* api_endpoint) { + const struct option long_options[] = { + {"audio_input", required_argument, nullptr, 'i'}, + {"credentials_file", required_argument, nullptr, 'f'}, + {"credentials_type", required_argument, nullptr, 't'}, + {"api_endpoint", required_argument, nullptr, 'e'}, + {nullptr, 0, nullptr, 0} + }; + *api_endpoint = ASSISTANT_ENDPOINT; + while (true) { + int option_index; + int option_char = + getopt_long(argc, argv, "i:f:t:e", long_options, &option_index); + if (option_char == -1) { + break; + } + switch (option_char) { + case 'i': + *audio_input = optarg; + break; + case 'f': + *credentials_file_path = optarg; + break; + case 't': + *credentials_type = optarg; + if (*credentials_type != kCredentialsTypeUserAccount + && *credentials_type != kCredentialsTypeServiceAccount) { + std::cerr << "Invalid credentials_type: \"" << *credentials_type + << "\". Should be \"" << kCredentialsTypeUserAccount + << "\" or \"" << kCredentialsTypeServiceAccount << "\"" + << std::endl; + return false; + } + break; + case 'e': + *api_endpoint = optarg; + break; + default: + PrintUsage(); + return false; + } + } + return true; +} + +int main(int argc, char** argv) { + std::string audio_input_source, credentials_file_path, credentials_type, + api_endpoint; + if (!GetCommandLineFlags(argc, argv, &audio_input_source, + &credentials_file_path, &credentials_type, + &api_endpoint)) { + return -1; + } + + std::unique_ptr audio_input; + if (audio_input_source == kALSAAudioInput) { +#ifdef ENABLE_ALSA + audio_input.reset(new AudioInputALSA()); +#else + std::cerr << "ALSA audio input is not supported on this platform." + << std::endl; + return -1; +#endif + } else { + std::ifstream audio_file(audio_input_source); + if (!audio_file) { + std::cerr << "Audio input file \"" << audio_input_source + << "\" does not exist." << std::endl; + return -1; + } + audio_input.reset(new AudioInputFile(audio_input_source)); + } + + // Read credentials file. + std::ifstream credentials_file(credentials_file_path); + if (!credentials_file) { + std::cerr << "Credentials file \"" << credentials_file_path + << "\" does not exist." << std::endl; + return -1; + } + std::stringstream credentials_buffer; + credentials_buffer << credentials_file.rdbuf(); + std::string credentials = credentials_buffer.str(); + std::shared_ptr call_credentials; + if (credentials_type == kCredentialsTypeServiceAccount) { + call_credentials = GetServiceAccountCredentialsOrNull(credentials); + } else { + call_credentials = grpc::GoogleRefreshTokenCredentials(credentials); + } + if (call_credentials.get() == nullptr) { + std::cerr << "Credentials file \"" << credentials_file_path + << "\" is invalid. Check step 5 in README for how to get valid " + << "credentials." << std::endl; + return -1; + } + + auto channel = CreateChannel(api_endpoint); + std::unique_ptr assistant( + EmbeddedAssistant::NewStub(channel)); + + ConverseRequest request; + auto* converse_config = request.mutable_config(); + converse_config->mutable_audio_in_config()->set_encoding( + AudioInConfig::LINEAR16); + converse_config->mutable_audio_in_config()->set_sample_rate_hertz(16000); + converse_config->mutable_audio_out_config()->set_encoding( + AudioOutConfig::LINEAR16); + converse_config->mutable_audio_out_config()->set_sample_rate_hertz(16000); + if (credentials_type == kCredentialsTypeServiceAccount) { + converse_config->mutable_converse_state()->set_is_signed_out_mode(true); + } + + // Construct Device Config. + // CUSTOMIZE: set your device_id, device_model_id and custom_context here. + DeviceConfig* config = converse_config->mutable_device_config(); + config->set_device_id("assistant-sdk-fake-device-id"); + config->set_device_model_id("my-sample-smart-tv-2017-v1"); + + auto* converse_context = + converse_config->mutable_converse_state()->mutable_context(); + converse_context->set_third_party_context("{'current_channel': 'News'}"); + + // Begin a stream. + grpc::ClientContext context; + context.set_fail_fast(false); + context.set_credentials(call_credentials); + + std::shared_ptr> + stream(std::move(assistant->Converse(&context))); + // Write config in first stream. + std::cout << "assistant_sdk wrote first request: " + << request.ShortDebugString() << std::endl; + stream->Write(request); + +#ifdef ENABLE_ALSA + AudioOutputALSA audio_output; + audio_output.Start(); +#endif + + audio_input->AddDataListener( + [stream, &request](std::shared_ptr> data) { + request.set_audio_in(&((*data)[0]), data->size()); + stream->Write(request); + }); + audio_input->AddStopListener([stream]() { + stream->WritesDone(); + }); + audio_input->Start(); + + // Read responses. + std::cout << "assistant_sdk waiting for response ... " << std::endl; + ConverseResponse response; + while (stream->Read(&response)) { // Returns false when no more to read. + std::cout << "assistant_sdk Got a response \n"; + + if ((response.has_error() || response.has_audio_out() || + response.event_type() == ConverseResponse_EventType_END_OF_UTTERANCE) + && audio_input->IsRunning()) { + // Synchronously stops audio input. + audio_input->Stop(); + } + + if (response.has_audio_out()) { + // CUSTOMIZE: play back audio_out here. + std::cout << "assistant_sdk play back audio data here." << std::endl; +#ifdef ENABLE_ALSA + std::shared_ptr> + data(new std::vector); + data->resize(response.audio_out().audio_data().length()); + memcpy(&((*data)[0]), response.audio_out().audio_data().c_str(), + response.audio_out().audio_data().length()); + audio_output.Send(data); +#endif + } + if (response.has_interim_spoken_request_text()) { + // CUSTOMIZE: render interim spoken request on screen + std::cout << "assistant_sdk response: \n" + << response.ShortDebugString() << std::endl; + } + if (response.has_device_action()) { + std::cout << "\n\nassistant_sdk device_control_json: \n" + << response.device_action().device_control_json() + << "\n\naction_type: \n" + << response.device_action().action_type() + << std::endl; + + // CUSTOMIZE: Consume device_control_request_json here, extract the + // command and custom_response and do client execution here. + } + } + +#ifdef ENABLE_ALSA + audio_output.Stop(); +#endif + + grpc::Status status = stream->Finish(); + if (!status.ok()) { + // Report the RPC failure. + std::cerr << "assistant_sdk failed, error: " << + status.error_message() << std::endl; + return -1; + } + return 0; +} diff --git a/scope_exit.h b/scope_exit.h new file mode 100644 index 0000000..37a8987 --- /dev/null +++ b/scope_exit.h @@ -0,0 +1,31 @@ +/* +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 + + https://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. +*/ + +#ifndef SCOPE_EXIT_H +#define SCOPE_EXIT_H + +#include + +class ScopeExit { + public: + ScopeExit(std::function f): f_(f) {} + ~ScopeExit() { f_(); } + + private: + std::function f_; +}; + +#endif diff --git a/service_account_util.cc b/service_account_util.cc new file mode 100644 index 0000000..8daed35 --- /dev/null +++ b/service_account_util.cc @@ -0,0 +1,101 @@ +/* +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 + + https://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. +*/ + +#include "service_account_util.h" + +#include "scope_exit.h" + +extern "C" { +#include +#include +#include +} + +#include + +static const int kAccessTokenExpirationTimeInSeconds = 3600; + +size_t write_data(void* ptr, size_t size, size_t nmemb, void* s) { + std::string* str = (std::string*) s; + size_t old_length = str->length(); + str->resize(old_length + size * nmemb); + memcpy((void*)(str->c_str() + old_length), ptr, size * nmemb); + return size * nmemb; +} + +std::shared_ptr GetServiceAccountCredentialsOrNull( + const std::string& service_account_json) { + grpc_auth_json_key json_key = grpc_auth_json_key_create_from_string( + service_account_json.c_str()); + ScopeExit destroy_json_key([&json_key]() { + grpc_auth_json_key_destruct(&json_key); + }); + if (!grpc_auth_json_key_is_valid(&json_key)) { + std::cerr << "Failed to parse service account json." << std::endl; + return nullptr; + } + + gpr_timespec token_lifetime = gpr_time_from_seconds( + kAccessTokenExpirationTimeInSeconds, GPR_TIMESPAN); + char* jwt = grpc_jwt_encode_and_sign( + &json_key, "https://www.googleapis.com/oauth2/v4/token", token_lifetime, + "https://www.googleapis.com/auth/assistant-sdk-prototype"); + if (jwt == nullptr) { + std::cerr << "Failed to sign access token request." << std::endl; + return nullptr; + } + std::string curl_data = + R"(grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=)" + std::string(jwt); + + std::string response; + CURL *hnd = curl_easy_init(); + if (hnd == nullptr) { + std::cerr << "curl_easy_init() returned null" << std::endl; + return nullptr; + } + curl_easy_setopt(hnd, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token"); + curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, curl_data.c_str()); + curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(hnd, CURLOPT_WRITEDATA, &response); + CURLcode ret = curl_easy_perform(hnd); + ScopeExit destroy_curl([hnd]() { + curl_easy_cleanup(hnd); + }); + if (ret != CURLE_OK) { + std::cerr << "curl_easy_perform() returned " << ret << std::endl; + return nullptr; + } + if (response.length() == 0) { + return nullptr; + } + + std::unique_ptr s(new char[response.length()]); + memcpy(s.get(), response.c_str(), response.length()); + grpc_json* json = grpc_json_parse_string_with_len(s.get(), response.length()); + if (json == nullptr) { + std::cerr << "Failed to parse response: \"" << response << "\"" << std::endl; + return nullptr; + } + ScopeExit destroy_json([json]() { + grpc_json_destroy(json); + }); + const char* access_token = grpc_json_get_string_property(json, "access_token"); + if (access_token == nullptr) { + std::cerr << "No access_token in response: \"" << response << "\"" << std::endl; + return nullptr; + } + return grpc::AccessTokenCredentials(std::string(access_token)); +} diff --git a/service_account_util.h b/service_account_util.h new file mode 100644 index 0000000..1270f40 --- /dev/null +++ b/service_account_util.h @@ -0,0 +1,29 @@ +/* +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 + + https://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. +*/ + +#ifndef SERVICE_ACCOUNT_UTIL_H +#define SERVICE_ACCOUNT_UTIL_H + +#include + +#include + +// Generates usable credentials from service account JSON file. +// Returns nullptr if failed. +std::shared_ptr GetServiceAccountCredentialsOrNull( + const std::string& service_account_json); + +#endif \ No newline at end of file