Praatで知覚実験のUIを作成する

# TL; DR

- Praatには知覚実験を行う機能がついている！

![mfc_uipng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/dc5c3de8-cc42-ac21-7e4f-a2bc0061f0fa.png)

https://www.fon.hum.uva.nl/praat/manual/ExperimentMFC_2_1__The_experiment_file.html

# はじめに

Praatは、主に音声学で使用される音声分析、編集ソフトウェアです。音声に関する研究をしている方なら使ったことがあるかもしれません。

https://www.fon.hum.uva.nl/praat/

しかし、Praatが扱えるのは録音データだけではありません。デフォルトで**知覚実験を行うための機能も備わっています**。

今回は、Praatの知覚実験について紹介したいと思います。

~~「ニッチな技術」のテーマにぴったりだったので、学生時代の記憶を引っ張り出して記事にしました。~~

# 知覚実験機能

知覚実験はどうしてもバタバタしがちです。音声刺激を1つずつカチカチ再生しながら実験参加者にExcelで入力してもらう...しかも1行ずれてしまったらやり直しです... :sob:

Praatの知覚実験はUIから作れるので、音声を流すのもクリックするボタンを表示するのもこれ1つで完結します。

![mfc_uipng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/051ab9d6-25cb-c972-3a0a-b6ee8f04751c.png)

音声刺激はランダムに流れるので、実験参加者に画面をクリックしてもらうだけで実験完了です。

![mfc_selected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/e1c5aa09-76c2-b18b-2bfa-5f7a9815a58b.png)

しかも終わったら結果をCSVで吐いてくれます。神

```csv:
subject,stimulus,response,goodness,reactionTime
mfc,hid,i,4,7.2662999629974365
mfc,hood,u,5,3.6908531188964844
mfc,heed,e,4,2.89058518409729
mfc,hud,a,5,2.2594401836395264
mfc,heed,i,4,2.4159739017486572
mfc,hud,a,5,2.174546003341675
mfc,hood,o,4,2.1661901473999023
mfc,hid,i,4,2.455695867538452
mfc,hud,a,5,2.3374791145324707
mfc,hid,i,4,3.0031659603118896
mfc,hood,u,5,3.5072808265686035
mfc,heed,e,4,3.0435638427734375
```

~~ちょくちょく間違えてる~~

各列のデータは以下の通りです。

|列|意味|
|-|-|
|subject|タイトル(`mfc` 固定?)|
|stimulus|音声刺激の名前|
|response|実験参加者が選択した選択肢|
|goodness|実験参加者が選択したgoodness[^goodness]|
|reactionTime|音声が流れてから選択肢を選ぶまでの時間[s]|


# 実行方法
## 準備

実験ファイルと音声刺激ファイルを用意します。今回はリファレンスにあるサンプルを使用します。

https://www.fon.hum.uva.nl/praat/manual/ExperimentMFC_2_1__The_experiment_file.html

```
    "ooTextFile"
    "ExperimentMFC 7"
    blankWhilePlaying? <no>
    stimuliAreSounds? <yes>
    stimulusFileNameHead = "Sounds/"
    stimulusFileNameTail = ".wav"
    stimulusCarrierBefore = "weSayTheWord"
    stimulusCarrierAfter = "again"
    stimulusInitialSilenceDuration = 0.5 seconds
    stimulusMedialSilenceDuration = 0
    stimulusFinalSilenceDuration = 0.5 seconds
    numberOfDifferentStimuli = 4
       "heed" ""
       "hid" ""
       "hood" ""
       "hud" ""
    numberOfReplicationsPerStimulus = 3
    breakAfterEvery = 0
    randomize = <PermuteBalancedNoDoublets>
    startText = "This is a listening experiment.
    After hearing a sound, choose the vowel that is most similar to what you heard.
   
    Click to start."
    runText = "Choose the vowel that you heard."
    pauseText = "You can have a short break if you like. Click to proceed."
    endText = "The experiment has finished."
    maximumNumberOfReplays = 0
    replayButton = 0 0 0 0 "" ""
    okButton = 0 0 0 0 "" ""
    oopsButton = 0 0 0 0 "" ""
    responsesAreSounds? <no> "" "" "" "" 0 0 0
    numberOfDifferentResponses = 5
       0.2 0.3 0.7 0.8 "h I d" 40 "" "i"
       0.3 0.4 0.5 0.6 "h E d" 40 "" "e"
       0.4 0.5 0.3 0.4 "h A d" 40 "" "a"
       0.5 0.6 0.5 0.6 "h O d" 40 "" "o"
       0.6 0.7 0.7 0.8 "h U d" 40 "" "u"
    numberOfGoodnessCategories = 5
       0.25 0.35 0.10 0.20 "1 (poor)" 24 ""
       0.35 0.45 0.10 0.20 "2" 24 ""
       0.45 0.55 0.10 0.20 "3" 24 ""
       0.55 0.65 0.10 0.20 "4" 24 ""
       0.65 0.75 0.10 0.20 "5 (good)" 24 ""
```

以下の音声刺激ファイルもあらかじめ用意しましょう（場所は実験ファイルの相対パス）。

- `Sounds/heed.wav`
- `Sounds/hid.wav`
- `Sounds/hood.wav`
- `Sounds/hud.wav`

自分の声を録音しても良いですが、手っ取り早く試したいならPraatの合成音声を使うのが楽です（「New→Text to speech synthesis」で生成器を作り、「To Sounds」で生成）。

できたら実験ファイルを「Read from file」で読み込み、「Run」で開始し実験参加者にPCを渡しましょう。

![mfc_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/f300ff51-c354-ea74-cb14-69fb2f6a183e.png)

## 結果の出力

実験が終わったら実験のUI画面を閉じ(※Praat自体は閉じないこと！)、「Extract Result」で結果を出力します。

![mfc_extract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/d6ccaa83-717c-d27b-688e-8e8fc3c7d4d4.png)

続いて「Collect To Table」でテーブルオブジェクト化し、CSVファイルへ出力します。

![mfc_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/45a98404-484a-32a9-382d-524471f09aa7.png)

# 実験ファイルの書き方

実験ファイルは独自の形式です。Praat Scriptではないので要注意。
色々設定がありますが、重要なのは以下の2つです。

## 音声刺激

使用する音声刺激のファイル名を指定します。

```
    numberOfDifferentStimuli = 4
       "heed" ""
       "hid" ""
       "hood" ""
       "hud" ""
```

順序は適宜ランダムにシャッフルされます。

```
randomize = <PermuteBalancedNoDoublets>
```

また、同じ刺激を何回繰り返すかも指定できます。下記の例では4刺激を3回、計12回音声が流れます。

```
numberOfReplicationsPerStimulus = 3
```

各刺激の前後に流れる音声「We say the word」「again」はここで指定しています。

```
    stimulusCarrierBefore = "weSayTheWord"
    stimulusCarrierAfter = "again"
```

## ボタンの配置

ボタンの配置は以下で管理しています。上から順に音声刺激、goodnessのボタンです。
なんといっても**レイアウトを自在にカスタムできるのが便利**です。

```
    numberOfDifferentResponses = 5
       0.2 0.3 0.7 0.8 "h I d" 40 "" "i"
       0.3 0.4 0.5 0.6 "h E d" 40 "" "e"
       0.4 0.5 0.3 0.4 "h A d" 40 "" "a"
       0.5 0.6 0.5 0.6 "h O d" 40 "" "o"
       0.6 0.7 0.7 0.8 "h U d" 40 "" "u"
    numberOfGoodnessCategories = 5
       0.25 0.35 0.10 0.20 "1 (poor)" 24 ""
       0.35 0.45 0.10 0.20 "2" 24 ""
       0.45 0.55 0.10 0.20 "3" 24 ""
       0.55 0.65 0.10 0.20 "4" 24 ""
       0.65 0.75 0.10 0.20 "5 (good)" 24 ""
```

列は左から座標（左下が原点）、ボタンのラベル、フォントサイズ、ショートカットキー（ボタンを押す代わりにキー入力で選択可能）、対応するレスポンス（例では `i` を選択）です。

```
# left right bottom top label   fontsize shortcut response
  0.2  0.3   0.7    0.8 "h I d" 40       ""       "i"
```

ショートカットキーは自分で動作確認をする際に楽ができるので良さそうです。

# おわりに

以上、Praatの知覚実験UIの紹介でした。本記事では取り上げられなかった高度な設定がまだまだあるので、詳細は公式リファレンスをご覧ください。

https://www.fon.hum.uva.nl/praat/manual/ExperimentMFC_2__The_first_example.html

[^goodness]: 音声刺激がどれだけ良いかを採点してもらいます。リファレンスには具体的な定義が書いていないので「どれだけ自然に聞こえたか」を付けてもらっていましたが、実際は何を入れるのが良いのでしょうか...?