{"id":99267,"date":"2025-02-27T06:35:42","date_gmt":"2025-02-27T03:05:42","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87-%d8%b9%d9%86%d9%88%d8%a7%d9%86-%d9%85%d8%ab%d8%a7%d9%84-%d8%b3%d8%a7%d8%af%d9%87-%d8%a8%d8%b1%d9%88%db%8c%d8%af-%d8%af%d8%a7%d8%b3%d8%aa%d8%a7%d9%86%d9%87%d8%a7%db%8c-%d8%b5%d9%88%d8%aa\/"},"modified":"2025-02-27T06:35:42","modified_gmt":"2025-02-27T03:05:42","slug":"%d8%a8%d9%87-%d8%b9%d9%86%d9%88%d8%a7%d9%86-%d9%85%d8%ab%d8%a7%d9%84-%d8%b3%d8%a7%d8%af%d9%87-%d8%a8%d8%b1%d9%88%db%8c%d8%af-%d8%af%d8%a7%d8%b3%d8%aa%d8%a7%d9%86%d9%87%d8%a7%db%8c-%d8%b5%d9%88%d8%aa","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87-%d8%b9%d9%86%d9%88%d8%a7%d9%86-%d9%85%d8%ab%d8%a7%d9%84-%d8%b3%d8%a7%d8%af%d9%87-%d8%a8%d8%b1%d9%88%db%8c%d8%af-%d8%af%d8%a7%d8%b3%d8%aa%d8%a7%d9%86%d9%87%d8%a7%db%8c-%d8%b5%d9%88%d8%aa\/","title":{"rendered":"\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0633\u0627\u062f\u0647 \u0628\u0631\u0648\u06cc\u062f: \u062f\u0627\u0633\u062a\u0627\u0646\u0647\u0627\u06cc \u0635\u0648\u062a\u06cc \u0631\u0627 \u0628\u0627 Google Gemini \u060c TTS \u0648 CloudFlare R2 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f"},"content":{"rendered":"<div data-article-id=\"2299941\" id=\"article-body\">\n<p>\u0645\u0646 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u0631\u0648\u06cc \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0646\u0628\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0632\u0628\u0627\u0646 \u0647\u0633\u062a\u0645. \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0634\u0627\u0645\u0644 \u062a\u0648\u0644\u06cc\u062f \u0645\u062d\u062a\u0648\u0627 \u0628\u0627 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0648 \u062a\u0628\u062f\u06cc\u0644 \u0645\u062a\u0646 \u0628\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u0635\u0648\u062a\u06cc \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u0635\u0648\u062a\u06cc \u060c \u0645\u0646 \u0628\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u0628\u0631\u06cc \u0646\u06cc\u0632 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0645.<\/p>\n<p>\u0647\u0632\u06cc\u0646\u0647 \u0627\u0648\u0644\u0648\u06cc\u062a \u0627\u0635\u0644\u06cc \u0645\u0646 \u0628\u0648\u062f \u0632\u06cc\u0631\u0627 \u0641\u0647\u0645\u06cc\u062f\u0645 \u06a9\u0647 \u062c\u0627\u0628\u062c\u0627\u06cc\u06cc \u0628\u06cc\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0639\u0627\u0645\u0644 \u0647\u0627\u06cc \u0627\u0628\u0631 \u062e\u06cc\u0644\u06cc \u062f\u0634\u0648\u0627\u0631 \u0646\u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u060c \u0645\u0646 Google Gemini \u060c Google TTS \u0648 CloudFlare R2 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645. \u0622\u0646\u0647\u0627 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0648 \u0646\u0645\u0648\u0646\u0647 \u0647\u0627\u06cc API \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f \u060c \u0627\u0645\u0627 \u0645\u0646 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0642\u0633\u0645\u062a \u0647\u0627 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645 \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u06cc\u06a9 \u067e\u0633\u062a \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0628\u0646\u0648\u06cc\u0633\u0645. \u0645\u0646 \u0627\u0632 GO \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u060c \u0648 \u0627\u06cc\u0646 \u0641\u0642\u0637 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0633\u0627\u0633\u06cc \u0631\u0627 \u067e\u0648\u0634\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc Google Gemini \u0648 TTS \u060c \u0645\u0646 \u0627\u0632 API RESTful \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645. \u0627\u06af\u0631\u0686\u0647 \u0622\u0646\u0647\u0627 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f \u060c \u0627\u0645\u0627 \u0645\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 API \u0622\u0631\u0627\u0645\u0634 \u0628\u062e\u0634 \u0631\u0627\u062d\u062a \u062a\u0631 \u0627\u0632 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647.<\/p>\n<ol>\n<li>Google Gemini &#8211; \u0627\u0631\u0633\u0627\u0644 \u0633\u0631\u06cc\u0639 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u067e\u0627\u0633\u062e.<\/li>\n<li>Google TTS &#8211; \u0627\u0631\u0633\u0627\u0644 \u0645\u062a\u0646 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc.<\/li>\n<li>CloudFlare R2 &#8211; \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc \u0631\u0627 \u0628\u0627 \u0641\u0631\u0645\u062a \u0628\u0627\u06cc\u0646\u0631\u06cc \u062f\u0631 CloudFlare \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0631\u0645\u0632 \u0646\u0647\u0627\u06cc\u06cc<\/li>\n<\/ol>\n<hr\/>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">api<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"bytes\"<\/span>\n    <span class=\"s\">\"encoding\/json\"<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n    <span class=\"s\">\"io\"<\/span>\n    <span class=\"s\">\"net\/http\"<\/span>\n\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Part<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Text<\/span> <span class=\"kt\">string<\/span> <span class=\"s\">`json:\"text\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Content<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Parts<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Part<\/span> <span class=\"s\">`json:\"parts\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Candidates<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Content<\/span> <span class=\"n\">Content<\/span> <span class=\"s\">`json:\"content\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">PromptResult<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Candidates<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Candidates<\/span> <span class=\"s\">`json:\"candidates\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">Prompt<\/span><span class=\"p\">(<\/span><span class=\"n\">prompt<\/span> <span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">PromptResult<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c\">\/\/ I use viper to manage environment variables, you can replace this with your api key.<\/span>\n    <span class=\"n\">url<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"https:\/\/generativelanguage.googleapis.com\/v1beta\/models\/gemini-2.0-flash:generateContent?key=%s\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">Get<\/span><span class=\"p\">(<\/span><span class=\"s\">\"GOOGLE_CLOUD_API_KEY\"<\/span><span class=\"p\">))<\/span>\n\n    <span class=\"c\">\/\/ In this example, it sends only one prompt but you can send more information<\/span>\n    <span class=\"n\">data<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">json<\/span><span class=\"o\">.<\/span><span class=\"n\">Marshal<\/span><span class=\"p\">(<\/span><span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"k\">interface<\/span><span class=\"p\">{}{<\/span>\n        <span class=\"s\">\"contents\"<\/span><span class=\"o\">:<\/span> <span class=\"p\">[]<\/span><span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"k\">interface<\/span><span class=\"p\">{}{{<\/span>\n            <span class=\"s\">\"parts\"<\/span><span class=\"o\">:<\/span> <span class=\"p\">[]<\/span><span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"k\">interface<\/span><span class=\"p\">{}{{<\/span>\n                <span class=\"s\">\"text\"<\/span><span class=\"o\">:<\/span> <span class=\"n\">prompt<\/span><span class=\"p\">,<\/span>\n            <span class=\"p\">}},<\/span>\n        <span class=\"p\">}},<\/span>\n    <span class=\"p\">})<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">NewRequest<\/span><span class=\"p\">(<\/span><span class=\"s\">\"POST\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"n\">bytes<\/span><span class=\"o\">.<\/span><span class=\"n\">NewBuffer<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">))<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Header<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Content-Type\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"application\/json\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c\">\/\/ Request the API<\/span>\n    <span class=\"n\">res<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">DefaultClient<\/span><span class=\"o\">.<\/span><span class=\"n\">Do<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">defer<\/span> <span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"o\">.<\/span><span class=\"n\">Close<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">resBody<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">io<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadAll<\/span><span class=\"p\">(<\/span><span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">var<\/span> <span class=\"n\">promptResult<\/span> <span class=\"n\">PromptResult<\/span>\n\n    <span class=\"c\">\/\/ Parse the result<\/span>\n    <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">json<\/span><span class=\"o\">.<\/span><span class=\"n\">Unmarshal<\/span><span class=\"p\">(<\/span><span class=\"n\">resBody<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">promptResult<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">promptResult<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">main<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n\n    <span class=\"s\">\"github.com\/hsk-kr\/tutorial\/lib\/api\"<\/span>\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">SetConfigFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\".env\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadInConfig<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">promptResult<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">Prompt<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Generate a short story for kids\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Println<\/span><span class=\"p\">(<\/span><span class=\"n\">promptResult<\/span><span class=\"o\">.<\/span><span class=\"n\">Candidates<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">Content<\/span><span class=\"o\">.<\/span><span class=\"n\">Parts<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">Text<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>% go run main.go\nBarnaby Bumble, a fuzzy, striped bee with a wobbly stinger, was known throughout Honeycomb Hollow for one thing: he was terribly afraid of heights.\n\n\u201cBuzz off, Barnaby!\u201d the other young bees would tease, zooming past him as they practiced their loop-de-loops around the tallest sunflower stalks. Barnaby would cling tightly to the petals of a daisy, his tiny heart thumping like a hummingbird's wings.\n\nHe longed to fly high. He dreamed of seeing the whole meadow spread out below him, a carpet of shimmering colors. But every time he tried to climb a little higher, a dizzy feeling would overwhelm him, and he\u2019d tumble back down, buzzing with fear.\n\nOne sunny morning, Mrs. Higgins, the wise old queen bee, announced a very important task. \u201cThe Queen Clover is blooming!\u201d she declared. \u201cHer nectar is extra sweet and good for making the best honey. But she\u2019s blooming on the very highest hill, atop the tallest thistle! Someone brave and strong must bring her nectar back to the hive.\u201d\n\nAll the young bees buzzed excitedly, eager to volunteer. Barnaby, however, shrunk back, his stripes seeming to fade to gray. He knew he couldn't possibly fly that high.\n\nBut then, he saw little Penelope Petal, a tiny bee with a torn wing. She looked longingly at the queen, but her wing flapped weakly. Penelope was too small and hurt to make the journey.\n\nBarnaby felt a surge of courage. He knew he couldn\u2019t let Penelope down, and he knew how important the Queen Clover nectar was. Taking a deep breath, he buzzed forward.\n\n\"Mrs. Higgins,\" he stammered, \"I... I want to try.\"\n\nMrs. Higgins smiled kindly. \"Are you sure, Barnaby? It's a long way up.\"\n\n\"I'll do my best,\" he promised, his voice trembling only a little.\n\nHe took off, his wings beating harder than ever. The air rushed past him, and his head began to spin. He looked down and saw the hive shrinking below. Fear prickled his antennae.\n\nBut then, he thought of Penelope and the delicious honey they could make. He focused on the top of the thistle, a tiny purple dot in the distance.\n\nHe flew on, one wing beat at a time. He rested on fluffy clouds of milkweed seeds, took tiny sips of dew, and told himself, \"Just a little further, Barnaby. Just a little further.\"\n\nFinally, after what seemed like forever, he reached the top of the thistle. There, bathed in sunshine, was the Queen Clover, her petals glistening with sweet nectar. Barnaby carefully collected the precious liquid into his pollen baskets.\n\nThe journey back was easier. He was filled with a sense of accomplishment, and the fear had almost completely vanished. He even managed to do a little wiggle in the air, just for fun!\n\nWhen Barnaby landed at the hive, he was greeted with cheers. Penelope Petal buzzed around him, her eyes shining with gratitude. Mrs. Higgins beamed.\n\n\"Barnaby Bumble,\" she declared, \"you are braver and stronger than you know! You not only brought us the nectar of the Queen Clover, but you also showed us that even the smallest bee can overcome their biggest fears.\"\n\nFrom that day on, Barnaby Bumble was no longer known for being afraid of heights. He was known for his courage, his kindness, and the most delicious Queen Clover honey in all of Honeycomb Hollow. And every now and then, you might even see him doing a little loop-de-loop around the tallest sunflower.\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 API \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u06cc\u0627\u0628\u06cc\u062f: https:\/\/ai.google.dev\/gemini-api\/docs.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u060c \u06cc\u06a9 \u0633\u0631\u06cc\u0639 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f \u0648 \u067e\u0627\u0633\u062e\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u0634\u0648\u062f. \u067e\u0627\u0633\u062e \u062d\u0627\u0648\u06cc \u0686\u06cc\u0632\u06cc \u0628\u06cc\u0634 \u0627\u0632 \u0645\u062a\u0646 \u0627\u0633\u062a \u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u06af\u06cc \u060c \u0645\u0646 \u0633\u0627\u062e\u062a\u0627\u0631 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0641\u0642\u0637 \u0645\u062a\u0646 \u0631\u0627 \u0627\u062f\u0627\u0631\u0647 \u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06a9\u0646\u0633\u0648\u0644 \u0686\u0627\u067e \u06a9\u0646\u0645.<\/p>\n<p>\u0645\u0646 \u0627\u0632 Viper \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0631\u0627 \u0628\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc \u06a9\u0644\u06cc\u062f API \u0628\u0627 \u062e\u0648\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.<\/p>\n<hr\/>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">api<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"bytes\"<\/span>\n    <span class=\"s\">\"encoding\/base64\"<\/span>\n    <span class=\"s\">\"encoding\/json\"<\/span>\n    <span class=\"s\">\"errors\"<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n    <span class=\"s\">\"io\"<\/span>\n    <span class=\"s\">\"net\/http\"<\/span>\n    <span class=\"s\">\"strings\"<\/span>\n\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Voice<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">LanguageCodes<\/span>          <span class=\"p\">[]<\/span><span class=\"kt\">string<\/span> <span class=\"s\">`json:\"languageCodes\"`<\/span>\n    <span class=\"n\">Name<\/span>                   <span class=\"kt\">string<\/span>   <span class=\"s\">`json:\"name\"`<\/span>\n    <span class=\"n\">SsmlGender<\/span>             <span class=\"n\">Gender<\/span>   <span class=\"s\">`json:\"ssmlGender\"`<\/span> <span class=\"c\">\/\/ \"MALE\" or \"FEMALE\"<\/span>\n    <span class=\"n\">NaturalSampleRateHertz<\/span> <span class=\"kt\">int<\/span>      <span class=\"s\">`json:\"naturalSampleRateHertz\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">VoiceSelectionParam<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">LanguageCode<\/span> <span class=\"kt\">string<\/span> <span class=\"s\">`json:\"languageCode\"`<\/span>\n    <span class=\"n\">Name<\/span>         <span class=\"kt\">string<\/span> <span class=\"s\">`json:\"name\"`<\/span>\n    <span class=\"n\">SsmlGender<\/span>   <span class=\"n\">Gender<\/span> <span class=\"s\">`json:\"ssmlGender\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">VoicesResponse<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Voices<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Voice<\/span> <span class=\"s\">`json:\"voices\"`<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">AudioEncoding<\/span> <span class=\"kt\">string<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Gender<\/span> <span class=\"kt\">string<\/span>\n\n<span class=\"k\">const<\/span> <span class=\"p\">(<\/span>\n    <span class=\"n\">MALE<\/span>   <span class=\"n\">Gender<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"MALE\"<\/span>\n    <span class=\"n\">FEMALE<\/span> <span class=\"n\">Gender<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"FEMALE\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">const<\/span> <span class=\"p\">(<\/span>\n    <span class=\"n\">LINEAR16<\/span> <span class=\"n\">AudioEncoding<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"LINEAR16\"<\/span>\n    <span class=\"n\">MP3<\/span>      <span class=\"n\">AudioEncoding<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"MP3\"<\/span>\n    <span class=\"n\">OGG_OPUS<\/span> <span class=\"n\">AudioEncoding<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"OGG_OPUS\"<\/span>\n    <span class=\"n\">MULAW<\/span>    <span class=\"n\">AudioEncoding<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"MULAW\"<\/span>\n    <span class=\"n\">ALAW<\/span>     <span class=\"n\">AudioEncoding<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"ALAW \"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">convertVoiceToVoiceSelectionParam<\/span><span class=\"p\">(<\/span><span class=\"n\">voice<\/span> <span class=\"n\">Voice<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">VoiceSelectionParam<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">voiceSelectionParam<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">VoiceSelectionParam<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">voice<\/span><span class=\"o\">.<\/span><span class=\"n\">LanguageCodes<\/span> <span class=\"o\">==<\/span> <span class=\"no\">nil<\/span> <span class=\"o\">||<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">voice<\/span><span class=\"o\">.<\/span><span class=\"n\">LanguageCodes<\/span><span class=\"p\">)<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"m\">0<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">errors<\/span><span class=\"o\">.<\/span><span class=\"n\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Empty LanguageCodes\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">voiceSelectionParam<\/span><span class=\"o\">.<\/span><span class=\"n\">LanguageCode<\/span> <span class=\"o\">=<\/span> <span class=\"n\">voice<\/span><span class=\"o\">.<\/span><span class=\"n\">LanguageCodes<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">]<\/span>\n    <span class=\"n\">voiceSelectionParam<\/span><span class=\"o\">.<\/span><span class=\"n\">Name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">voice<\/span><span class=\"o\">.<\/span><span class=\"n\">Name<\/span>\n    <span class=\"n\">voiceSelectionParam<\/span><span class=\"o\">.<\/span><span class=\"n\">SsmlGender<\/span> <span class=\"o\">=<\/span> <span class=\"n\">voice<\/span><span class=\"o\">.<\/span><span class=\"n\">SsmlGender<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">voiceSelectionParam<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">GetVoiceList<\/span><span class=\"p\">(<\/span><span class=\"n\">languageCode<\/span> <span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">([]<\/span><span class=\"n\">Voice<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">url<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"https:\/\/texttospeech.googleapis.com\/v1\/voices?languageCode=%s&amp;key=%s\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">languageCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"GOOGLE_CLOUD_API_KEY\"<\/span><span class=\"p\">))<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">NewRequest<\/span><span class=\"p\">(<\/span><span class=\"s\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Header<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Content-Type\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"application\/json\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">res<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">DefaultClient<\/span><span class=\"o\">.<\/span><span class=\"n\">Do<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">defer<\/span> <span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"o\">.<\/span><span class=\"n\">Close<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">resBody<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">io<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadAll<\/span><span class=\"p\">(<\/span><span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">var<\/span> <span class=\"n\">voicesRes<\/span> <span class=\"n\">VoicesResponse<\/span>\n    <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">json<\/span><span class=\"o\">.<\/span><span class=\"n\">Unmarshal<\/span><span class=\"p\">(<\/span><span class=\"n\">resBody<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">voicesRes<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">voicesRes<\/span><span class=\"o\">.<\/span><span class=\"n\">Voices<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">ConvertTextToAudio<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span> <span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"n\">voice<\/span> <span class=\"n\">Voice<\/span><span class=\"p\">)<\/span> <span class=\"p\">([]<\/span><span class=\"kt\">byte<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">url<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"https:\/\/texttospeech.googleapis.com\/v1\/text:synthesize?key=%s\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"GOOGLE_CLOUD_API_KEY\"<\/span><span class=\"p\">))<\/span>\n\n    <span class=\"n\">voiceSelectionParam<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">convertVoiceToVoiceSelectionParam<\/span><span class=\"p\">(<\/span><span class=\"n\">voice<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">data<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">json<\/span><span class=\"o\">.<\/span><span class=\"n\">Marshal<\/span><span class=\"p\">(<\/span><span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"k\">interface<\/span><span class=\"p\">{}{<\/span>\n        <span class=\"s\">\"input\"<\/span><span class=\"o\">:<\/span>       <span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"kt\">string<\/span><span class=\"p\">{<\/span><span class=\"s\">\"text\"<\/span><span class=\"o\">:<\/span> <span class=\"n\">input<\/span><span class=\"p\">},<\/span>\n        <span class=\"s\">\"voice\"<\/span><span class=\"o\">:<\/span>       <span class=\"n\">voiceSelectionParam<\/span><span class=\"p\">,<\/span>\n        <span class=\"s\">\"audioConfig\"<\/span><span class=\"o\">:<\/span> <span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"kt\">string<\/span><span class=\"p\">{<\/span><span class=\"s\">\"audioEncoding\"<\/span><span class=\"o\">:<\/span> <span class=\"kt\">string<\/span><span class=\"p\">(<\/span><span class=\"n\">OGG_OPUS<\/span><span class=\"p\">)},<\/span>\n    <span class=\"p\">})<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">NewRequest<\/span><span class=\"p\">(<\/span><span class=\"s\">\"POST\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"n\">bytes<\/span><span class=\"o\">.<\/span><span class=\"n\">NewBuffer<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">))<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Header<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Content-Type\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"application\/json\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">res<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">DefaultClient<\/span><span class=\"o\">.<\/span><span class=\"n\">Do<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">defer<\/span> <span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"o\">.<\/span><span class=\"n\">Close<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">body<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">io<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadAll<\/span><span class=\"p\">(<\/span><span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Body<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">var<\/span> <span class=\"n\">result<\/span> <span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"k\">interface<\/span><span class=\"p\">{}<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">json<\/span><span class=\"o\">.<\/span><span class=\"n\">Unmarshal<\/span><span class=\"p\">(<\/span><span class=\"n\">body<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">result<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">audioContent<\/span><span class=\"p\">,<\/span> <span class=\"n\">ok<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"s\">\"audioContent\"<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">!<\/span><span class=\"n\">ok<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"No audio content found in response\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">audioData<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">base64<\/span><span class=\"o\">.<\/span><span class=\"n\">StdEncoding<\/span><span class=\"o\">.<\/span><span class=\"n\">DecodeString<\/span><span class=\"p\">(<\/span><span class=\"n\">audioContent<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">audioData<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">getFirstXVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Voice<\/span><span class=\"p\">,<\/span> <span class=\"n\">strToFind<\/span> <span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span> <span class=\"n\">Gender<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">Voice<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">v<\/span> <span class=\"o\">:=<\/span> <span class=\"k\">range<\/span> <span class=\"n\">voices<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">strings<\/span><span class=\"o\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"n\">strings<\/span><span class=\"o\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">(<\/span><span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">),<\/span> <span class=\"n\">strToFind<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"n\">SsmlGender<\/span> <span class=\"o\">==<\/span> <span class=\"n\">gender<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">voices<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">GetFirstStandardVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Voice<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span> <span class=\"n\">Gender<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">Voice<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">getFirstXVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"standard\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">GetFirstWavenetVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Voice<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span> <span class=\"n\">Gender<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">Voice<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">getFirstXVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"wavenet\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">GetFirstNeuralVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span> <span class=\"p\">[]<\/span><span class=\"n\">Voice<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span> <span class=\"n\">Gender<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">Voice<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">getFirstXVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"neural\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">gender<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">main<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n    <span class=\"s\">\"os\"<\/span>\n\n    <span class=\"s\">\"github.com\/hsk-kr\/tutorial\/lib\/api\"<\/span>\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">SetConfigFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\".env\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadInConfig<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetVoiceList<\/span><span class=\"p\">(<\/span><span class=\"s\">\"en-US\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">voice<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetFirstWavenetVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"MALE\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">bAudio<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">ConvertTextToAudio<\/span><span class=\"p\">(<\/span><span class=\"s\">\"By the way, I am using neovim.\"<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">voice<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">WriteFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\".\/audio.opus\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">bAudio<\/span><span class=\"p\">,<\/span> <span class=\"m\">0644<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u060c \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc \u0631\u0627 \u062f\u0631 \u0647\u0645\u0627\u0646 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0627 \u0646\u0627\u0645 Audio.opus \u067e\u06cc\u062f\u0627 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n<p>\u0633\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<ul>\n<li>Getvoicelist &#8211; \u0644\u06cc\u0633\u062a \u0635\u062f\u0627\u0647\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 API \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>GetFirstwavenetVoice &#8211; \u0627\u0632 \u062a\u0627\u0631\u06cc\u062e 27 \u0641\u0648\u0631\u06cc\u0647 2025 \u060c \u0633\u0647 \u0646\u0648\u0639 \u0635\u062f\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: \u0645\u0648\u062c \u060c \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0648 \u0639\u0635\u0628\u06cc. \u0647\u0631 \u0646\u0648\u0639 \u0634\u0627\u0645\u0644 \u0686\u0646\u062f\u06cc\u0646 \u0635\u062f\u0627\u06cc \u0627\u0633\u062a \u060c \u0627\u0645\u0627 \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0645\u0646 \u0627\u0648\u0644\u0648\u06cc\u062a \u0646\u06cc\u0633\u062a \u060c \u0645\u0646 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0627\u0648\u0644\u06cc\u0646 \u0635\u062f\u0627\u06cc \u06cc\u06a9 \u0646\u0648\u0639 \u062e\u0627\u0635 \u0631\u0627 \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u0645.<\/li>\n<li>ConvertTexttoAudio &#8211; \u0645\u062a\u0646 \u0648 \u0635\u062f\u0627 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627 \u0645\u06cc \u06af\u06cc\u0631\u062f \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u062f []\u0628\u0627\u06cc\u062a \u0627\u06cc\u0646 \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0645\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u0645 \u0627\u0632 \u0622\u0646 \u062f\u0631 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0648\u0628 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645 \u060c \u067e\u0631\u0648\u0646\u062f\u0647 \u0635\u0648\u062a\u06cc \u0631\u0627 \u0628\u0627 \u0641\u0631\u0645\u062a OGG_OPUS \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0647\u0631 \u0642\u0627\u0644\u0628 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0645\u062a\u0648\u062c\u0647 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0641\u0627\u0642\u062f \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0647\u0645 \u0627\u0633\u062a. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0645\u0646 \u0628\u0647 \u067e\u0627\u0631\u0627\u0645\u062a\u0631 Audio_Encoding \u0631\u0633\u06cc\u062f\u0645 \u0648 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0645 \u06a9\u0647 \u0627\u0632 \u06a9\u062f\u0627\u0645 \u0642\u0627\u0644\u0628 \u0647\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f \u060c \u0627\u0645\u0627 \u0647\u06cc\u0686 \u067e\u06cc\u0648\u0646\u062f \u0645\u0633\u062a\u0642\u06cc\u0645\u06cc \u0628\u0627 \u0622\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f. \u0645\u0646 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u06cc\u0646 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647\u0628\u0648\u062f \u06cc\u0627\u0628\u062f &#8211; \u0648\u0642\u062a\u06cc \u0645\u0646 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u067e\u06cc\u0648\u0646\u062f\u0647\u0627 \u0628\u0647 \u0627\u0633\u0646\u0627\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0635\u0648\u062a\u06cc \u0628\u0648\u062f\u0645 \u060c \u0647\u06cc\u0686 \u06a9\u062f\u0627\u0645 \u060c \u0641\u0642\u0637 \u0645\u062a\u0646 \u0633\u06cc\u0627\u0647 \u0633\u0627\u062f\u0647 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u0646\u06a9\u0631\u062f\u0645. \u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c \u0645\u0646 \u0645\u0648\u0641\u0642 \u0634\u062f\u0645 \u0628\u0627 \u062c\u0633\u062a\u062c\u0648\u06cc \u062f\u0633\u062a\u06cc \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u0627\u0633\u0646\u0627\u062f \u060c \u0627\u06cc\u0646 \u0633\u0646\u062f \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0645.<\/p>\n<hr\/>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">api<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"bytes\"<\/span>\n    <span class=\"s\">\"context\"<\/span>\n    <span class=\"s\">\"errors\"<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n    <span class=\"s\">\"time\"<\/span>\n\n    <span class=\"s\">\"github.com\/aws\/aws-sdk-go-v2\/aws\"<\/span>\n    <span class=\"s\">\"github.com\/aws\/aws-sdk-go-v2\/config\"<\/span>\n    <span class=\"s\">\"github.com\/aws\/aws-sdk-go-v2\/credentials\"<\/span>\n    <span class=\"s\">\"github.com\/aws\/aws-sdk-go-v2\/feature\/s3\/manager\"<\/span>\n    <span class=\"s\">\"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"<\/span>\n    <span class=\"s\">\"github.com\/google\/uuid\"<\/span>\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Storage<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">client<\/span>     <span class=\"o\">*<\/span><span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">Client<\/span>\n    <span class=\"n\">uploader<\/span>   <span class=\"o\">*<\/span><span class=\"n\">manager<\/span><span class=\"o\">.<\/span><span class=\"n\">Uploader<\/span>\n    <span class=\"n\">bucketName<\/span> <span class=\"kt\">string<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"o\">*<\/span><span class=\"n\">Storage<\/span><span class=\"p\">)<\/span> <span class=\"n\">Init<\/span><span class=\"p\">()<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">cfg<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">LoadDefaultConfig<\/span><span class=\"p\">(<\/span><span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">TODO<\/span><span class=\"p\">(),<\/span>\n        <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">WithCredentialsProvider<\/span><span class=\"p\">(<\/span><span class=\"n\">credentials<\/span><span class=\"o\">.<\/span><span class=\"n\">NewStaticCredentialsProvider<\/span><span class=\"p\">(<\/span><span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"CLOUDFLARE_R2_ACCESS_KEY_ID\"<\/span><span class=\"p\">),<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"CLOUDFLARE_R2_SECRET_ACCESS_KEY\"<\/span><span class=\"p\">),<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">)),<\/span>\n        <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">WithRegion<\/span><span class=\"p\">(<\/span><span class=\"s\">\"auto\"<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">bucketName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"CLOUDFLARE_R2_BUCKET_NAME\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">NewFromConfig<\/span><span class=\"p\">(<\/span><span class=\"n\">cfg<\/span><span class=\"p\">,<\/span> <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">o<\/span> <span class=\"o\">*<\/span><span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">Options<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">o<\/span><span class=\"o\">.<\/span><span class=\"n\">BaseEndpoint<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aws<\/span><span class=\"o\">.<\/span><span class=\"n\">String<\/span><span class=\"p\">(<\/span><span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"https:\/\/%s.r2.cloudflarestorage.com\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">GetString<\/span><span class=\"p\">(<\/span><span class=\"s\">\"CLOUDFLARE_R2_ACCOUNT_ID\"<\/span><span class=\"p\">)))<\/span>\n    <span class=\"p\">})<\/span>\n\n    <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">uploader<\/span> <span class=\"o\">=<\/span> <span class=\"n\">manager<\/span><span class=\"o\">.<\/span><span class=\"n\">NewUploader<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">client<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"o\">*<\/span><span class=\"n\">Storage<\/span><span class=\"p\">)<\/span> <span class=\"n\">Put<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span> <span class=\"p\">[]<\/span><span class=\"kt\">byte<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">client<\/span> <span class=\"o\">==<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">errors<\/span><span class=\"o\">.<\/span><span class=\"n\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">\"client is nil\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">objectKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">uuid<\/span><span class=\"o\">.<\/span><span class=\"n\">NewUUID<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">bucket<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">aws<\/span><span class=\"o\">.<\/span><span class=\"n\">String<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">bucketName<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">key<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">aws<\/span><span class=\"o\">.<\/span><span class=\"n\">String<\/span><span class=\"p\">(<\/span><span class=\"n\">objectKey<\/span><span class=\"o\">.<\/span><span class=\"n\">String<\/span><span class=\"p\">())<\/span>\n    <span class=\"n\">ctx<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">Background<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">input<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">PutObjectInput<\/span><span class=\"p\">{<\/span>\n        <span class=\"n\">Bucket<\/span><span class=\"o\">:<\/span> <span class=\"n\">bucket<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Key<\/span><span class=\"o\">:<\/span>    <span class=\"n\">key<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Body<\/span><span class=\"o\">:<\/span>   <span class=\"n\">bytes<\/span><span class=\"o\">.<\/span><span class=\"n\">NewReader<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"n\">output<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">uploader<\/span><span class=\"o\">.<\/span><span class=\"n\">Upload<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"n\">input<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">NewObjectExistsWaiter<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">client<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">Wait<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">s3<\/span><span class=\"o\">.<\/span><span class=\"n\">HeadObjectInput<\/span><span class=\"p\">{<\/span>\n        <span class=\"n\">Bucket<\/span><span class=\"o\">:<\/span> <span class=\"n\">bucket<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Key<\/span><span class=\"o\">:<\/span>    <span class=\"n\">key<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span> <span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">Minute<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"o\">*<\/span><span class=\"n\">output<\/span><span class=\"o\">.<\/span><span class=\"n\">Key<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">main<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"github.com\/tutorial\/justsayit\/lib\/api\"<\/span>\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">SetConfigFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\".env\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadInConfig<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetVoiceList<\/span><span class=\"p\">(<\/span><span class=\"s\">\"en-US\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">voice<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetFirstWavenetVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"MALE\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">bAudio<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">ConvertTextToAudio<\/span><span class=\"p\">(<\/span><span class=\"s\">\"By the way, I am using neovim.\"<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">voice<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">storage<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">Storage<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">storage<\/span><span class=\"o\">.<\/span><span class=\"n\">Init<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">storage<\/span><span class=\"o\">.<\/span><span class=\"n\">Put<\/span><span class=\"p\">(<\/span><span class=\"n\">bAudio<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>CloudFlare R2 \u0628\u0627 \u0622\u0645\u0627\u0632\u0648\u0646 S3 \u0642\u0627\u0628\u0644 \u0645\u0642\u0627\u06cc\u0633\u0647 \u0627\u0633\u062a \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 API \u0622\u0646 \u0628\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 AWS S3 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0646\u0645\u0648\u0646\u0647 \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u062f\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a AWS \u060c https:\/\/docs.aws.amazon.com\/code-library\/latest\/ug\/go_2_s3_code_examples.html \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0627\u06cc\u062c\u0627\u062f \u0628\u0631\u062e\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0642\u0628\u0644 \u0627\u0632 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06cc\u06a9 \u0634\u06cc \u0631\u0648\u06cc \u0627\u0628\u0631 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a \u060c \u0645\u0646 \u0631\u0648\u0634\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0633\u0627\u062e\u062a\u0627\u0631 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0645.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u060c \u0628\u0627\u06cc\u062f \u0634\u06cc\u0621 \u0631\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 CloudFlare \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2jlcfnhn28ed4fbp9e6.png\" alt=\"\u0634\u06cc\u0621 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647\" loading=\"lazy\" width=\"800\" height=\"407\" title=\"\"><\/p>\n<p>\u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u067e\u0631\u0648\u0646\u062f\u0647 \u0635\u0648\u062a\u06cc \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u062f\u0631 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0648\u0628 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u0634\u0648\u062f \u060c \u0645\u0646 URL \u0634\u06cc \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0686\u0633\u0628 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0645 &#8211; \u0627\u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u06a9\u0631\u062f. \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u06a9\u0647 \u062d\u062a\u06cc \u0627\u06af\u0631 \u0645\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u0631\u0627 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0639\u0645\u0648\u0645 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0647 \u0627\u0645 \u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0622\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0631\u0648\u06a9\u0633\u06cc \u062f\u0627\u0634\u062a\u0645. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0627\u0632 \u062f\u06cc\u062f\u06af\u0627\u0647 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0639\u0646\u06cc \u062f\u0627\u0631\u062f \u060c \u0632\u06cc\u0631\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0627\u06cc\u062f \u0628\u0647 \u0635\u0631\u0627\u062d\u062a \u062f\u0631 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u062c\u0627\u0632 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u0642\u062a \u0628\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f Dev Mode \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0632 Dev Link \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<hr\/>\n<h2>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<br \/>\n<\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">main<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"github.com\/tutorial\/justsayit\/lib\/api\"<\/span>\n    <span class=\"s\">\"github.com\/spf13\/viper\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">SetConfigFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\".env\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">viper<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadInConfig<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">promptResult<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">Prompt<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Say something short in German\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">generatedText<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">promptResult<\/span><span class=\"o\">.<\/span><span class=\"n\">Candidates<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">Content<\/span><span class=\"o\">.<\/span><span class=\"n\">Parts<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">Text<\/span>\n\n    <span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetVoiceList<\/span><span class=\"p\">(<\/span><span class=\"s\">\"de-DE\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">voice<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">GetFirstWavenetVoice<\/span><span class=\"p\">(<\/span><span class=\"n\">voices<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"MALE\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">bAudio<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">ConvertTextToAudio<\/span><span class=\"p\">(<\/span><span class=\"n\">generatedText<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">voice<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">storage<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">api<\/span><span class=\"o\">.<\/span><span class=\"n\">Storage<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">storage<\/span><span class=\"o\">.<\/span><span class=\"n\">Init<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">storage<\/span><span class=\"o\">.<\/span><span class=\"n\">Put<\/span><span class=\"p\">(<\/span><span class=\"n\">bAudio<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u062f \u0646\u0647\u0627\u06cc\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: \u062a\u0648\u0644\u06cc\u062f \u0645\u062a\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Google Gemini \u060c \u062a\u0628\u062f\u06cc\u0644 \u0645\u062a\u0646 \u0628\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc \u062f\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0631 \u0627\u0628\u0631\u06cc.<\/p>\n<hr\/>\n<p>\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0645\u0641\u06cc\u062f \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0646 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u0631\u0648\u06cc \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0646\u0628\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0632\u0628\u0627\u0646 \u0647\u0633\u062a\u0645. \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0634\u0627\u0645\u0644 \u062a\u0648\u0644\u06cc\u062f \u0645\u062d\u062a\u0648\u0627 \u0628\u0627 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0648 \u062a\u0628\u062f\u06cc\u0644 \u0645\u062a\u0646 \u0628\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u0635\u0648\u062a\u06cc \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u0635\u0648\u062a\u06cc \u060c \u0645\u0646 \u0628\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u0628\u0631\u06cc \u0646\u06cc\u0632 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0645. \u0647\u0632\u06cc\u0646\u0647 \u0627\u0648\u0644\u0648\u06cc\u062a \u0627\u0635\u0644\u06cc \u0645\u0646 \u0628\u0648\u062f \u0632\u06cc\u0631\u0627 \u0641\u0647\u0645\u06cc\u062f\u0645 \u06a9\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":99268,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohz8dxlrugxvnxnt24eu.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-99267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/99267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=99267"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/99267\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/99268"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=99267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=99267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=99267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}