چندماه پیش بود که مطلبی در مورد ماژول تشخصی گفتار آفلاین VC-01 منتشر کردم، واقعا جالب و شگفت انگیز بود قابلیت این ماژول در سرعت و دقت، حالا بعد از مدتی برگشتم سراغش تا ببینم آیا میشه به راحتی خودمون براش کلمه تعریف بکنیم و دستورات و عملکرد هایی که میخوایم رو براش مشخص کنیم. جواب مثبت بود و اینکار شدنی بود، اونهم به صورت رایگان (هزینه ای بابت sdk نیاز نیست پرداخت کنید) علاوه بر اون خییلی راحت. خلاصه که حیفم اومد با شما به اشتراک نزارم، پس با سیسوگ همراه باشید تا sdk خودمون رو برای ماژول VC-02 بسازیم.
ماژول AI Thinker VC-02
اول از همه باید بگم که ماژول های تشخیص گفتار آفلاین شرکت ai thinker دو مدل هستند VC-01 و VC-02. اینطور که در مشخصات ارائه شده توسط این شرکت مشخصه این دوتا ماژول تفاوت خاصی ندارند، فقط VC 02 جدیدتر هست و از نظر ابعادی تقریبا نصف VC 01، ما هم در این آموزش از ماژول VC 02 استفاده میکنیم.
در ادامه مشخصات این ماژول رو میتونید بررسی کنید.
Kernel •
32bit RISC core, running at 240MHz
Support DSP instruction set and FPU floating-point operation Unit
FFT Accelerator: Support 1024-point complex FFT/IFFT operations, or 2048-point real
FFT/IFFT operations
Unisound customized speech algorithm operator
Storage •
Built-in 242KB high-speed SRAM
Built-in 2MB FLASH
Audio input and output •
Supports 1 analog Mic input, SNR ≥ 94dB
Support 4-channel digital Mic input
Support dual-channel DAC output
Supports I2S input/output
Power supply and clock •
Support 3.6 V-5V Range Power Input
Built-in 5V to 3.3V,3.3V to 1.2V LDO power the chip
RC 12MHz clock source and PLL locked loop clock source
Built-in POR(Power on Reset), low voltage detection and watchdog
Peripheral •
All GPIOs can be configured as external interrupt input and wake-up source
1 full-duplex UART with a maximum rate of 3Mbps.
Support SPI, I2C, ADC, PWM interface
این تصویر خود ماژول هست.
و این هم برد توسعه ای که توسط خود ai thinker ارائه شده.
شما میتونید تا 150 دستور رو در این ماژول ذخیره کنید که زیادم هست.
ساخت SDK
برای ساخت sdk باید از سایت voice ai-thinker استفاده کنیم، اول از همه یک حساب کاربری توی سایت میسازیم، بعد از اون از منوی کناری گزینه create product رو انتخاب میکنیم. این قسمت دسته بندی تا اونجا که متوجه شدم تاثیری توی خروجی کار نداره و خیلی مهم نیست که چی انتخاب میکنید، اما ما اینجا lamps -> cw light رو انتخاب میکنیم.
شاید برای شما مفید باشد: آموزش الکترونیک از 0 تا 100
حالا دسته offline و سپس ماژول VC 02 رو انتخاب میکنیم.
بعد هم اسم دلخواه و زبان رو انتخاب کنید و save کنید.
در ابتدای مرحله بعد باید وضعیت پین ها رو مشخص کنید که ما تغییری در اون نمیدیم.
حالا در قسمت Wake-up word customization باید جملاتی که میخواید ماژول با اونها بیدار بشه و شروع به دریافت دستورات صوتی بکنه رو مشخص کنید.
در قسمت Customize offline command words and response words جملاتی که میخوایم به عنوان یه دستور شناخته بشند رو مشخص میکنیم، قسمت behavior برای این هست که بعدا داخل کد بتونیم مشخص کنیم برای هر دستور چه کاری انجام بده، قسمت command word هم متن دستور ما هست، البته میتونیم برای هر دستور چند جمله مختلف مشخص کنیم که همه اونها یک کار رو انجام بدند، اینکار با اضافه کردن ” | ” بین جملات انجام میشه.
در قسمت Wake-up-free command words میتونید یکسری دستورات رو مشخص کنید که نیازی به wake up نداشته باشند و خود دستور رو هر موقع گفتید عمل کنه.
در قسمت boot broadcast هم میتونیم یک جمله رو مشخص کنیم که تا ماژول روشن شد بگه.
حالا دکمه make new version رو میزنیم و بعد از اون دکمه build sdk رو میزنیم و بعد چند دقیقه میتونیم sdk رو دانلود کنیم.
کامپایل SDK
برای کامپایل sdk لازمه که از لینوکس استفاده کنید. من از ubuntu18.04 استفاده میکنم
اول از همه این پکیج ها رو نصب میکنیم.
1 2 3 | sudo apt-get install python sudo apt-get install lame sudo apt-get install lib32stdc++6 lib32z1 lib32ncurses5 lib32bz2-1.0 |
اگر دستور آخر به ارور خورد از این دستور استفاده کنید.
1 | sudo apt-get install lib32stdc++6 lib32z1 lib32ncurses5 libbz2-1.0:i386 |
بعد از اون باید فایل های این ریپازیتوری رو دانلود کنیم و در پوشه /opt/Andestech بریزیم که با این دستور انجام میشه.
1 | sudo git clone https://gitee.com/seahi007/andestech.git /opt/Andestech |
حالا فایل sdk رو که از سایت دانلود کردیم توسط یک ادیتور باز میکنیم.
بعد از اون باید فایل hb_auto_gpio.c رو که در مسیر uni_hb_m_solution/unione_lite_app_hb_m/user/src/examples هست به صورت زیر تغییر بدیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include "user_config.h" #include "user_event.h" #include "user_gpio.h" #include "user_player.h" #include "user_pwm.h" #include "user_timer.h" #include "user_uart.h" #define TAG "auto_gpio" #define UART_SEND_MAX 16 typedef struct { char data[UART_SEND_MAX]; int len; } uart_data_t; const uart_data_t g_uart_buf[] = {}; static void _custom_setting_cb(USER_EVENT_TYPE event, user_event_context_t *context) { event_custom_setting_t *setting = NULL; if (context) { setting = &context->custom_setting; LOGT(TAG, "user command: %s", setting->cmd); if (0 == uni_strcmp(setting->cmd, "fadeIn")) { int i; for ( i = 0; i <= 100; i++){ user_pwm_change_duty(PWM_NUM_1_B2, i); uni_msleep(10); } }else if (0 == uni_strcmp(setting->cmd, "fadeOut")){ int i; for ( i = 100; i >= 0; i--){ user_pwm_change_duty(PWM_NUM_1_B2, i); uni_msleep(10); } }else if (0 == uni_strcmp(setting->cmd, "turnOn")){ user_gpio_set_value(GPIO_NUM_B3, 1); }else if (0 == uni_strcmp(setting->cmd, "turnOff")){ user_gpio_set_value(GPIO_NUM_B3, 0); } else{ LOGT(TAG, "Unconcerned command: %s", setting->cmd); } user_player_reply_list_random(setting->reply_files); } } static void _register_event_callback(void) { user_event_subscribe_event(USER_CUSTOM_SETTING, _custom_setting_cb); } int hb_auto_gpio(void) { user_gpio_init(); user_gpio_set_mode(GPIO_NUM_A25, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_A25, 0); user_gpio_set_mode(GPIO_NUM_A26, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_A26, 0); user_gpio_set_mode(GPIO_NUM_A27, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_A27, 0); user_gpio_set_mode(GPIO_NUM_A28, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_A28, 0); user_gpio_set_mode(GPIO_NUM_B6, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_B6, 0); user_gpio_set_mode(GPIO_NUM_B7, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_B7, 0); user_gpio_set_mode(GPIO_NUM_B3, GPIO_MODE_OUT); user_gpio_set_value(GPIO_NUM_B3, 0); user_pwm_init(PWM_NUM_1_B2, 22000, true); user_pwm_start(PWM_NUM_1_B2, 0); _register_event_callback(); return 0; } |
بخش اصلی که ما تغییر دادیم تابع _custom_setting_cb هست که در اون میگیم اگر هر کدوم از دستورات دریافت شد چه کاری انجام بده.
بعد از اون به پوشه /uni_hb_m_solution/unione_lite_app_hb_m میریم و این دستور رو میزنیم تا پروژه کامپایل بشه.
1 | ./build.sh update |
فایل خروجی ما در این مسیر قابل دسترسی هست.
1 | uni_hb_m_solution/unione_lite_app_hb_m/output/uni_app_debug_update.bin |
حالا برای پروگرام باید از ویندوز و نرم افزار UART burning tool استفاده کنیم.
بعد از انتخاب فریمور، با زدن اون دکمه چینی پایین سمت راست صفحه منتظر ریست شدن ماژول میشه و بعد که ماژول رو بهصورت دستی ریست کردیم فریمور شروع به آپلود شدن میکنه.
این هم از فیلم تست ماژول
سلام در قسمت other configuration یکجایش تایم اوت گفته بزارید که مثلا اگر کاربر ۱۰ ثانیه صحبت نکرد پیغامی رو بگه …. من بعد از پخش این پیام دیگه کار نمیکنه و مجبورم خاموش و روشن کنم راهکار چیه بخواهیم این اتفاق نیفته و اگر کسی چیزی نگه بازم مثل روال کار خودش رو کنه
سلام. من تست کردم مشکلی نداشته.
بررسی کنید که فریمور درست رو روی ماژول ریخته باشید
سلام ، موقع ثبت نام توی سایت شماره تلفن لازم داره ، باید از شماره مجازی برای ثبت استفاده کرد ؟ چه کشور هایی رو قبول میکنه ؟
سلام
اصلا نیازی به شماره تلفن نیست
اون بخش verifaction code مال ایمیل هست و کد رو براتون ایمیل میکنه
اشتباه نوشته phone verifaction code
سلام موقع نصب پکیج هایی که گفتید ارور unable to locate package lib32ncurses5 رو به من میده چیکار میتونم بکنم
سلام از چه توزیع لینوکس و چه نسخه ای استفاده میکنید ؟
ubuntu-22.04.2
مشکل از نسخه لینوکس هست
پیشنهاد میکنم نهایتا از نسخه ubuntu 18.04 استفاده کنید
یعنی یا 18.04 یا 16
چون بعد از این مشکل ممکنه به مشکلات دیگه ای هم بر بخورید
سلام در قسمت other configuration یکجایش تایم اوت گفته بزارید که مثلا اگر کاربر ۱۰ ثانیه صحبت نکرد پیغامی رو بگه ….
من بعد از پخش این پیام دیگه کار نمیکنه و مجبورم خاموش و روشن کنم
راهکار چیه بخواهیم این اتفاق نیفته
و اگر کسی چیزی نگه بازم مثل روال کار خودش رو کنه
سلام. ماژول نمیتونه همیشه توی حالت فعال باشه و یه time out داره . میتونید بسته به نیاز ماژول رو wake up کنید که این کار میتونه با دستورات صوتی یا با کمک gpio ها باشه
سلام!
آیا امکان تشخیص گفتار فارسی رو هم داره؟
یا فکر میکنید آیا میشه اضافهاش کرد؟
سلام
امکانش رو نداره و قابل اضافه کردن هم نیست
سلام
این ماژول رو از کجا تهیه کردید ؟
همونطور که در انتهای مطلب اشاره شده ، از فروشگاه امبددتک میتونید تهیه کنید