You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/fa/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-spee...

15 KiB

ترجمه گفتار - Wio Terminal

در این بخش از درس، کدی خواهید نوشت که متن را با استفاده از سرویس مترجم ترجمه کند.

تبدیل متن به گفتار با استفاده از سرویس مترجم

رابط REST API سرویس گفتار از ترجمه مستقیم پشتیبانی نمی‌کند. در عوض، می‌توانید از سرویس مترجم برای ترجمه متنی که توسط سرویس گفتار به متن تولید شده و همچنین متن پاسخ گفتاری استفاده کنید. این سرویس یک رابط REST API دارد که می‌توانید از آن برای ترجمه متن استفاده کنید، اما برای سهولت استفاده، این قابلیت در یک تریگر HTTP دیگر در برنامه توابع شما قرار می‌گیرد.

وظیفه - ایجاد یک تابع بدون سرور برای ترجمه متن

  1. پروژه smart-timer-trigger خود را در VS Code باز کنید و ترمینال را باز کنید و مطمئن شوید که محیط مجازی فعال است. اگر فعال نیست، ترمینال را بسته و دوباره ایجاد کنید.

  2. فایل local.settings.json را باز کنید و تنظیمات مربوط به کلید API مترجم و مکان آن را اضافه کنید:

    "TRANSLATOR_KEY": "<key>",
    "TRANSLATOR_LOCATION": "<location>"
    

    <key> را با کلید API مربوط به منبع سرویس مترجم خود جایگزین کنید. <location> را با مکانی که هنگام ایجاد منبع سرویس مترجم استفاده کرده‌اید جایگزین کنید.

  3. یک تریگر HTTP جدید به این برنامه اضافه کنید به نام translate-text با استفاده از دستور زیر از داخل ترمینال VS Code در پوشه ریشه پروژه برنامه توابع:

    func new --name translate-text --template "HTTP trigger"
    

    این دستور یک تریگر HTTP به نام translate-text ایجاد می‌کند.

  4. محتوای فایل __init__.py در پوشه translate-text را با موارد زیر جایگزین کنید:

    import logging
    import os
    import requests
    
    import azure.functions as func
    
    location = os.environ['TRANSLATOR_LOCATION']
    translator_key = os.environ['TRANSLATOR_KEY']
    
    def main(req: func.HttpRequest) -> func.HttpResponse:
        req_body = req.get_json()
        from_language = req_body['from_language']
        to_language = req_body['to_language']
        text = req_body['text']
    
        logging.info(f'Translating {text} from {from_language} to {to_language}')
    
        url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0'
    
        headers = {
            'Ocp-Apim-Subscription-Key': translator_key,
            'Ocp-Apim-Subscription-Region': location,
            'Content-type': 'application/json'
        }
    
        params = {
            'from': from_language,
            'to': to_language
        }
    
        body = [{
            'text' : text
        }]
    
        response = requests.post(url, headers=headers, params=params, json=body)
        return func.HttpResponse(response.json()[0]['translations'][0]['text'])
    

    این کد متن و زبان‌ها را از درخواست HTTP استخراج می‌کند. سپس یک درخواست به REST API مترجم ارسال می‌کند و زبان‌ها را به‌عنوان پارامترهای URL و متن برای ترجمه به‌عنوان بدنه ارسال می‌کند. در نهایت، ترجمه بازگردانده می‌شود.

  5. برنامه توابع خود را به صورت محلی اجرا کنید. سپس می‌توانید با استفاده از ابزاری مانند curl این برنامه را فراخوانی کنید، همان‌طور که تریگر HTTP text-to-timer را آزمایش کردید. مطمئن شوید که متن برای ترجمه و زبان‌ها را به‌عنوان یک بدنه JSON ارسال می‌کنید:

    {
        "text": "Définir une minuterie de 30 secondes",
        "from_language": "fr-FR",
        "to_language": "en-US"
    }
    

    این مثال عبارت Définir une minuterie de 30 secondes را از زبان فرانسوی به انگلیسی آمریکایی ترجمه می‌کند. نتیجه Set a 30-second timer خواهد بود.

💁 می‌توانید این کد را در پوشه code/functions پیدا کنید.

وظیفه - استفاده از تابع مترجم برای ترجمه متن

  1. پروژه smart-timer را در VS Code باز کنید، اگر هنوز باز نیست.

  2. تایمر هوشمند شما دو زبان خواهد داشت - زبان سروری که برای آموزش LUIS استفاده شده (همان زبانی که برای ساخت پیام‌هایی که به کاربر گفته می‌شود استفاده می‌شود) و زبان صحبت شده توسط کاربر. مقدار ثابت LANGUAGE را در فایل هدر config.h به زبانی که کاربر صحبت خواهد کرد تغییر دهید و یک ثابت جدید به نام SERVER_LANGUAGE برای زبان استفاده شده برای آموزش LUIS اضافه کنید:

    const char *LANGUAGE = "<user language>";
    const char *SERVER_LANGUAGE = "<server language>";
    

    <user language> را با نام محلی زبان مورد نظر خود جایگزین کنید، برای مثال fr-FR برای فرانسوی یا zn-HK برای کانتونی.

    <server language> را با نام محلی زبان استفاده شده برای آموزش LUIS جایگزین کنید.

    می‌توانید لیستی از زبان‌های پشتیبانی شده و نام‌های محلی آن‌ها را در مستندات پشتیبانی زبان و صدا در Microsoft docs پیدا کنید.

    💁 اگر به چند زبان صحبت نمی‌کنید، می‌توانید از خدماتی مانند Bing Translate یا Google Translate برای ترجمه از زبان مورد نظر خود به زبان دیگر استفاده کنید. این خدمات می‌توانند صدای متن ترجمه شده را نیز پخش کنند.

    برای مثال، اگر LUIS را به زبان انگلیسی آموزش داده‌اید اما می‌خواهید از زبان فرانسوی به‌عنوان زبان کاربر استفاده کنید، می‌توانید جملاتی مانند "set a 2 minute and 27 second timer" را از انگلیسی به فرانسوی با استفاده از Bing Translate ترجمه کنید، سپس از دکمه Listen translation برای گفتن ترجمه به میکروفون خود استفاده کنید.

    دکمه Listen translation در Bing Translate

  3. کلید API مترجم و مکان آن را زیر SPEECH_LOCATION اضافه کنید:

    const char *TRANSLATOR_API_KEY = "<KEY>";
    const char *TRANSLATOR_LOCATION = "<LOCATION>";
    

    <KEY> را با کلید API مربوط به منبع سرویس مترجم خود جایگزین کنید. <LOCATION> را با مکانی که هنگام ایجاد منبع سرویس مترجم استفاده کرده‌اید جایگزین کنید.

  4. URL تریگر مترجم را زیر VOICE_URL اضافه کنید:

    const char *TRANSLATE_FUNCTION_URL = "<URL>";
    

    <URL> را با URL مربوط به تریگر HTTP translate-text در برنامه توابع خود جایگزین کنید. این مقدار مشابه مقدار TEXT_TO_TIMER_FUNCTION_URL خواهد بود، به جز اینکه نام تابع translate-text به جای text-to-timer خواهد بود.

  5. یک فایل جدید به پوشه src اضافه کنید به نام text_translator.h.

  6. این فایل هدر جدید text_translator.h شامل یک کلاس برای ترجمه متن خواهد بود. موارد زیر را به این فایل اضافه کنید تا این کلاس تعریف شود:

    #pragma once
    
    #include <Arduino.h>
    #include <ArduinoJson.h>
    #include <HTTPClient.h>
    #include <WiFiClient.h>
    
    #include "config.h"
    
    class TextTranslator
    {
    public:   
    private:
        WiFiClient _client;
    };
    
    TextTranslator textTranslator;
    

    این کد کلاس TextTranslator را تعریف می‌کند، همراه با یک نمونه از این کلاس. این کلاس یک فیلد برای WiFi client دارد.

  7. به بخش public این کلاس، یک متد برای ترجمه متن اضافه کنید:

    String translateText(String text, String from_language, String to_language)
    {
    }
    

    این متد زبان مبدأ و زبان مقصد را می‌گیرد. هنگام پردازش گفتار، گفتار از زبان کاربر به زبان سرور LUIS ترجمه می‌شود و هنگام ارائه پاسخ‌ها از زبان سرور LUIS به زبان کاربر ترجمه می‌شود.

  8. در این متد، کدی برای ساخت یک بدنه JSON که شامل متن برای ترجمه و زبان‌ها است اضافه کنید:

    DynamicJsonDocument doc(1024);
    doc["text"] = text;
    doc["from_language"] = from_language;
    doc["to_language"] = to_language;
    
    String body;
    serializeJson(doc, body);
    
    Serial.print("Translating ");
    Serial.print(text);
    Serial.print(" from ");
    Serial.print(from_language);
    Serial.print(" to ");
    Serial.print(to_language);
    
  9. در زیر این کد، کدی برای ارسال بدنه به برنامه توابع بدون سرور اضافه کنید:

    HTTPClient httpClient;
    httpClient.begin(_client, TRANSLATE_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    
  10. سپس، کدی برای دریافت پاسخ اضافه کنید:

    String translated_text = "";
    
    if (httpResponseCode == 200)
    {
        translated_text = httpClient.getString();
        Serial.print("Translated: ");
        Serial.println(translated_text);
    }
    else
    {
        Serial.print("Failed to translate text - error ");
        Serial.println(httpResponseCode);
    }
    
  11. در نهایت، کدی برای بستن اتصال و بازگرداندن متن ترجمه شده اضافه کنید:

    httpClient.end();
    
    return translated_text;
    

وظیفه - ترجمه گفتار شناسایی شده و پاسخ‌ها

  1. فایل main.cpp را باز کنید.

  2. یک دستور include در بالای فایل برای فایل هدر کلاس TextTranslator اضافه کنید:

    #include "text_translator.h"
    
  3. متنی که هنگام تنظیم یا پایان تایمر گفته می‌شود باید ترجمه شود. برای این کار، خط زیر را به‌عنوان اولین خط در تابع say اضافه کنید:

    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    این متن را به زبان کاربر ترجمه می‌کند.

  4. در تابع processAudio، متن از صدای ضبط شده با فراخوانی String text = speechToText.convertSpeechToText(); بازیابی می‌شود. پس از این فراخوانی، متن را ترجمه کنید:

    String text = speechToText.convertSpeechToText();
    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    این متن را از زبان کاربر به زبان استفاده شده در سرور ترجمه می‌کند.

  5. این کد را بسازید، آن را به Wio Terminal خود آپلود کنید و از طریق مانیتور سریال آن را آزمایش کنید. هنگامی که عبارت Ready را در مانیتور سریال مشاهده کردید، دکمه C (دکمه سمت چپ، نزدیک به کلید روشن/خاموش) را فشار دهید و صحبت کنید. مطمئن شوید که برنامه توابع شما در حال اجرا است و یک تایمر را به زبان کاربر درخواست کنید، یا با صحبت کردن به آن زبان یا با استفاده از یک برنامه ترجمه.

    Connecting to WiFi..
    Connected!
    Got access token.
    Ready.
    Starting recording...
    Finished recording
    Sending speech...
    Speech sent!
    {"RecognitionStatus":"Success","DisplayText":"Définir une minuterie de 2 minutes 27 secondes.","Offset":9600000,"Duration":40400000}
    Translating Définir une minuterie de 2 minutes 27 secondes. from fr-FR to en-US
    Translated: Set a timer of 2 minutes 27 seconds.
    Set a timer of 2 minutes 27 seconds.
    {"seconds": 147}
    Translating 2 minute 27 second timer started. from en-US to fr-FR
    Translated: 2 minute 27 seconde minute a commencé.
    2 minute 27 seconde minute a commencé.
    Translating Times up on your 2 minute 27 second timer. from en-US to fr-FR
    Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
    Chronométrant votre minuterie de 2 minutes 27 secondes.
    

💁 می‌توانید این کد را در پوشه code/wio-terminal پیدا کنید.

😀 برنامه تایمر چندزبانه شما موفقیت‌آمیز بود!

سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه انسانی حرفه‌ای استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.