[deprecated]Windows10でtorchaudioをインストールする

# リポジトリに沿って普通にインストールしてください

# はじめに
&nbsp; 先程torchaudioを私の環境(Windows10 conda)にインストールしようと思ったらできなかったので、今後そういう方のために解決方法を残しておきます。
ちなみに、ここに示すものは[PyTorch Forum](https://discuss.pytorch.org/t/problem-installing-torch-audio-on-windows-10-conda/38204)に載っているものです。できる限り、これに沿って説明します。

# 手順

### 下準備
作業用ディレクトリを作成して移動します。

```
$ mkdir workdir
$ cd workdir
```

以下のコマンドを実行してsoxをクローンします。

```
$ git clone git://git.code.sf.net/p/sox/code sox
```

これから、CMakeプロジェクトをビルドします。
私の場合は上のリンクで説明されていた方法と同様にVisualStudio2019で行いましたので、以下ではその方法を示します。
必要に応じてインストールしてください。

### lpc10.lib
ここでは、lpc10.libを生成するために手順を踏んでいきます。

1. VisualStudio2019を開いて**ローカルフォルダーを開く**を選択します。
![2020-05-22 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212867/e85f8875-dd4e-5f1e-f6b7-eb7f7da19618.png)

2. 先程クローンしたsoxフォルダ内にある**lpc10**フォルダ(sox/lpc10)を選択します。
3. 開いたら、画面上のメニューバーから**ビルド->すべてビルド**を選択してビルドします。(もしくは、ショートカットキー**Ctrl+Shift+B**ですべてビルド)
4. ビルドが終わったらlibファイルが生成されているはずなので、***sox/lpc10/out/build/x64-Debug/lpc10.lib***ファイルを***sox/src/out/build/x64-Debug***にコピーします。

これで、lpc10.libについて終了です。

### gsm.lib
1. 上のlpc10.libと同様に、VisualStudio2019を開いて、**ローカルフォルダーを開く**を選択します。
2. ただし、次はsoxフォルダ内の**libgsm**(sox/libgsm)を選択して開きます。
3. 開いたら、同様にメニューバーの**ビルド->すべてビルド**を選択してビルドします。
4. ビルドが終わったら同様にlibファイルが生成しているはずなので、***sox/libgsm/out/build/x64-Debug/gsm.lib***ファイルを***sox/src/out/build/x64-Debug***にコピーします。

これで、gsm.libについて終了です。

### libsox.lib
やっとsox.libのビルドに入ります。ここでは、ソースコードの中身を少しいじります。

1. 上と同様に今度は、***sox/src***を**ローカルフォルダーを開く**で選択して開きます。
2. ソリューションエクスプローラーから**CmakeLists.txt**を開いて、最初の行に**project(sox)**を追加します。追加するとおそらく下のようになると思います。

```cmake
# 最初の行に追加
project(sox)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}config.h)

include_directories(${CMAKE_CURRENT_BINARY_DIR})
```

3.ソリューションエクスプローラーから**sox_i.h**を開いて、25行目の```#include <stdlib.h>```の下に、以下のコードを追加します。

```c
#include <wchar.h> /* For off_t not found in stdio.h */
#define UINT16_MAX  ((int16_t)-1)
#define INT32_MAX  ((int32_t)-1)
```
4.ソリューションエクスプローラーから**sox.c**を開いて38行目の```#include <time.h>```の下に、以下のコードを追加します。

```c
#include <sys/timeb.h>
```

5.これで、準備が終わったので先程同様メニューバーからビルド->すべてビルドを選択してビルドをします。

ビルドが終われば**sox/src/out/build/x64-Debug**に**libsox.lib**が生成されていると思うので、これでlibsox.libについては終了です。

ここで、ビルド中にエラーが発生した場合は**lpc10.lib**や**gsm.lib**が***sox/src/out/build/x64-Debug***にコピーされていることを確認してください。

### 生成したファイルのコピー
次に、これまで生成した3つのファイル、**lpc10.lib**、**gsm.lib**、**libsox.lib**をpython環境にコピーします。

例えば、condaで**torch**という名前の環境を作成したとすると、**Anaconda3/envs/torch/libs**に3ファイルをコピーします。このとき、libsox.libをコピーしたら、そのファイル名を**sox.lib**に変更してください。
私の場合は、**C:/Users/my_name/Anaconda3/envs/torch/libs**にlpc10.lib、gsm.lib、libsox.libをコピーしました。
各々自分のAnaconda環境に応じてコピーしてください。
説明が分かりづらいかもしれないので、念の為PyTorch Forumに載っていたコマンドを載せておきます。これならわかりやすいと思います。

```
$ cp sox/src/out/build/x64-Debug/libsox.lib envs\<envname>\libs\sox.lib
$ cp sox/src/out/build/x64-Debug/gsm.lib envs\<envname>\libs
$ cp sox/src/out/build/x64-Debug/lpc10.lib envs\<envname>\libs
```

### torchaudio
ようやく、torchaudioのインストールに入ります。

1. コマンドライン上で、先程ファイルをコピーしたconda環境をactivateします。

```
$ activate torch
```

2.次に、torchaudioをクローンします。ここでは、PyTorch Forumに合わせてthaudioというディレクトリ名でクローンしていますが、何でも構いません。

```
$ git clone https://github.com/pytorch/audio thaudio
```

3.thaudio内の**setup.py**のコードを少し変えます。**thaudio/setup.py**を開いて、52行目を以下のように変更します。

```python
if IS_WHEEL or IS_CONDA:
    # 省略
else:
    # libraries += ['sox'] ← こうなっていたものを下のように変更
    libraries += ['sox', 'gsm', 'lpc10']  # 52行目
```

4.ここでいじるファイルがPyTorchForumの内容と違います。(試してませんが、もしかしたら変更なしでも動作するかもしれません)
**thaudio/torchaudio/csrc/sox.cpp**を開いて、297行目に```char* sox_args[max_num_eopts]```とあるのですが、それを以下のように変更します。

```c++
// 元は、char* sox_args[max_num_eopts]
char* sox_args[20];
```

その周辺のコードを示すと、

```c++
for(SoxEffect tae : pyeffs) {
    if(tae.ename == "no_effects") break;
    e = sox_create_effect(sox_find_effect(tae.ename.c_str()));
    e->global_info->global_info->verbosity = 1;
    if(tae.eopts[0] == "") {
      sox_effect_options(e, 0, nullptr);
    } else {
      int num_opts = tae.eopts.size();
      /////////////////////////////////
      ///// ここです。
      // 元は、char* sox_args[max_num_eopts]
      char* sox_args[20];
      ////////////////////////////////
      for(std::vector<std::string>::size_type i = 0; i != tae.eopts.size(); i++) {
        sox_args[i] = (char*) tae.eopts[i].c_str();
      }
      if(sox_effect_options(e, num_opts, sox_args) != SOX_SUCCESS) {
#ifdef __APPLE__
        unlink(tmp_name);
#endif
        throw std::runtime_error("invalid effect options, see SoX docs for details");
      }
    }
    sox_add_effect(chain, e, &interm_signal, &output->signal);
    free(e);
  }
```

以上で、全ての準備が整いました。
以下のコマンドでインストールして終了です。

```
$ cd thaudio
$ python setup.py install
```

お疲れさまでした。

# おわりに
この記事では、Windows10環境でtorchaudioを入れる方法を[これ](https://discuss.pytorch.org/t/problem-installing-torch-audio-on-windows-10-conda/38204/9)のパクリですが紹介しました。
もしかしたら、Windowsで入れられなかったのがForumの方と私だけかもしれませんが同じ状況の方のために書きました。(他にどなたか書かれてたら申し訳ない)
動作テストですが、インストール後[TORCHAUDIO TUTORIAL](https://pytorch.org/tutorials/beginner/audio_preprocessing_tutorial.html)を実行できたので、正常に動作していると思います。