Monday, August 30, 2021

Kenapa Harus Berlari...

Saat kerja di Jepang, saya sering dipanggil oleh Pak Bos. Saat awal-awal di panggil, saya mendatanginya dengan berjalan. Pak Bos menyuruh saya berlari. Kalau berjalan saya butuh 1 menit, dengan berlari saya hanya butuh 30 detik. Kalau dalam sehari saya dipanggil 30 kali, maka saya bisa hemat 30 x 30 detik, 900 detik alias 15 menit. Dengan asumsi kerja 20 hari per bulan, saya bisa menghemat 15 x 20 menit alias 300 menit alias 5 jam per bulan. Waktu tsb bisa saya gunakan untuk pekerjaan lainnya. Kenapa harus berlari? Ya karena berlari mempercepat pekerjaan dan menunjukkan semangat kita.

Dalam tulisan saya yang lain: What we can do in 10 minutes, orang lain bisa mentransformasikan ide menjadi "produk" dalam 10 menit. Diberikan waktu 300 menit akan menghasilkan 10 ide  --> 10 produk, untuk orang tersebut.

Ayo berlari...!

Monday, August 23, 2021

How-to: Install jedi-vim in python 2.7

Rationale:

  • Although nowadays python3 becomes standard, in some servers the default python is still python2.7 (mostly RHEL servers).
  • Using vim (or emacs) in remote works is a must. You may use GUI, but the setup is more complicated than CLI.
  • Using vim without plugins is hard. We should use a minimum number of plugins. The most important plugin is code completion.
  • Humans make errors inevitably. Code completion prevents typos.

Based on those rationales, this is one line command to install jedi-vim (including jedi itself!) in python 2.7.

git clone --recursive https://github.com/davidhalter/jedi-vim.git --branch 0.9.0 ~/.vim/bundle/jedi-vim
Note: you need to install vim-pathogen first to allow plugin installation via "bundle" directory.

Thursday, August 19, 2021

Kenapa Harus Meng-CC email ke Diri Sendiri

Salah satu budaya "aneh" orang Jepang yang akhir-akhir ini mulai saya tiru adalah meng-cc email ke diri sendiri.

Saat awal datang ke Jepang, saya merasa aneh saja ada orang mengemail ditujukan (CC, carbon copy) ke diri sendiri. Professor saya melakukannya. Professor-professor lain pun ternyata juga sama. Saat itu professor saya meminta saya meng-CC email ke diri saya setiap kali mengemail beliau, namun saya jarang melakukannya. Sepuluh tahun berlalu, kini kebiasaan itu menjadi wajib bagi saya.

Kenapa harus meng-cc email ke diri sendiri?

Agar kita tahu, apakah email kita sampai atau tidak. Seseorang mungkin akan berargumen, kalau tidak sampai pasti ada notifikasi. Bisa jadi benar, tapi bisa jadi tidak semua email provider memberikan notifikasi jika ada email yang bouncing (tidak terkirim karena alasan teknis, misal alamat tidak tersedia, atau email tujuan penuh, atau alasan yang lain). Kalaupun toh pasti ada notifikasi jika tidak terkirim, tetap kita dapat mengambil manfaat, yakni lamanya waktu pengiriman. Alih-alih mengirim email dua kali (ganda), kita bisa mengecek apakah email yang kita kirim sudah diterima atau belum.

Monday, August 16, 2021

Install sox locally in cluster without root

This time, I can't install homebrew in (AIST) cluster as I previously did in JAIST cluster. Here are steps to documents how to install SoX, one of the most important library in sound processing, locally in cluster. I tried these steps in abci.ai.

# download sox package, in this case
wget https://nchc.dl.sourceforge.net/project/sox/sox/14.4.2/sox-14.4.2.tar.gz

# extract sox package
tar xvfz sox-14.4.2.tar.gz

# change to extracted sox directory
cd sox-14.4.2

# configure in local directory, I used $HOME
./configure --prefix=$HOME

# make
make

# make install
make install
Then check it by its version
[user13432@es2 ~]$ sox --version
sox:      SoX v14.4.2
You may also need to update $PATH to make it works in your enviroment.

Wednesday, August 11, 2021

Kenapa Harus Email, bukan WA

TL;DR: Kalau saya jadi CE0, dan ada karyawan saya yang menggunakan WA untuk urusan kerja, akan saya pecat saat itu juga... :D

Pada tulisan ini saya berargumen bahwa komunikasi untuk urusan pekerjaan seharusnya (dan umumnya) dilakukan menggunakan email, bukan WA (WhatsApp), messenger, chat dan sejenisnya. Di tempat kerja saya kebetulan tidak ada yang memakai WA; LINE kabarnya juga sudah dilarang sejak beberapa tahun yang lalu. Sebagai tambahan, penggunaan aplikasi zoom juga dilarang karena faktor keamanan.

Sebelum membaca tulisan ini ada baiknya anda membaca tulisan berikut: WA: Pemborosan Waktu..?

Kenapa harus menggunakan Email: 

  1. Terekam, recorded
  2. Salah satu fitur email yang paling powerful adalah "terekam". Apa isi email, kapan terkirim, dari siapa, ke siapa, semua ada. Bahkan email pertama yang saya buat waktu SMP masih bisa saya baca sampai sekarang. WA? Bisa! Tapi saya tidak tahu apa isi WA pertama saya. Anda tentu paham maksud saya, dua-duanya memiliki fitur terekam, tapi bak langit dan bumi.
  3. Searchable, ketercarian
  4. Fitur kedua yang amat saya sukai dari email: ketercarian. Data teks adalah data yang sangat kompleks tapi fleksibel. Kita bisa mencari apa saja yang pernah masuk ke email kita. WA? Bisa juga, selama belum dihapus, belum ganti hape, dan belum ganti nomor.
  5. Per topik
  6. Pentingnya menggunakan email adalah bisa berdiskusi per topik. Ada yang  mengirim email dengan subjek tertentu dan kita balas (Re:XXX). Berapapun panjang dan lama diskusi tersebut tidak masalah. Ini akan menjadi masalah dengan WA dengan layar kecil, ketercarian dan rekaman yang terbatas.
  7. Universal
  8. Email itu universal dan cross-platform, tidak di monopoli oleh perusahaan tertentu. Anda pakai yahoo, saya pakai gmail, tidak menjadi masalah, masih bisa berkirim email. Beda dengan WA, LINE, messenger, dan sejenisnya yang hanya berjalan pada platform yang sama.
  9. Email menempel pada akun, bukan nomor HP
  10. Kelebihan email selanjutnya adalah bahwa dia adalah akun independen, tidak menempel pada nomor HP. Nomor HP bisa digunakan untuk pengamanan ganda. Berbeda dengan WA yang menempel pada nomer HP. Jika ganti nomor kita harus mentransfer akun WA ke nomor baru. Jika tidak, by default, prinsipnya, ganti nomor ganti WA.

Itulah beberapa alasan kenapa harus menggunakan email untuk komunikasi tulisan dalam urusan pekerjaan. Lebih khusus lagi, kita seharusnya menggunakan email kerja (kantor) untuk urusan pekerjaan, bukan email personal atau individu. Tempat kita bekerja menyediakan email kantor untuk urusan pekerjaan (tidak berlaku jika kantor tidak menyediakan). Sampai sekarang pun saya tidak tahu email lain atasan saya selain email kantor (dan Slack!).

Semoga semakin banyak orang yang "hijrah" dan "bertobat" setelah membaca tulisan ini: tidak memakai WA lagi.

Jika tidak setuju dengan argumen saya ini, tulis alasan anda dan beritahu saya (setidaknya URLnya) melalui komen di bawah ini.

Wednesday, August 04, 2021

Extracting Emobase Feature Using Python-Opensmile under Windows (WSL)

This article documents my steps to extract acoustic features with "emobase" configuration on opensmile-python under Windows. I used WSL (Window Sub-System for Linux) with Ubuntu Latest (20.04). Click each image for larger size and clarity.

0. Windows Version

Here is my Windows version in which I experimented with. Other versions may give errors. To show your version, simply press the Windows button and type "about PC".
Edition	        Windows 10 Pro
Version	        20H2
Installed on	‎4/‎2/‎2021
OS build        19042.1083
Experience      Windows Feature Experience Pack 120.2212.3530.0

1. Activate WSL2

Here are the steps to activate WSL2 on Windows 10. WSL2 only works on Windows 10 version 1903 or higher, with Build 18362 or higher. For the older version, you can use WSL instead of WSL2.
a. Activate WSL using PowerShell. Press the Windows key, and enter the following.
 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 
b. Install Linux kernel update package. Download from here.
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
Double click and install that .msi package.
Select WSL2 as default.
 wsl --set-default-version 2 

You need to ensure the wsl version after installing Ubuntu distro below.

2. Install Ubuntu

Press windows key and type "Microsoft Store". I choose Ubuntu (latest) instead of Ubuntu 20.04 or other versions. See image below; I already installed it.


Ensure that Ubuntu uses WSL2 as default. Check-in PowerShell with the following command (wsl -l -v).

Then click launch Ubuntu from the previous image/step, or you can type "Ubuntu" di search dash.
When launching Ubuntu for the first time, you will be prompted for the user name and password. Remember this credential. See the image below for example.

3. Install Python and pip

In Ubuntu do/type
 sudo apt update && sudo apt -y upgrade 
Enter your password. Type "y" when it is prompted.
Install Python using apt. I chose python3.7 as follows.
 sudo apt install python3.7-full 
Type "y" when it asked. See the image below for reference.

Test if the installation is successful. Type "python3.7" in Ubuntu to enter python3.7 console.

Next, we need pip to install python packages. Hence, we need to install pip first as follows.
 python3.7 -m ensurepip --upgrade 

4. Install Python-Opensmile

Since this version of python in Ubuntu is already equipped with pip, we can directly use it to install opensmile.
 python3.7 -m pip install opensmile 
See the image below for a reference.

Same as previous step, I installed IPython for my convenience. You may also need to install numpy, scipy, and matplotlib.
 python3.7 -m pip install ipython numpy scipy audb

We also need to install sox since it is required by opensmile
 sudo apt install sox 

5. Extract Emobase Feature

Now is the time to use opensmile. First, open IPython console for this python3.7.
 python3.7 -m IPython 
Import Opensmile and download emodb dataset with a specific configuration.
See the image below for your reference. Skip the parts with red cross since they contain errors (I forgot to add a comma between arguments).

Configure opensmile to extract EMOBASE feature.
smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)
smile.feature_names
See image below for your reference. You can change feature_level value to "opensmile.FeatureLevel.LowLevelDescriptors" if you want LLD (LowLevelDescriptors, extracted per frame) instead of functionals (statistics of LLD). The number of emobase functional is 988 features [len(smile.features_names)].

Finally, we extract acoustic features based on these configuration.
smile.process_signal(
    signal,
    sampling_rate
)
See below image for your reference.


That's all. Usually, I save the extracted acoustic features in other format like numpy .npy files or .csv files. From my experience, this is my first extraction of emobase feature set. Previously I used gemaps, egemaps, compare2016, and emo_large configuration. Let see if this kind of feature set has advantages over others. Although intended for Windows 10, this configuration may also works for other distribution. Still, I prefer to use Ubuntu since the process is simple and straightforward. No need to set WSL2 and other things just pip and pip.

The full script to extract emobase functional features from all utterances in emodb dataset is given below. Please note that it takes a long time to process since it will download all utterances in emodb dataset according to "audb" format and extract acoustic features from them.

Example 1: Extract emobase feature from an excerpt of emodb dataset and save it as an .npy file.

import os
import time

import numpy as np
import pandas as pd

import audb
import audiofile
import opensmile

sr = 16000

# if you change code below, it will download the dataset again 
db = audb.load(
    'emodb',
    version='1.1.1',
    format='wav',
    mixdown=True,
    sampling_rate=sr,
    full_path=False,
    verbose=True,
)

smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)

# If you run this program for the second time
# comment the whole db above and change db.root and db.files to (uncomment)
# db_root = audb.cached().index[0]
# db_files = pd.read_csv('/home/bagus/audb/emodb/1.1.1/fe182b91/db.files.csv')['file']

feats = []
for i in db.files:
    file = os.path.join(db.root, db.files[i])
    signal, _ = audiofile.read(
            file,
            always_2d=True,
            )
    feat = smile.process_signal(
            signal,
            sr
            )
    feats.append(feat.to_numpy().reshape(-1))

# this will save all emodb emobase feature in a single npy file
# make sure you have 'data' dir first
np.save('data/emodb_emobase.npy', feats)
  

Example 2: Extract emobase features from files under a directory ("ang") and save it in a csv file.
import os
import opensmile
import numpy as np
import glob
#from scipy.io import wavfile

# jtes angry path, 50 files
data_path ="/data/jtes_v1.1/wav/f01/ang/"
files = glob.glob(os.path.join(data_path, "*.wav"))
files.sort()

# initiate opensmile with emobase feature set
smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)
smile.feature_names

# read wav files and extract emobase features on that file
feat = []

for file in files:
    print("processing file ... ", file)
    #sr, data = wavfile.read(file)
    #feat_i = smile.process_signal(data, sr)
    feat_i = smile.process_file(file)
    feat.append(feat_i.to_numpy().flatten())

# save feature as a csv file, per line, with comma
np.savetxt("jtes_f01_ang.csv", feat, delimiter=",")

  


If you face problems during following this article, let me see in comments below.

Reference:
[1] https://docs.microsoft.com/en-us/windows/wsl/install-win10
[2] https://audeering.github.io/opensmile-python/usage.html

Monday, August 02, 2021

Python: memanggil nama variabel secara dinamis dalam loop for

Misalkan kita punya data seperti ini:
a_1 = 1
a_2 = 2
a_3 = 3
Kemudian kita ingin memanggi variabel tersebut secara berurutan dalam loop for. Karena nama-nama variabel tersebut mirip dan hanya berbeda karakter terakhir saj, maka pemanggilan variabel tersebut bisa kita permudah, misalnya dengan cara "a_[i}", dimana "i" adalah indeks mulai dari i. Saya menggunakan kurung kurawal karena implementasi pada teknik yang dipakai juga seperti itu. Pemanggilan nama variabel secara dinamis seperti ini dalam Python bisa menggunakan fungsi "globals()" seperti berikut.
for i in range(1,4):
    print(globals()[f"a_{i}"])
Outputnya adalah nilai a_1, a_2, dan a_3 secara berurutan.
1
2
3

Perbedaan dengan list biasa 

Untuk menampilkan output di atas bisa saja dengan teknik berikut.
for i in [a_1, a_2, a_3]:
    print(i)
Namun tujuan saya bukan output, tapi proses pemanggilannya. Dalam banyak hal, kita butuh memanggil nama variabelnya saja dan mengakses anggota kelasnya. Misal jika variabel "a_" memiliki child (anak) .panjang, .lebar, .tinggi, maka metode tsb (methods dalam pengertian pemrograman) bisa dipanggil dengan teknik nama variabel dinamis di atas. Akan sulit jika memakai list biasa.
Related Posts Plugin for WordPress, Blogger...