diff --git a/examples/cloud_services/google_translate_device/main/google_sr.c b/examples/cloud_services/google_translate_device/main/google_sr.c index b50f164b6..e78b5b2a0 100644 --- a/examples/cloud_services/google_translate_device/main/google_sr.c +++ b/examples/cloud_services/google_translate_device/main/google_sr.c @@ -224,6 +224,9 @@ google_sr_handle_t google_sr_init(google_sr_config_t *config) i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT(); i2s_cfg.type = AUDIO_STREAM_READER; + i2s_cfg.std_cfg.slot_cfg.slot_mode = I2S_SLOT_MODE_MONO; + i2s_stream_set_channel_type(&i2s_cfg, I2S_CHANNEL_TYPE_ONLY_RIGHT); + i2s_cfg.std_cfg.clk_cfg.sample_rate_hz = config->record_sample_rates; sr->i2s_reader = i2s_stream_init(&i2s_cfg); http_stream_cfg_t http_cfg = { diff --git a/examples/cloud_services/google_translate_device/main/google_tts.c b/examples/cloud_services/google_translate_device/main/google_tts.c index 1cb4b79c6..28c24a92e 100644 --- a/examples/cloud_services/google_translate_device/main/google_tts.c +++ b/examples/cloud_services/google_translate_device/main/google_tts.c @@ -49,7 +49,7 @@ static const char *TAG = "GOOGLE_TTS"; #define GOOGLE_TTS_ENDPOINT "https://texttospeech.googleapis.com/v1beta1/text:synthesize?key=%s" #define GOOGLE_TTS_TEMPLATE "{"\ "\"audioConfig\": { \"audioEncoding\" : \"MP3\", \"sampleRateHertz\": %d },"\ - "\"voice\": { \"languageCode\" : \"%s\" },"\ + "\"voice\": { \"languageCode\" : \"%s\", \"name\" : \"%s\" },"\ "\"input\": { \"text\" : \"%s\" }"\ "}" #define GOOGLE_TTS_TASK_STACK (8*1024) @@ -61,6 +61,7 @@ typedef struct google_tts { audio_element_handle_t mp3_decoder; char *api_key; char *lang_code; + char *voice_name; int buffer_size; char *buffer; char *text; @@ -83,7 +84,7 @@ static esp_err_t _http_stream_reader_event_handle(http_stream_event_msg_t *msg) ESP_LOGI(TAG, "[ + ] HTTP client HTTP_STREAM_PRE_REQUEST, length=%d", msg->buffer_len); tts->tts_total_read = 0; tts->is_begin = true; - int payload_len = snprintf(tts->buffer, tts->buffer_size, GOOGLE_TTS_TEMPLATE, tts->sample_rate, tts->lang_code, tts->text); + int payload_len = snprintf(tts->buffer, tts->buffer_size, GOOGLE_TTS_TEMPLATE, tts->sample_rate, tts->lang_code, tts->voice_name, tts->text); esp_http_client_set_post_field(http, tts->buffer, payload_len); esp_http_client_set_method(http, HTTP_METHOD_POST); esp_http_client_set_header(http, "Content-Type", "application/json"); @@ -235,7 +236,7 @@ bool google_tts_check_event_finish(google_tts_handle_t tts, audio_event_iface_ms } -esp_err_t google_tts_start(google_tts_handle_t tts, const char *text, const char *lang_code) +esp_err_t google_tts_start(google_tts_handle_t tts, const char *text, const char *lang_code, const char *voice_name) { free(tts->lang_code); free(tts->text); @@ -244,6 +245,12 @@ esp_err_t google_tts_start(google_tts_handle_t tts, const char *text, const char ESP_LOGE(TAG, "Error no mem"); return ESP_ERR_NO_MEM; } + free(tts->voice_name); + tts->voice_name = strdup(voice_name); + if (tts->voice_name == NULL) { + ESP_LOGE(TAG, "Error no mem"); + return ESP_ERR_NO_MEM; + } tts->text = strdup(text); if (tts->text == NULL) { free(tts->lang_code); diff --git a/examples/cloud_services/google_translate_device/main/google_tts.h b/examples/cloud_services/google_translate_device/main/google_tts.h index 58898d919..8c7ef707c 100644 --- a/examples/cloud_services/google_translate_device/main/google_tts.h +++ b/examples/cloud_services/google_translate_device/main/google_tts.h @@ -63,7 +63,7 @@ google_tts_handle_t google_tts_init(google_tts_config_t *config); * - ESP_OK * - ESP_FAIL */ -esp_err_t google_tts_start(google_tts_handle_t tts, const char *text, const char *lang_code); +esp_err_t google_tts_start(google_tts_handle_t tts, const char *text, const char *lang_code, const char *voice_name); /** * @brief Stop playing audio from Google Cloud Text-to-Speech diff --git a/examples/cloud_services/google_translate_device/main/translate_device_example.c b/examples/cloud_services/google_translate_device/main/translate_device_example.c index b74ae2a75..4eb7afb5c 100644 --- a/examples/cloud_services/google_translate_device/main/translate_device_example.c +++ b/examples/cloud_services/google_translate_device/main/translate_device_example.c @@ -20,13 +20,13 @@ #include "audio_common.h" #include "board.h" #include "esp_peripherals.h" +#include "periph_adc_button.h" #include "periph_button.h" #include "periph_wifi.h" #include "periph_led.h" #include "google_tts.h" #include "google_sr.h" #include "google_translate.h" -#include "board.h" #include "audio_idf_version.h" @@ -41,7 +41,8 @@ static const char *TAG = "GOOGLE_TRANSLATION_EXAMPLE"; #define GOOGLE_SR_LANG "cmn-Hans-CN" // https://cloud.google.com/speech-to-text/docs/languages #define GOOGLE_TRANSLATE_LANG_FROM "zh-CN" //https://cloud.google.com/translate/docs/languages #define GOOGLE_TRANSLATE_LANG_TO "en" //https://cloud.google.com/translate/docs/languages -#define GOOGLE_TTS_LANG "en-US-Wavenet-D" //https://cloud.google.com/text-to-speech/docs/voices +#define GOOGLE_TTS_LANG_CODE "en-US" //https://cloud.google.com/text-to-speech/docs/voices +#define GOOGLE_TTS_VOICE_NAME "en-US-Wavenet-D" //https://cloud.google.com/text-to-speech/docs/voices #define EXAMPLE_RECORD_PLAYBACK_SAMPLE_RATE (16000) @@ -81,10 +82,7 @@ void translate_task(void *pv) esp_periph_handle_t wifi_handle = periph_wifi_init(&wifi_cfg); // Initialize Button peripheral - periph_button_cfg_t btn_cfg = { - .gpio_mask = (1ULL << get_input_mode_id()) | (1ULL << get_input_rec_id()), - }; - esp_periph_handle_t button_handle = periph_button_init(&btn_cfg); + audio_board_key_init(set); periph_led_cfg_t led_cfg = { .led_speed_mode = LEDC_LOW_SPEED_MODE, @@ -94,9 +92,7 @@ void translate_task(void *pv) }; led_handle = periph_led_init(&led_cfg); - // Start wifi & button peripheral - esp_periph_start(set, button_handle); esp_periph_start(set, wifi_handle); esp_periph_start(set, led_handle); @@ -112,12 +108,14 @@ void translate_task(void *pv) .record_sample_rates = EXAMPLE_RECORD_PLAYBACK_SAMPLE_RATE, .encoding = ENCODING_LINEAR16, .on_begin = google_sr_begin, + .buffer_size = 6144, }; google_sr_handle_t sr = google_sr_init(&sr_config); google_tts_config_t tts_config = { .api_key = CONFIG_GOOGLE_API_KEY, .playback_sample_rate = EXAMPLE_RECORD_PLAYBACK_SAMPLE_RATE, + .buffer_size = 6144, }; google_tts_handle_t tts = google_tts_init(&tts_config); @@ -149,7 +147,7 @@ void translate_task(void *pv) continue; } - if (msg.source_type != PERIPH_ID_BUTTON) { + if (msg.source_type != PERIPH_ID_BUTTON && msg.source_type != PERIPH_ID_ADC_BTN) { continue; } @@ -162,27 +160,52 @@ void translate_task(void *pv) continue; } - if (msg.cmd == PERIPH_BUTTON_PRESSED) { - google_tts_stop(tts); - ESP_LOGI(TAG, "[ * ] Resuming pipeline"); - google_sr_start(sr); - } else if (msg.cmd == PERIPH_BUTTON_RELEASE || msg.cmd == PERIPH_BUTTON_LONG_RELEASE) { - ESP_LOGI(TAG, "[ * ] Stop pipeline"); - - periph_led_stop(led_handle, get_green_led_gpio()); - - char *original_text = google_sr_stop(sr); - if (original_text == NULL) { - continue; + if(msg.source_type == PERIPH_ID_BUTTON){ + if (msg.cmd == PERIPH_BUTTON_PRESSED) { + google_tts_stop(tts); + ESP_LOGI(TAG, "[ * ] Resuming pipeline"); + google_sr_start(sr); + } else if (msg.cmd == PERIPH_BUTTON_RELEASE || msg.cmd == PERIPH_BUTTON_LONG_RELEASE) { + ESP_LOGI(TAG, "[ * ] Stop pipeline"); + + periph_led_stop(led_handle, get_green_led_gpio()); + + char *original_text = google_sr_stop(sr); + if (original_text == NULL) { + continue; + } + ESP_LOGI(TAG, "Original text = %s", original_text); + char *translated_text = google_translate(original_text, GOOGLE_TRANSLATE_LANG_FROM, GOOGLE_TRANSLATE_LANG_TO, CONFIG_GOOGLE_API_KEY); + if (translated_text == NULL) { + continue; + } + ESP_LOGI(TAG, "Translated text = %s", translated_text); + google_tts_start(tts, translated_text, GOOGLE_TTS_LANG_CODE, GOOGLE_TTS_VOICE_NAME); } - ESP_LOGI(TAG, "Original text = %s", original_text); - char *translated_text = google_translate(original_text, GOOGLE_TRANSLATE_LANG_FROM, GOOGLE_TRANSLATE_LANG_TO, CONFIG_GOOGLE_API_KEY); - if (translated_text == NULL) { - continue; + } else if(msg.source_type == PERIPH_ID_ADC_BTN){ + if (msg.cmd == PERIPH_ADC_BUTTON_PRESSED) { + google_tts_stop(tts); + ESP_LOGI(TAG, "[ * ] Resuming pipeline"); + google_sr_start(sr); + } else if (msg.cmd == PERIPH_ADC_BUTTON_RELEASE || msg.cmd == PERIPH_ADC_BUTTON_LONG_RELEASE) { + ESP_LOGI(TAG, "[ * ] Stop pipeline"); + + periph_led_stop(led_handle, get_green_led_gpio()); + + char *original_text = google_sr_stop(sr); + if (original_text == NULL) { + continue; + } + ESP_LOGI(TAG, "Original text = %s", original_text); + char *translated_text = google_translate(original_text, GOOGLE_TRANSLATE_LANG_FROM, GOOGLE_TRANSLATE_LANG_TO, CONFIG_GOOGLE_API_KEY); + if (translated_text == NULL) { + continue; + } + ESP_LOGI(TAG, "Translated text = %s", translated_text); + google_tts_start(tts, translated_text, GOOGLE_TTS_LANG_CODE, GOOGLE_TTS_VOICE_NAME); } - ESP_LOGI(TAG, "Translated text = %s", translated_text); - google_tts_start(tts, translated_text, GOOGLE_TTS_LANG); } + } ESP_LOGI(TAG, "[ 6 ] Stop audio_pipeline"); diff --git a/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.c b/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.c index 76be172b4..5cae98386 100644 --- a/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.c +++ b/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.c @@ -1,19 +1,19 @@ -/*This is tone file*/ - -const char* tone_uri[] = { - "flash://tone/0_Bt_Reconnect.mp3", - "flash://tone/1_Wechat.mp3", - "flash://tone/2_Welcome_To_Wifi.mp3", - "flash://tone/3_New_Version_Available.mp3", - "flash://tone/4_Bt_Success.mp3", - "flash://tone/5_Freetalk.mp3", - "flash://tone/6_Upgrade_Done.mp3", - "flash://tone/7_shutdown.mp3", - "flash://tone/8_Alarm.mp3", - "flash://tone/9_Wifi_Success.mp3", -}; - -int get_tone_uri_num() -{ - return sizeof(tone_uri) / sizeof(char *) - 1; -} \ No newline at end of file +/*This is tone file*/ + +const char* tone_uri[] = { + "flash://tone/0_BT_Connect.mp3", + "flash://tone/1_Bt_Fail.mp3", + "flash://tone/2_Bt_Success.mp3", + "flash://tone/3_Mic_Close.mp3", + "flash://tone/4_Mic_Open.mp3", + "flash://tone/5_Server_Connect.mp3", + "flash://tone/6_Upgrade_Done.mp3", + "flash://tone/7_Upgrade_Failed.mp3", + "flash://tone/8_Upgrading.mp3", + "flash://tone/9_Wifi_Connect.mp3", +}; + +int get_tone_uri_num() +{ + return sizeof(tone_uri) / sizeof(char *) - 1; +} diff --git a/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.h b/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.h index 61daf1756..5d1dac42a 100644 --- a/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.h +++ b/examples/player/pipeline_flash_tone/components/audio_flash_tone/audio_tone_uri.h @@ -4,16 +4,16 @@ extern const char* tone_uri[]; typedef enum { - TONE_TYPE_BT_RECONNECT, - TONE_TYPE_WECHAT, - TONE_TYPE_WELCOME_TO_WIFI, - TONE_TYPE_NEW_VERSION_AVAILABLE, + TONE_TYPE_BT_CONNECT, + TONE_TYPE_BT_FAIL, TONE_TYPE_BT_SUCCESS, - TONE_TYPE_FREETALK, + TONE_TYPE_MIC_CLOSE, + TONE_TYPE_MIC_OPEN, + TONE_TYPE_SERVER_CONNECT, TONE_TYPE_UPGRADE_DONE, - TONE_TYPE_SHUTDOWN, - TONE_TYPE_ALARM, - TONE_TYPE_WIFI_SUCCESS, + TONE_TYPE_UPGRADE_FAILED, + TONE_TYPE_UPGRADING, + TONE_TYPE_WIFI_CONNECT, TONE_TYPE_MAX, } tone_type_t; diff --git a/examples/player/pipeline_flash_tone/main/play_tone_mp3_example.c b/examples/player/pipeline_flash_tone/main/play_tone_mp3_example.c index 919cc8bbe..bc059c4c1 100644 --- a/examples/player/pipeline_flash_tone/main/play_tone_mp3_example.c +++ b/examples/player/pipeline_flash_tone/main/play_tone_mp3_example.c @@ -58,6 +58,9 @@ void app_main(void) i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT(); #endif i2s_cfg.type = AUDIO_STREAM_WRITER; + i2s_cfg.std_cfg.clk_cfg.sample_rate_hz = 16000; + i2s_cfg.std_cfg.slot_cfg.data_bit_width = I2S_DATA_BIT_WIDTH_16BIT; + i2s_cfg.std_cfg.slot_cfg.slot_mode = I2S_SLOT_MODE_MONO; i2s_stream_writer = i2s_stream_init(&i2s_cfg); AUDIO_NULL_CHECK(TAG, i2s_stream_writer, return); @@ -76,7 +79,7 @@ void app_main(void) audio_pipeline_link(pipeline, &link_tag[0], 3); ESP_LOGI(TAG, "[2.6] Set up uri (file as tone_stream, mp3 as mp3 decoder, and default output is i2s)"); - audio_element_set_uri(tone_stream_reader, tone_uri[TONE_TYPE_WECHAT]); + audio_element_set_uri(tone_stream_reader, tone_uri[TONE_TYPE_BT_SUCCESS]); ESP_LOGI(TAG, "[ 3 ] Set up event listener"); audio_event_iface_cfg_t evt_cfg = AUDIO_EVENT_IFACE_DEFAULT_CFG(); @@ -104,8 +107,6 @@ void app_main(void) ESP_LOGI(TAG, "[ * ] Receive music info from mp3 decoder, sample_rates=%d, bits=%d, ch=%d", music_info.sample_rates, music_info.bits, music_info.channels); - - i2s_stream_set_clk(i2s_stream_writer, music_info.sample_rates, music_info.bits, music_info.channels); continue; } diff --git a/examples/player/pipeline_flash_tone/tools/audio-esp.bin b/examples/player/pipeline_flash_tone/tools/audio-esp.bin index 509707b81..7963ab6bb 100644 Binary files a/examples/player/pipeline_flash_tone/tools/audio-esp.bin and b/examples/player/pipeline_flash_tone/tools/audio-esp.bin differ diff --git a/export.sh b/export.sh index d08e9e8de..b02a11d5d 100755 --- a/export.sh +++ b/export.sh @@ -1,9 +1,23 @@ #!/bin/bash if [ -z "$ADF_PATH" ]; then - basedir=$(dirname "$0") - export ADF_PATH=$(cd "${basedir}"; pwd) + adf_path="." + # shellcheck disable=SC2128,SC2169,SC2039,SC3054,SC3028 # ignore array expansion warning + if [ -n "${BASH_SOURCE-}" ]; then + # shellcheck disable=SC3028,SC3054 # unreachable with 'dash' + adf_path=$(dirname "${BASH_SOURCE[0]}") + elif [ -n "${ZSH_VERSION-}" ]; then + # shellcheck disable=SC2296 # ignore parameter starts with '{' because it's zsh + adf_path=$(dirname "${(%):-%x}") + elif [ -n "${ADF_PATH-}" ]; then + if [ -f "/.dockerenv" ]; then + echo "Using the ADF_PATH found in the environment as docker environment detected." + adf_path=$ADF_PATH + fi + fi + export ADF_PATH=$adf_path fi + if [ -z "$IDF_PATH" ]; then export IDF_PATH=$ADF_PATH/esp-idf fi