From 84de78d8bd2a7dd61c06f589c13c62489e9ea02c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D1=83=D0=B1=D0=BE=D0=B2=D0=B8=D0=BA=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC?= Date: Tue, 18 Jun 2019 13:39:52 +0300 Subject: [PATCH] Google Cloud Platform Documentation (#9367) * Google Cloud TTS service component manual * Beautified * * Added new parameter description * Structurized * Changed icon * Update source/_components/google_cloud.markdown Co-Authored-By: lufton * Added speed, pitch and gain parameters description * * Added new profiles parameter * Changed default and supported values * Fixes * Fixes * It's too late to be added to 0.93 =( * :pencil2: Tweaks --- source/_components/google_cloud.markdown | 140 ++++++++++++++++++ .../images/supported_brands/google_cloud.png | Bin 0 -> 20211 bytes 2 files changed, 140 insertions(+) create mode 100644 source/_components/google_cloud.markdown create mode 100644 source/images/supported_brands/google_cloud.png diff --git a/source/_components/google_cloud.markdown b/source/_components/google_cloud.markdown new file mode 100644 index 00000000000..ff386fe3133 --- /dev/null +++ b/source/_components/google_cloud.markdown @@ -0,0 +1,140 @@ +--- +layout: page +title: "Google Cloud Platform" +description: "Google Cloud Platform integration." +date: 2019-05-02 12:08 +sidebar: true +comments: false +sharing: true +footer: true +logo: google_cloud.png +ha_category: Text-to-speech +ha_release: 0.95 +--- + +The `google_cloud` platform allows you to use [Google Cloud Platform](https://cloud.google.com/) API and integrate them into Home Assistant. + +## {% linkable_title Configuration %} + +To use Google Cloud Platform, you need to provide `config` directory relative path of [`API key`](#obtaining-api-key) file you are going to use. Place it under `config` folder and set `key_file` parameter in `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +tts: + - platform: google_cloud + key_file: googlecloud.json +``` + +## {% linkable_title Obtaining an API key %} + +API key obtaining process described in corresponding documentation: + +* [Text-to-Speach](https://cloud.google.com/text-to-speech/docs/quickstart-protocol) +* [Speach-to-Text](https://cloud.google.com/speech-to-text/docs/quickstart-protocol) +* [Geocoding](https://cloud.google.com/translate/docs/quickstart) + +Basic instruction for all APIs: + +1. Visit [Cloud Resource Manager](https://console.cloud.google.com/cloud-resource-manager). +2. Click `CREATE PROJECT` button at the top. +3. Specify convenient `Project name` and click `CREATE` button. +4. [Make sure that billing is enabled for your Google Cloud Platform project](https://cloud.google.com/billing/docs/how-to/modify-project). +5. Enable needed Cloud API visiting one of the links below or [APIs library](https://console.cloud.google.com/apis/library), selecting your `Project` from the dropdown list and clicking the `Continue` button: + + * [Text-to-Speech](https://console.cloud.google.com/flows/enableapi?apiid=texttospeech.googleapis.com) + * [Speech-to-Text](https://console.cloud.google.com/flows/enableapi?apiid=speech.googleapis.com) + * [Geocoding](https://console.cloud.google.com/flows/enableapi?apiid=geocoding-backend.googleapis.com) + +6. Set up authentication: + + 1. Visit [this link](https://console.cloud.google.com/apis/credentials/serviceaccountkey) + 2. From the `Service account` list, select `New service account`. + 3. In the `Service account name` field, enter any name. + + If you are requesting Text-to-Speech API key: + + 4. Don't select a value from the Role list. **No role is required to access this service**. + 5. Click `Create`. A note appears, warning that this service account has no role. + 6. Click `Create without role`. A JSON file that contains your `API key` downloads to your computer. + +## {% linkable_title Google Cloud Text-to-Speech %} + +[Google Cloud Text-to-Speech](https://cloud.google.com/text-to-speech/) converts text into human-like speech in more than 100 voices across 20+ languages and variants. It applies groundbreaking research in speech synthesis (WaveNet) and Google's powerful neural networks to deliver high-fidelity audio. With this easy-to-use API, you can create lifelike interactions with your users that transform customer service, device interaction, and other applications. + +### {% linkable_title Pricing %} + +The Cloud Text-to-Speech API is priced monthly based on the amount of characters to synthesize into audio sent to the service. + +| Feature | Monthly free tier | Paid usage | +|-------------------------------|---------------------------|-----------------------------------| +| Standard (non-WaveNet) voices | 0 to 4 million characters | $4.00 USD / 1 million characters | +| WaveNet voices | 0 to 1 million characters | $16.00 USD / 1 million characters | + +### {% linkable_title Text-to-Speach configuration %} + +{% configuration %} +key_file: + description: "The [`API key`](#obtaining-api-key) file to use with Google Cloud Platform. If not specified `os.environ['GOOGLE_APPLICATION_CREDENTIALS']` path will be used." + required: false + type: string +language: + description: "Default language of the voice, e.g. `en-US`. Supported languages, genders and voices listed [here](https://cloud.google.com/text-to-speech/docs/voices)." + required: false + type: string + default: en-US +gender: + description: "Default gender of the voice, e.g. `male`. Supported languages, genders and voices listed [here](https://cloud.google.com/text-to-speech/docs/voices)." + required: false + type: string + default: neutral +voice: + description: "Default voice name, e.g. `en-US-Wavenet-F`. Supported languages, genders and voices listed [here](https://cloud.google.com/text-to-speech/docs/voices). **Important! This parameter will override `language` and `gender` parameters if set**." + required: false + type: string +encoding: + description: "Default audio encoder. Supported encodings are `ogg_opus`, `mp3` and `linear16`." + required: false + type: string + default: ogg_opus +speed: + description: "Default rate/speed of the voice, in the range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), defaults to the native 1.0 speed." + required: false + type: float + default: 1.0 +pitch: + description: "Default pitch of the voice, in the range [-20.0, 20.0]. 20 means increase of 20 semitones from the original pitch. -20 means decrease of 20 semitones from the original pitch." + required: false + type: float + default: 0.0 +gain: + description: "Default volume gain (in dB) of the voice, in the range [-96.0, 16.0]. If unset, or set to a value of 0.0 (dB), will play at normal native signal amplitude. A value of -6.0 (dB) will play at approximately half the amplitude of the normal native signal amplitude. A value of +6.0 (dB) will play at approximately twice the amplitude of the normal native signal amplitude. Strongly recommend not to exceed +10 (dB) as there's usually no effective increase in loudness for any value greater than that." + required: false + type: float + default: 0.0 +profiles: + description: "An identifier which selects 'audio effects' profiles that are applied on (post synthesized) text to speech. Effects are applied on top of each other in the order they are given. Supported profile ids listed [here](https: //cloud.google.com/text-to-speech/docs/audio-profiles)." + required: false + type: list + default: "[]" +{% endconfiguration %} + +### {% linkable_title Full configuration example %} + +The Google Cloud Text-to-Speech configuration can look like: + +```yaml +# Example configuration.yaml entry +tts: + - platform: google_cloud + key_file: googlecloud.json + language: en-US + gender: male + voice: en-US-Wavenet-F + encoding: linear16 + speed: 0.9 + pitch: -2.5 + gain: -5.0 + profiles: + - telephony-class-application + - wearable-class-device +``` diff --git a/source/images/supported_brands/google_cloud.png b/source/images/supported_brands/google_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c63cd67ca4ddac7598033116e67ef88ed3c320a5 GIT binary patch literal 20211 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

|W@(dQ6+O&$H1IoXg!=4|C!w zWZ8Pe{8m1^SiSS1sp5x1{ZCvFrHL1Bl-6Ow2dC)dJVcvz6K~&1NM-{sMNv(Yp?(rF zsPx*a^?7~UkoFc~!94XZ1m(y6#T3Eh;5UhS!Wf~Ek&<+oBg*O<>YqcEDX^nSq;AO3 z9p7(%7(WM3Y15mbmOryFxbRfKuwz=Y(GaH$N;nE+-?{fBK zJ34!;R%}O}qBv>F^z2$Zo90F5^uoB4Ijr}b`Q4B~^PMbYQ2Iz|UjB@$q48lKLrXwW zmSgGzW_Wi=&Qj3rQoOICNw)GB?^HE0H5iQqca_VZUt-Wd}W8+Wd zM8cF+FQqlxkU4($Ub+n!`Wqh|DBpt9UlU0i?yF64Onq`30Hbk;eJjJL+Xb7{cH2%^ zwYA#R2F!n7VofJij4k-)-M%!EnXvw~HOXWooEqDkFIACZm6M)dQz&F2k%4 z!H&5_b)uD;?9)4yXud|@iu>+xQ&DBWC?dilCHd0bk3BSgN7*^5+>+Yw;^`yGk&0w2J<*!9!;AAl;!G0rPOKdXN zv%79Fy|0j&%o3HYZ>MXMCmG}}9-ub!)X3Pzi9Z_&-z>Zoc|Nq0X9)X6S-3NQFG+qR z!xkdscpv6ht?SlxTZm6ja)lqFmY;H*@5brgBLRIN23If$={f}uYCn)IKMSCVGlZ;8 z{hC02@G&|(E=pv#9p><^H@UhNeR`SZcC0s=!evGccHiggToOC_y^mb$ktEZ~k}=$F zxRAxlj5M1bp&770lSq5Q2+MsV?rMD;sYb?J%+l=EKJ`;wV!iP4-H}+*QH8-~z6r@U znml`Saky*7=XcJvb{E39k`f@FVLXNyHL&OqJ(&OXf$YO_keMXDY;hTKUG2Mz`y7_{b1HCFz5VQkaN}^);l^_dO8IO3#U&y;~6b{ieZJs z21Du#yUpACT6f%z1*?)r&x?LY+a2Uh6_BCrZNDn8FT>5cHD9bfu2Jb`B->(0@=#4% zDa}~oT2RmIFTBaEGEk5?*2_^XV_Yf|f%iyeEByhGJ!l1+at^=R1dLRbjJ(`dgF)`Z zRgcZnv1@O3PEdg7xCCy#Ap0=>twKS;-kGF4WJb@tEx;2SPL8yn(A-T79(%57Y_}gh zRGI!j$Ns&4s*eD0pIaKNf5+gSSgG#rxguw>%Pp^lFs554{ivaNvJ**ZXIXsKgi6$& zSuBxoPcAihVR<#^>_eZgx;E@F>DK|5O2f7l{}hDEn?Tir!dub5-I~+6InFRo-c@@}X?GYFX7>>G17aA3{F9_sur;Lt!@o5l4XKba7mhnHFL7c2vc1Q= zpyrraA`SUf$@;2*DuZyG^9N$glp{6{^KfggnB7)NeaXEIZ5XCL(K@8&k$!X+Ta`!8 z^GY3tQFvZwHh&c`8p_{|sh<&Elpdaz3)dBR8Xvn+S63!55dtgKlWVbsBdou@fF*PE zjOm(&BGJ2FN1h~Dd9anfDx1=`I7E{xXtiuE*Ij#?lYN75LpGb#2ma~?laN@)ue2PoKQS=3FX@Vd7*QGrpNe)f#9imHq#(<$EzBM9 zY9&tVGu~aYr{b?%L`1M}rk}lhtLHI&mP>x0`;jdqtEceF_#W)@!g+`DBhe-E**W|5&G?KQ;EiOZxk_)aH9iuB>L4{Qtdo?n~2;Y%{kXooKR zq&&>C@X|w80$J2>*|X%A6Lzo-3O03;ln1PX&uv7syIt_hZ@k}-n5{l}t3#AKEkrUd z=Yr($i4B&N5%hG4L(`;`5ZoAVh46IHsn49WWGKH*h1lK5_zu!Jp z>75meWNdCCx_Br6BL^3%MS9kDt1`$E`;$nS3H-||v3{~+{@S>kM!7l0f$p0E zFYSkK(cOx~D=%Sg))XX#Gj22PQ+gN3oaTk*Pti$!46wjPE{GaNWuNmmI!HBh5VtC6If53vRQ` zlR+5)3$T^NoY*DGQjdx})_Zf!W6gI=tfUU;=ZZ_MsFO8~KRVuiSGjLSz-l~)Ka{5@ zS7a71PlOdosG0I86fWijcideTG~Hs(wvy%@oFwnBbVISBDAm%mVP8Rl#f&`1e>k$) zm#k8@j_q>no$j`A+AU5Dvmeq^)k+n0NW^Z5JkO|Ie`9`pO<~5rGoJ7pIEg1Gdn3<^ zuA9|w&7F~#-W?%-LjBD%=#ct4HttIbnuhb&PP|u6zSsM;gg>X1Bo%oMqxq>E(V(!R-D!&vXMZR z`8MgYv&Rof(bno%TlRD}d9q5#KIJZL3M-Y3 zfiS@c1iz`K7b6wYc6od|8t;{=A?A+~HiuL>LvrEqcI4nMm08RE@OG=V>e5n=$Ictv znp_qk_O!RQ65UHTpU@2+R&1_VZ}h2gV4fN3)l$9`q`CelD{zyU3CZcIF1w^z5mlUu z4B7x!pk*(==(SH$fcIi$$+=uD=X2b-vVzT9t`l4(H(=>v{5tkNio})w(YsByXLFzM zvZ3M;fdH!FCl!8&Y{m=6h`=QY>MxZUpZ4n-o{2|;Fs=__`2AHtdUz66h1izd3h96>$7prSrbh0~3TknaGe4I>FP*R??7X(*%^Mezf||_e-~J zUbD zQ+#D!l=)f-D?}|T&S#cM3DMnQs?!$75U-Yn*GcolO(21&KQM` z%fFV_*Z(tO|J(7|gWJ~``JOYoc%a>im&1%BnD4K0oA0IC02(vDU8=mAbG@znSrsu^bt6{4UrM z@5Y0KN=lo;v-$7f(-uu_yt#mD^QYFH%vpT%t1|3d$;e7V+c~F#Zz^wyQeNe9PREg_ zXi;j7R;Mo!zt0e?(_doChB%<)RsO~k(jgLMZuLQ@Ok3QjG2w@rJ!iq0mH5NLS=e4> zsQUN5w&%#t63@h1u5*5?v_jlHNNJasC8JNSjtBa`cD$Hb8!A=|xzQg~)BSX52v<~p z86)($>+cy6rw$K4o(|W$de{~dhuiKkBC|)Y#qP1ekwMbiNy(wNm)&XzdPD<#s|^_a z*>ihJwf=nQEYo0XTdjBaidp2W=%QP8`W?Pta_mGoZ6tMH&c!z%ZCn9*HBUS2(~v%8 zMollduKGY+T4C$W%39!IQ-M>(X61~T)rTe)vYG9=)0VNDkk8iFvj$iul@4Ca`iH3P z^^}GW>+xW7tXo)hxTCJ0+CCgYd>GD*M=cp5Lbn`XpQ4PnVv37P#8H_8YO@%McGp)~ zBl6kJBz0OJp+7A$c;fpzJXB!qMKss%{e)6VvaQ}dk)dD8Q&`TQ^5lW6UPNQ^muq5P zC@qwXVhp7w^{)&QW3m$UzlE0svp(n7Ow814em%ZhjSVlV;)#Q)?lk4@$0i%D>MvcEalrCt3Xt;2?jn1-e4vPKH zqpB`6t6q{4jrm>zF~7a5v+jf&V3`~vhR$h;_-#07CtF*hF(288`GwP~5Ze*yi=u7G z@b)6#?<#<3MABr_Y%LDy^dpH>G^$$UZVgpg5Zy&RDG%u+-k7{u3Ws9)obnLtv;BGE zdSg*jfCHYjrsw(;->D?CrCl_tdTbns>%L5?j5SPoqWcD#WHd}Q{Ob*U)NM&LsyFM< z$=AC11s1wadzDjm)_s*A`bHi?h{k+0+S+wkSiK_8omfRQGnkg8MTOhv!+DDdd3@k)(0u_1cRlH| z`JZzmJq>WnqC>C$s%B9~qqtw)ekA%0-Lewl@ZJ~?TX}1AX9NPBYY&N^4yDS9jPd;dM*Y3+1*XPcGSh&6VKJVmxK1ZXdq5+Mv#=>U+aXxtyHQ1 zStNQK+s)}_CrkN^BuvWe6GuGUhtL&6sgR5Cw)4-Qshi!|aMPMlwm4D8D}UPUmA0MJ zH+WSlH>SpHTbLgZrX{d!l5QT1T2NoSUTo~W&P^XuU0zTs^g6s z`6RmYMH5%n5yb7)l0rx$geZ*GKHeg9*Uci5;2nmgdF{%4Vwxx{Wz`QUCd z5LLIk!L2`*H$Ztf%jQ+u?baz5A5uo9W{W)Z7ZQTXf>`LhNqh4#dcC)!Ay-12&+T?8 z?30BdXQpW@|Eu43UtPUCt&;WMsEB=7jC&wZx3*VO&F<(c5Tcv+IfIG%4_e#%y_@6b1*{Qj3U z>jMEGhUuUOH1kt7@_hk7Ug1jsuyjv2h8G;SHKl+2}%QI5%M{*9rg-4S*~ik4Qr$=`yO(tHiC1kFHsmlq%{s zXA9r*82|v$0Ek;OR8J4xhG;5J;)5t!FRR=PgXxJjk8S_}5DfsERVCW(zpL6lhiKvL zcE>A@8n*WB<5~d#q5+V}^40#YnGOh(V-)G+Xxh2dYt=nvDmGc@A_xG0XaLlYYOD`3 z7|a_$v{l+e*DF0$ef-^lXRoQb0LFhu^hu}y0Eh-a{Ianp)M)c9rMJC-S2ApE%=_PO zhMC$a(GPlO005!^ke41B1I0s;kMa&K8RzpfG93T_(EzGYWMbq%>9>iC#z5%`1JnQj z(E!LH?(7kD43d~+(3}eZ5DkF5_t(&E4IU}Q>CIaP|CVb20Eh-a&XLZY0s378&&k+Q zJn8UlzIy;bGys|ii7-e

WHFiw_Kxej@oHeBS_oXaF?hQHnbgMMlP-iSn4_fi0z% z9{5r5n|#Lr0Eh;F5)SDID*Y{j^~Z4JVxV}mf1tFJA!z^rhz3A|>XgAXQiAHp!;}33 z#h-i0qsP5&p~t;uU5Dhq$**yK?FRWhe0Kl