このプロジェクトは、ESP32の音声合成を示しています。このタスクをクラウドプロバイダーにオフロードするのではなく、CMU Fliteライブラリを使用してローカルに合成を実行します。
このプロジェクトでは、Flite 2.2(Commit Hash E9880474)はESP-IDF 3.2.2フレームワークに移植され、「コンポーネント」ディレクトリにある再利用可能なコンポーネントのセットになりました。
cmu_us_kal音声は例として提供されます。 Fliteに付属する他の事前定義された声は、フラッシュに収まるには大きすぎます。フラッシュに収まる場合、新しい声を個別のコンポーネントとして追加できます。
この例では、合成するテキストの取得要求を受信する単純なHTTPサーバーを実行します。プログラムはテキストを合成し、I2Sを介してPCMデータを送信します。 I2Sの受信側では、PCM5102チップを使用しましたが、他のチップは機能する可能性があります。さらに、I2SをESP32内部8ビットDACにルーティングすることが可能です。
まず、 make menuconfigを使用して構成します。 Wi-Fi SSIDとパスワード、およびI2に使用するピンを設定する必要があります。 BCK = 26、WS = 25、およびデータ= 22でテストしました。
生成されたWAVファイルは、ヒープに割り当てられたPCM値の配列として保存されるため、十分なヒープスペースを利用できる必要があります。必要なスペースは、合成されたテキストの長さによって異なります。したがって、4MBのPSARAMを持つESP32のWroverモデルを使用することをお勧めします。 MenuconfigでPSRAMを有効にする必要があります。メニューに少し隠されています:コンポーネント構成 - > ESP32固有 - >外部、SPI接続RAM-> SPI RAM Configのサポート。有効になると、ヒープ割り当てプールに追加されます。
ESP32のテキストを合成するために送信するには、クエリsを使用して/sayパスのHTTP Get Requestを送信する必要があります。これは、Web閲覧で実行できます。 http://<ip of esp device>/say?s=This is an example text 。クエリ文字列は約256文字に制限されていますが、これはサンプルプログラムの人為的な制限であり、Fliteライブラリは一度にはるかに長いテキストを合成できます。
合成されたデータはチャンクでストリーミングされるため、Fliteがすべてのテキストの処理を完了する前に再生が開始される可能性があります。これにより、より長いテキストの遅延が減り、リアルタイムの感触が得られます。これは、クラウドサービスを使用してWi-Fiを介して合成データをダウンロードするのではなく、Fliteを使用することの利点の1つです。
コンポーネントをプロジェクトにコピーします。
アプリパーティトンに少なくとも2MBがあることを確認してください。
factory, app, factory, 0x10000, 0x2F0000,
make menuconfigで構成します。
次に、次のコードを使用します。
cst_voice *register_cmu_us_kal(const char *voxdir);
int i2s_stream_chunk(const cst_wave *w, int start, int size,
int last, cst_audio_streaming_info *asi)
{
// write here code that processes the wav chunk. For example send it to
// I2S, drive a DAC or send it via Wi-Fi/Bluetooth/Serial to another
// device.
}
...
/* Initialization code */
flite_init();
cst_voice *v = register_cmu_us_kal(NULL);
cst_audio_streaming_info *asi =
cst_alloc(struct cst_audio_streaming_info_struct,1);
asi->min_buffsize = 256;
asi->asc = i2s_stream_chunk;
asi->userdata = NULL;
feat_set(v->features,"streaming_info",audio_streaming_info_val(asi));
/* Synthesis Code */
cst_wave * wav = flite_text_to_wave("Replace with your text",v);
delete_wave(wav);
プロジェクトでFliteを使用した場合は、プロジェクトへのリンクを備えたプルリクエストを開き、ここに追加します。