Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
13 changes: 10 additions & 3 deletions examples/cloud_services/google_translate_device/main/google_tts.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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)

Expand Down Expand Up @@ -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,
Expand All @@ -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);

Expand All @@ -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);

Expand Down Expand Up @@ -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;
}

Expand All @@ -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");
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
/*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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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();
Expand Down Expand Up @@ -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;
}

Expand Down
Binary file modified examples/player/pipeline_flash_tone/tools/audio-esp.bin
Binary file not shown.
18 changes: 16 additions & 2 deletions export.sh
Original file line number Diff line number Diff line change
@@ -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
Expand Down