bot

Mac上のPython でDocomoの音声合成APIの音声データ(raw)をwavに保存する[AITalk]

以前の記事「docomoの音声合成APIの音声データ(Binary)をMacで再生する方法 (2つ) 」で試した Docomoの音声合成APIをMacのPythonからWavデータに保存できるようにしました。 (Windowsでは動きません)

環境

  • Mac OS : 10.11.4 (EI Capitan)
  • Python 3.4.1

前準備

docomo Developer supportに登録して、音声合成のAPI_KEYを取得しておく

使い方

1. 以下のソースを保存

ファイル名は適当でもOK。 以下、sample.py で保存したとします。

API_KEYは適時修正してください。

# -*- coding:utf-8 -*- """ Mac上で指定したテキストから、docomoの音声合成APIのバイナリデータをwavデータに保存する """ import os import sys import datetime import argparse import subprocess import requests import pprint # config # =========================================== #バイナリデータの一時保存場所 tmp = "./cache/" # wavデータの保存場所 soundDir = "./sound/" #Docomo 音声合成 API API_KEY = '***********************************************************************' url = "https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY="+API_KEY # aitalk パラメーター設定 # =========================================== """ 参考)音声合成 | docomo Developer support https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=text_to_speech&p_name=api_1#tag01 'speaker' : "nozomi"、"seiji"、"akari"、"anzu"、"hiroshi"、"kaho"、"koutarou"、"maki"、"nanako"、"osamu"、"sumire" 'pitch' : ベースライン・ピッチ。 基準値:1.0、範囲:0.50~2.00 'range' : ピッチ・レンジ。基準値:1.0、範囲:0.00~2.00 'rate' : 読み上げる速度。基準値:1.0、範囲:0.50~4.00 'volume' : 音量。基準値:1.0、範囲:0.00~2.00 """ prm = { 'speaker' : 'nozomi', 'pitch' : '1', 'range' : '1', 'rate' : '1', 'volume' : '1.5' } # パラメーター受取 # =========================================== #%% arguments parser = argparse.ArgumentParser() parser.add_argument('--text', type=str, required=True) args = parser.parse_args() text = args.text # SSML生成 # =========================================== xml = u'<?xml version="1.0" encoding="utf-8" ?>' voice = '<voice name="' + prm["speaker"] + '">' prosody = '<prosody rate="'+ prm['rate'] +'" pitch="'+ prm['pitch'] +'" range="'+ prm['range'] +'">' xml += '<speak version="1.1">'+ voice + prosody + text + '</prosody></voice></speak>' # utf-8にエンコード xml = xml.encode("UTF-8") # Docomo APIアクセス # =========================================== print("Start API") response = requests.post( url, data=xml, headers={ 'Content-Type': 'application/ssml+xml', 'Accept' : 'audio/L16', 'Content-Length' : len(xml) } ) #print(response) #print(response.encoding) #print(response.status_code) #print(response.content) if response.status_code != 200 : print("Error API : " + response.status_code) exit() else : print("Success API") #現在日時を取得 now = datetime.datetime.now() tstr = datetime.datetime.strftime(now, '%Y%m%d-%H%M%S') #保存するファイル名 rawFile = tstr + ".raw" wavFile = tstr + ".wav" #バイナリデータを保存 fp = open(tmp + rawFile, 'wb') fp.write(response.content) fp.close() print("Save Binary Data : " + tmp + rawFile) # バイナリデータ → wav に変換 # =========================================== # macのsoxを使って raw→wavに変換 cmd = "sox -t raw -r 16k -e signed -b 16 -B -c 1 " + tmp + rawFile + " "+ soundDir + wavFile # コマンドの実行 subprocess.check_output(cmd, shell=True) print("Done : " +soundDir + wavFile)

2. 保存フォルダの準備

sample.pyを保存した同じディレクトリ内に、 “cache”,”sound”のディレクトリを作成 書き込み権限を与えておくこと

{作業フォルダ} ├ sample.py ├ cache/ └ sound/

3. 実行

ターミナルで以下コマンドを実行

$ cd {作業フォルダ} $ sample.py --text 音声合成って楽しいですね

成功すれば、sound/*******.wav が保存され、再生できるはず cache内のデータは削除してOK

パラメーターについて

合成音声の話者や読み上げ速度などはSSMLで調整可能となっています。

'speaker' : "nozomi"、"seiji"、"akari"、"anzu"、"hiroshi"、"kaho"、"koutarou"、"maki"、"nanako"、"osamu"、"sumire" 'pitch' : ベースライン・ピッチ。 基準値:1.0、範囲:0.50~2.00 'range' : ピッチ・レンジ。基準値:1.0、範囲:0.00~2.00 'rate' : 読み上げる速度。基準値:1.0、範囲:0.50~4.00 'volume' : 音量。基準値:1.0、範囲:0.00~2.00

パラメーターはAITalkの音声合成デモンストレーション http://www.ai-j.jp/cloud/webapi/で試せます。

ただAPIではデモンストレーションの話者全員を使えないので気をつけること。 APIで使える話者は以下のみ

のぞみ、まき、すみれ、かほ、あかり、ななこ せいじ、おさむ、ひろし、あんず、こうたろう

参考サイト)

Chainer-Slack-Twitter-Dialogueを動かすまでに試行錯誤したメモ

Chainerで学習した対話用のボットをSlackで使用+Twitterから学習データを取得してファインチューニング – Qiita を試そうとしたんですが、所詮フロントエンドエンジニア止まりでにわかプログラマーの私にとっては大変苦労したので、試行錯誤したメモを残します。 結果的にはなんとかSlackでbotが動くまでできました。

これから機械学習を行いたい方、上記のサンプルを動かそうとされて断念さた方のの一助になれば幸いです。

一応、筆者のプログラムレベルを書いときます。

  • python歴 2週間(基本、コードはコピペで済みます)
  • phpやJavaScriptをたまにかく
  • データベースは管理画面で見る程度
  • ターミナルはたまに使う程度(cd,ls,pwd,chmod,Ctrl+cのコマンド程度)

基本方針

上記ページを見ながら環境を構築し、動かしていきます。

環境構築

Chainer-Slack-Twitter-Dialogue をgithubからダウンロードして展開。 以下、展開したフォルダ内{myproject}での作業となります。

ライブラリのインストール

$ brew install virtualenv

brewが使えなかったので pipを使いました。 権限ないとエラーで怒られたので sudo -H で実行

$ sudo -H pip install virtualenv

たぶん、スペルミスっぽい

$ pip install -r requirement.txt ↓ $ pip install -r requirements.txt

これで大丈夫でした

Prepare the Data の準備

PreTrain >[Wikipedia for Japanese]https://dumps.wikimedia.org/jawiki/latest/ Train >[Dialogue Data]https://sites.google.com/site/dialoguebreakdowndetection/

上記は何かのコマンドと思って実行したら、、、全然違いました(汗)

それぞれのURLからデータを取って来いとのことでした。 Qiita記事中で丁寧なコメントのやり取りされてて助かりました(感謝)

https://dumps.wikimedia.org/jawiki/latest/ ここからはWikipediaのデータからタイトルデータで、僕はこの時点で jawiki-latest-all-titles-in-ns0.gz (10MB)をダウンロード

解答したデータ jawiki-latest-all-titles-in-ns0 は {Chainer-Slack-Twitter-Dialogue}/word2vec/ 内に保存

https://sites.google.com/site/dialoguebreakdowndetection/ 対話破綻検出チャレンジさんからは左メニューの 雑談対話コーパス の「4.ダウンロード」から projectnextnlp-chat-dialogue-corpus.zip をダウンロード。

ちなみにNTTドコモの雑談対話APIに使われてるんだとか。

動作確認用に wikipediaのデータを前処理

とにかくテスト用で動かすためにと、ご丁寧にランダムで5000件取得するスクリプトを用意してくれてました。

sh random_choice.sh {wikipediaタイトルデータ名} > {wikipediaタイトルデータ名からランダムに5000件取得されたデータ}

私は以下のコマンドを実行しました。

$ cd {myproject}/word2vec $ sh random_choice.sh jawiki-latest-all-titles-in-ns0 > jawiki-latest-all-titles-in-ns0-rnd5000

word2vec/jawiki-latest-all-titles-in-ns0-rnd5000 がテスト用のデータとして生成されます

Word2Vecのモデル作成

前のテスト用データを指定して実行

$ python word2vec_execute.py --data jawiki-latest-all-titles-in-ns0-rnd5000

こんなエラーが。

FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

–dataで指定したのに通ってない??

word2vec内のファイルword2vec_c.pyx、word2vec_load.py内で ‘test.txt’ がハードコーディングされていた。

以下のように対応。

jawiki-latest-all-titles-in-ns0-rnd5000 → test.txt にリネーム パーミッションに書込権限を与えておく

RuntimeError: h5py is not installed on your environment. Please install h5py to activate hdf5 serializers.

hdf5ってライブラリがないから怒られたのでインストール

$ sudo -H pip install h5py

もう一度、実行

$ python word2vec_execute.py --data jawiki-latest-all-titles-in-ns0-rnd5000

フォルダword2vec内に以下のファイルが生成された

word2vec_chainer.model word2vec.model

どのファイルも10MB以上になっていた。 word2vec.model をテキストエディタで開くと数字の羅列。 1行目が「5000 300」となっていればたぶん成功。 (word2vec_chainer.model は開けなかった)

対話破綻コーパスからjson生成

ここも公式サイトの通りなんですが、日曜プログラマなの私にとってはプログラマ界隈の常識や当たり前のルールがわからず、かなり苦戦しました。 似たような人の手助けになれば幸いです。

1:data というフォルダを作成していただきます。

これはそのままで、作業フォルダ直下にフォルダ[data]を新規作成

{myproject}/data

2:対話破綻コーパスからjson形式のデータを取得して、下記のような形式で各対話のデータを保存したlistファイルを作成します。

この意味が全然わからずに苦労しました。 「listファイル」は拡張子なしのテキストファイルです。 僕がやった方法を順を追って書いていきます。

2-1:jsonを格納するdevフォルダを新規作成

{myproject}/dev/

2-1: 対話破綻コーパスをダウンロードし展開したらjsonファイルを探す

projectnextnlp-chat-dialogue-corpus/json/ ├init100 ├1407287164.log.json └1407219916.log.json … └rest1046 ├1404365812.log.json └1407143708.log.json …

2-3:jsonファイル群を {myproject}/dev/ に複製or異動

ディレクトリは不要で、jsonファイル群を全部devフォルダ直下に入れます。

2-4: jsonのパスを全て書いたlist(テキストファイル)を生成

{myproject}/list

現時点ではこのようなフォルダ構成になるはず

{myproject} ├ dev/ ←jsonファイル群 ├ data/ ←空 ├ list ←テキストファイル ├ word2vec/

3:下記のスクリプトでplayer_1とplayer_2に分けられます。 https://github.com/SnowMasaya/Chainer-Slack-Twitter-Dialogue/blob/master/data_load.py

3-1:上記pythonを実行

$ cd {myproject} $ python data_load.py

▼実行後

{myproject} ├ player_1 ← 生成 ├ player_2 ← 生成

jsonから単語が抽出されたテキストファイルが生成されます。 このテキストに、次の”分ち書き”させる前に、好きな言葉を入れておくことで個性を出せそうです。

4:分けたデータは分ち書きが出来ていないのでmecab-ipadic-neologdを使用したmecabで分ち書きをして 各データの名前を下記のようにしてdataフォルダの直下に保存します。 player_1_wakati player_2_wakati

“分ち書き”というのが最初わかりませんでした。 一言で言うと、文章から単語の区切りや分析を辞書から行うもので、環境の準備が必要でした。

4-1 : 分ち書きのための環境準備

参考サイト)スタバのTwitterデータをpythonで大量に取得し、データ分析を試みる その3 – Qiita

インストールの動作テスト : python 以下のコードをsample.pyとして保存

#!/usr/bin/env python #-*- coding:utf-8 -*- import MeCab as mc t = mc.Tagger('-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/') sentence = u'今日は良い天気ですが、雨ですね。キャラメルマキアートがうまいです。' text = sentence.encode('utf-8') node = t.parseToNode(text) # 先頭行はヘッダのためスキップ while(node): if node.surface != "": print node.surface +"\t"+ node.feature node = node.next if node is None: break

sample.py を実行

$ python sample.py 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 良い 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ 天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス が 助詞,接続助詞,*,*,*,*,が,ガ,ガ 、 記号,読点,*,*,*,*,、,、,、 雨 名詞,一般,*,*,*,*,雨,アメ,アメ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ 。 記号,句点,*,*,*,*,。,。,。 キャラメルマキアート 名詞,固有名詞,一般,*,*,*,キャラメル・マキアート,キャラメルマキアート,キャラメルマキアート が 助詞,格助詞,一般,*,*,*,が,ガ,ガ うまい 形容詞,自立,*,*,形容詞・アウオ段,基本形,うまい,ウマイ,ウマイ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 。 記号,句点,*,*,*,*,。,。,。

成功!

4-2: player_1、player_2を分ち書き

{myproject} ├ player_1 ├ player_2

実行前にmecabのパスを確認

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"; /usr/local/lib/mecab/dic/mecab-ipadic-neologd

2ファイルを分ち書き実行

$ mecab -Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd player_1 > data/player_1_wakati $ mecab -Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd player_2 > data/player_2_wakati

data/player_1_wakati をテキストエディタで開くと 単語間に半角スペースの区切りが入ったのがわかると思います。 英語だと必ず単語ではスペースが空きますが日本語では空かないからこの処理が必要なんですね。

しかし、web系のへたらプログラマとして、生成するファイルには拡張子を付けないのが気持ち悪いのは僕だけでしょうか…

Twitter,Slackの設定

Prepare enviroment.yml : twitterとSlackで設定用のファイルを新規作成する

{myproject}/twitter/enviroment.yml {myproject}/slack/enviroment.yml

を作成して、それぞれにTwitter,Slackの必要なAPI情報とかmecabの辞書のパスを指定する 内容は参考サイトのそのままです、APIの取得リンクも参考になりました。

わからなかったのは、「mecab: your mecab dictionary」 結果として、mecabをインストールした時に指定した –dicdir のことだった。 mecab: /usr/local/lib/mecab/dic/mecab-ipadic-neologd

slack の botは事前に登録が必要

Slack で slackbot じゃない bot を作る | Covelline Developer Blog を参考にbotを作成。 作成したbotはテスト用のチャンネルに招待しておきます。

参考までに{myproject}/slack/enviroment.yml の中身

slack: api_token: xoxb-********-********************** user: bot-sample1 #作成したbotの名前 channel: bot-test #slackでテストするチャンネル名 mecab: /usr/local/lib/mecab/dic/mecab-ipadic-neologd #mecabの辞書フォルダ

※ “channel” の先頭に “#” は入りません!コメント扱いされますw

b'{"ok":false,"error":"channel_not_found"}'

slack/app.python でslackからデータ学習コメント受けた時にこんなエラーが出た人は見直してください。

Slackと連携

$ cd slack $ python app.py

実行した後に、slack側でチャットすると、このターミナルにテキストが表示される(感動

応答の場合のキーワード: chainer:呼びかけの言葉 学習の場合のキーワード: chainer_train

slackから「chainer:テスト」と打つと以下のエラー

Traceback (most recent call last): File "app.py", line 95, in slack.call_method() File "app.py", line 40, in call_method self.__judge_print() File "app.py", line 52, in __judge_print hyp_batch = self.__predict_sentence(src_batch) File "app.py", line 73, in __predict_sentence src_vocab = Vocabulary.load(self.model_name + '.srcvocab') File "../util/vocabulary.py", line 50, in load with open(filename) as fp: FileNotFoundError: [Errno 2] No such file or directory: '../ChainerDialogue.srcvocab'

ChainerDialogue.srcvocab ってファイルがないとあるけど…どこで作るんだ??(後述で紹介) ほんと全然わかってないのに突っ走るのって怖い。

EncoderDecoderModelForward.py の作成

ソースとQiitaの元記事GitHubのIntrodcutionのどこを見ても、手順がどこにも見当たらない。

GitHubのIntrodcution の 2.対話のクラス 3.各値を設定

…これは自分で準備しろってこと??(ハンズオン??)

というわけで {myproject}/EncoderDecoderModelForward.py を新規作成

中身は、GitHubのIntrodcutionのサンプル?なソースコードを順番にコピペ

「1.各種ライブラリ導入」のサンプルコード

#表示用に使用しています。 from util.functions import trace

「2.対話のクラス」のサンプルコード

class EncoderDecoderModelForward(EncoderDecoderModel):

EncoderDecoderModelForward.py の実行

$ python EncoderDecoderModelForward.py # unit: 300 Window : 5 Minibatch-size: 100 # epoch: 10 Traing model: skipgram Output type: original Traceback (most recent call last): File "EncoderDecoderModelForward.py", line 17, in serializers.load_hdf5("word2vec/word2vec_chainer.model", w2v_model) 〜 TypeError: Incompatible object (Dataset) already exists

とエラーが。 “word2vec/word2vec_chainer.model” が開けなかった??

$ python word2vec_execute.py --data jawiki-latest-all-titles-in-ns0-rnd5000

を実行して word2vec_chainer.model を再生成。

この時、word2vec.model に書き込み権限がないと何故かエラーになってので書き込み権限(666)を付与したらOKだった。

$ python EncoderDecoderModelForward.py TypeError: Can't broadcast (0, 300) -> (5000, 300)

このエラーが出たら、word2vec_chainer.model が生成失敗してる可能性大。 ちゃんとしていたら5000件のテストデータからでも10MB程度のデータになってる。 再生成して word2vec.model をテキストエディタで開くと1行目が「5000 300」となってるはず。

$ python EncoderDecoderModelForward.py # unit: 300 Window : 5 Minibatch-size: 100 # epoch: 10 Traing model: skipgram Output type: original

特にエラーが出なかったので成功?? (というかこのファイルだけでは何も起きない)

「4.実行」のために train.py を新規作成

これでいいのかわかりませんが、僕はこれで動きました。

  1. train.py を空で新規作成
  2. 「1.各種ライブラリ導入」「3.各値を設定」「4.実行」のサンプルコードを順番にコピペ
  3. 新規に作成した対話クラスを読み込ませるため、9行目辺りに追記

… from EncoderDecoderModel import EncoderDecoderModel from EncoderDecoderModelForward import EncoderDecoderModelForward #←追記 import subprocess …

train.pyを実行すると処理が始まります(MacBook Airのファンが回り出します)

$ python train.py 2016-05-03 19:44:59.655303 ... initializing ... 2016-05-03 19:44:59.656028 ... making vocabularies ... 2016-05-03 19:44:59.738731 ... making model ... 2016-05-03 19:45:00.145924 ... epoch 1/20: start copy Copy weight_xi start copy Copy weight_jy 2016-05-03 19:45:00.887415 ... epoch 1/ 20, sample 43 2016-05-03 19:45:00.888114 ... src = なるほど * * * * * * * * * * * * * * * 2016-05-03 19:45:00.888706 ... trg = おう * 2016-05-03 19:45:00.889577 ... hyp = デラウェア 歳 2016-05-03 19:47:59.694884 ... epoch 2/20: 2016-05-03 19:48:00.389251 ... epoch 2/ 20, sample 50 2016-05-03 19:48:00.389859 ... src = えっ * * * * * * * * * * * * * * * 2016-05-03 19:48:00.390355 ... trg = えええっ * 2016-05-03 19:48:00.390839 ... hyp = スイカ は

1時間ぐらい待つと作業フォルダ直下に以下のファイルが生成されてました。

ChainerDialogue.weights ChainerDialogue.spec ChainerDialogue.srcvocab ChainerDialogue.trgvocab

やった!Slackのエラー時に出てた ChainerDialogue.srcvocab ができてる! slack実行前にテスト。

動作テスト:bot同士の会話

train.py を複製して train-test.py

最後の方をテストコードに書き換えて保存

--------- trace('initializing ...') encoderDecoderModel = EncoderDecoderModelForward(parameter_dict) encoderDecoderModel.train() --------- ↓ --------- model_name = "ChainerDialogue.021" trace('initializing ...') encoderDecoderModel = EncoderDecoderModelForward(parameter_dict) encoderDecoderModel.test() ---------

実行してみる

$ python train-test.py # unit: 300 Window : 5 Minibatch-size: 100 # epoch: 10 Traing model: skipgram Output type: original 2016-05-03 20:51:30.686674 ... initializing ... 2016-05-03 20:51:30.686760 ... loading model ... 2016-05-03 20:51:31.265107 ... generating translation ... 2016-05-03 20:51:31.265597 ... sample 1 - 64 ... src : こんにちは hyp : こんにちは src : 分からない hyp : そっか src : 昼ごはんは何を食べましたか hyp : ごはんはあったかいです src : へー hyp : なに src : へー hyp : なに src : それで夕食は何を食べるのですか hyp : 夕食がいってないかもですよねえ src : 日本語として変です hyp : 日本語は沖縄で行きますよねー

おおお!!!会話してる!! 放置すると永遠に会話するのでCtrl+Cで止めますw

1万回ぐらい会話してると同じ文章が出てきますが、これはサンプルデータが少ないからでしょうね。 それでも十分会話として成立してて面白い。

Slackでbotとやり取り

$ slack/app.py

slack側からbotに 「chainer:テスト」とチャット送信するとbotが返信!! slack/app.py のターミナルでslackのbotが動いてるのがわかります。

slack側からbotに 「chainer_train:テスト」とチャット送信するとエラー…

FileNotFoundError: [Errno 2] No such file or directory: '../twitter/source_twitter_data.txt' FileNotFoundError: [Errno 2] No such file or directory: '../twitter/replay_twitter_data.txt'

え、どこにこんなファイル作って書いてあるの?? とマニュアル見返しても見つからず…

{myproject}/twitter/内に source_twitter_data.txt replay_twitter_data.txt を空ファイルで新規作成。 一応書き込み権限(666)を与えておく。

再びslack botを起動してchainer_trainで学習させてみる

$ python app.py chainer_train: ナストマくん 2016-05-03 21:22:01.773029 ... making vocabularies ... 2016-05-03 21:22:01.773409 ... making model ... 2016-05-03 21:22:02.394966 ... epoch 1/5: 2016-05-03 21:22:02.413685 ... epoch 2/5: 2016-05-03 21:22:02.429900 ... epoch 3/5: 2016-05-03 21:22:02.450281 ... epoch 4/5: 2016-05-03 21:22:02.473980 ... epoch 5/5: 2016-05-03 21:22:02.495622 ... saving model ... 2016-05-03 21:22:04.914517 ... finished.

おお!学習してくれたっぽい! 学習したどうかテストしてみたいので、chainerで呼びかけてみる。

chainer:ナストマくん b'{"ok":false,"error":"no_text"}'

あれ?? Slack側から何かエラーが出てる?

どうしたのかと思ってFinderを確認すると、以下のファイルのタイムスタンプが変わってて、容量が少なくなってた。

ChainerDialogue.spec ChainerDialogue.srcvocab ChainerDialogue.trgvocab

5000行ぐらい全部空行になってた。

ChainerDialogue.weights はタイムスタンプ変更されてたけど、30MBぐらいあった。

学習の追加に失敗したのかな??

ともかくSlackの応答botまで動かせたのでここまで。 player_1,player_2のテキストデータを上手く事前に準備していれば個性を保たせたbotを作れそうです。

苦労しましたがその分、動かせた時は達成感ありました。

改めてこの素晴らしいサンプルデータを公開してくれた GushiSnowさんに感謝です。

ImportError: No module named ‘yaml’ には PyYAML

Chainerで学習した対話用のボットをSlackで使用+Twitterから学習データを取得してファインチューニング – Qiita を試してる時に遭遇。

・Mac OS X El Capitan ・Python 3.4.1

ImportError: No module named ‘yaml’

と出たので、お決まりの pip で指定されてるモジュールをインストールしようとした

$ sudo -H pip install yaml Downloading/unpacking yaml Could not find any downloads that satisfy the requirement yaml Cleaning up... No distributions at all found for yaml

そんなモジュールは見つからないって怒られる。 調べてみたらPyYAMLというのがあった

$ sudo -H pip install pyyaml

これでOK 誰かのお役に立てれば幸い

参考:Pythonの自然言語処理用パッケージNLTKをインストール – 取引費用ゼロの歴史 ~ アーカイヴズと歴史研究のトリセツ

[未解決]昔のMacBook Pro (Mid 2009) にGPUで演算させるためにCUDAを導入メモ

※未解決で不完全です

3DのレンダリングやAfter Effectなどの映像編集で使われるCUDA(Compute Unified Device Architecture:クーダ)を試そうとした時のメモ。 失敗してますが誰かの何かのお役に立てれば…

きっかけはAIの機械学習のため。 機械学習はめっちゃ時間かかる。余ってる古いMacBook Proにさせようとしたら今のメインのMacBook Airの3倍近くかかってしまう。 しかしこのMacBookProにはグラボ(NVIDIA GeForce 9400Mグラフィックプロセッサ、256MB)が載ってるから、噂のGPUでChainerのCUDA処理ができるんじゃないかと試した次第。

環境

  • MacBook Pro (15-inch, Mid 2009)
  • OS X 10.11.4 (El Capitan)
  • Xcode 7.3
  • python 2.7.11

インストールしたライブラリ

  • CUDA 7.5.26 Driver
  • CUDA 7.5.20 Toolkit
  • cuDNN v5 → v4
  • pycuda
  • chainer 1.8

ほぼこちらのサイトそのままです。非常に参考になりました。 GeForce搭載の旧モデルMacBook ProでCUDAをセットアップする手順のメモ · hnakamur’s blog at github

CUDA 7.5 ドライバのインストール

MAC アーカイブ用CUDA ドライバ | NVIDIA から最新バージョンをダウンロード(この時点では7.5.26 for Mac )

 

特に問題なく完了。 システム環境設定にアイコンが追加される。

 

CUDA 7.5 Toolkitのインストール

CUDA Toolkit | NVIDIA DeveloperからMac OSXのLocal Installerをタブで選択しダウンロード。

Download Target Installer for Mac OSX 10.11 x86_64 cuda_7.5.20_mac.dmg (md5sum: 7f8f3af1ecee93d837b80b93e0251228) Download (1.0 GB)

1.0GBありめっちゃ時間かかった

ダウンロードしたファイルを解凍してインストールするだけ。

 

HDD直下に以下のフォルダができた。

/Developer/NVIDIA/CUDA-7.5/

参考サイトにはREADMEの内容を実行しろとあったけど7.5からしなくていいっぽい

CUDAのPATHを通す

フロントエンドの人間には「パスを通す」というのがいつもわからない。怖くて不安。

参考サイト:Macで.bashrcをいじるとき – Qiita こちらの通りに2つのファイルに書き込む。

.bash_profileと.bashrcファイルがなければ新規に作成。 自分の環境では ~/.bash_profile は既にあり、 ~/.bashrc は新規作成した。

ちなみに “~/” はユーザーのHOMEフォルダを指します。 ターミナルを起動したら一番最初の位置。 FinderだとユーザーのHOMEフォルダ直下。 .から始まる不可視ファイル、フォルダを表示させるようにしていればわかりやすいです。 途中すっ飛ばしてますが、最終的に ~/.bash_profile はこう書きました。

~/.bash_profile

export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" export PATH="/usr/local/cuda/bin:/Developer/NVIDIA/CUDA-7.5/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda/lib/:/Developer/NVIDIA/CUDA-7.5/lib:$LD_LIBRARY_PATH" export DYLD_LIBRARY_PATH="/usr/local/cud/lib:/Developer/NVIDIA/CUDA-7.5/lib:$LD_LIBRARY_PATH" export HDF5_DIR="/usr/local/hdf5" export CUDA_PATH="/usr/local/cuda" eval "$(pyenv init -)" if [ -f ‾/.bashrc ] ; then . ‾/.bashrc fi

CUDAのサンプル生成(この作業は不要)

$ sudo sh /Developer/NVIDIA/CUDA-7.5/bin/cuda-install-samples-7.5.sh Error: target directory missing Usage: cuda-install-samples-7.5.sh Will append NVIDIA_CUDA-7.5_Samples to

エラーが出た。参考サイトにあるように後ろに引数(.)指定が必要だったのでやり直し。

$ sudo sh /Developer/NVIDIA/CUDA-7.5/bin/cuda-install-samples-7.5.sh . Copying samples to ./NVIDIA_CUDA-7.5_Samples now... Finished copying samples.

成功した模様!

と思ったけどこの作業は不要だったみたい。 /Developer/NVIDIA/CUDA-7.5/samples がインストールした時から既にあった。 上記のサンプル生成は不要です。

インストールテストの実行

参考サイトの /samples/0_Simple/asyncAPI を試してみます

$ cd /Developer/NVIDIA/CUDA-7.5/samples/0_Simple/asyncAPI/ $ sudo make /Developer/NVIDIA/CUDA-7.5/bin/nvcc -ccbin clang++ -I../../common/inc -m64 -Xcompiler -arch -Xcompiler x86_64 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 -o asyncAPI.o -c asyncAPI.cu nvcc fatal : The version ('70300') of the host compiler ('Apple clang') is not supported make: *** [asyncAPI.o] Error 1

うーん、エラー… ググってみるとどんぴしゃのページが。ありがたや

nvcc fatal : The version (‘70300’) of the host compiler (‘Apple clang’) is not supported – Qiita

原因はXcodeのバージョン(7.3)が対応してないので以前のバージョン(7.2)を入れることに。

ちなみに参考サイトのダウンロード先はなくなってたので、ここからXcode 7.2をダウンロードしました。 https://developer.apple.com/downloads/ 直接リンク(できるか不明)

参考)http://adcdownload.apple.com/Developer_Tools/Xcode_7.2/Xcode_7.2.dmg

上記参考サイトと同じようにアプリケーションの名前を変更して、2つのバージョンを共存 (ダウンロードとインストールで2時間ぐらいかかりました)

ターミナル上でXcode7.2の方を優先させる Xcode7.2を起動→検証が動いてここでも20分ぐらい

Xcodeの環境設定で タブ[Locations]-> Command Line Tools を Xcode 7.2(7C68)に

参考)ios – Revert Apple Clang Version For NVCC – Stack Overflow

再びコマンド実行

$ cd /Developer/NVIDIA/CUDA-7.5/samples/0_Simple/asyncAPI/ $ sudo make $ sudo make install

無事成功!

Boost のインストール

なんでもC++の凄いライブラリとか(全くわかりません)

参考) Mac OSX 10.10 (Yosemite)にpycudaをインストール: すけひろ日記 【C++】Mac に Boost を インストールした | ちょまど帳

https://sourceforge.net/projects/boost/files/boost/1.60.0/ から boost_1_60_0.tar.gz (90.4MB) を~/Downloads にダウンロード

$ cd ~/Downloads $ tar zxf boost_1_60_0.tar.gz $ cd~/Downloads/boost_1_60_0 $ ./bootstrap.sh --prefix=/opt/local\ $ --with-pyton=python \ $ --libdir=/opt/local/lib \ $ --includedir=/opt/local/include$ ./bjam install $ sudo ./bootstrap.sh --prefix=/opt/local --with-python=<strong>PYTHON</strong> --libdir=/opt/local/lib --includedir=/opt/local/include$ ./bjam install

error: unrecognized option: –with-pyton=python もしこのエラーが出たら –with-python=PYTHON と大文字にすればOKだった

$ sudo ./bootstrap.sh --prefix=/opt/local --with-python=PYTHON --libdir=/opt/local/lib --includedir=/opt/local/include$ ./bjam install Building Boost.Build engine with toolset darwin... tools/build/src/engine/bin.macosxx86_64/b2 Detecting Python version... 2.7 Detecting Python root... /Users/kanauchitooru2/.pyenv/versions/2.7.11 Unicode/ICU support for Boost.Regex?... not found. Generating Boost.Build configuration in project-config.jam... Bootstrapping is done. To build, run: ./b2 To adjust configuration, edit 'project-config.jam'. Further information: - Command line help: ./b2 --help - Getting started guide: http://www.boost.org/more/getting_started/unix-variants.html - Boost.Build documentation: http://www.boost.org/build/doc/html/index.html

上記の結果が出たら、次は下のコマンドでインストール実行

$ sudo ./b2 install -j4 --prefix=/opt/local Performing configuration checks - 32-bit : no - 64-bit : yes - arm : no - mips1 : no - power : no - sparc : no - x86 : yes - symlinks supported : yes - lockfree boost::atomic_flag : yes - has_icu builds : no warning: Graph library does not contain MPI-based parallel components. note: to enable them, add "using mpi ;" to your user-config.jam - zlib : yes

ものすごくターミナルが動き出す。

523 warnings generated. darwin.archive bin.v2/libs/test/build/darwin-4.2.1/release/link-static/threading-multi/libboost_test_exec_monitor.a common.copy /opt/local/lib/libboost_test_exec_monitor.a darwin.compile.c++ bin.v2/libs/wave/build/darwin-4.2.1/release/threading-multi/cpplexer/re2clex/cpp_re.o darwin.link.dll bin.v2/libs/wave/build/darwin-4.2.1/release/threading-multi/libboost_wave.dylib common.copy /opt/local/lib/libboost_wave.dylib ...updated 13046 targets...

1時間半ぐらいかかりました。

Bootが正常にインストールされたか動作テスト こちらの boost_sort_vector.cpp の中身を test.cpp としてテキストエディタで保存(場所は任意)

$ g++ -I/opt/local/include test.cpp -o test.out ld: can't write output file: test for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

sudo じゃないとダメみたいでやり直し

$ sudo g++ -I/opt/local/include test.cpp -o test.out

実行するとディレクトリに test.out というファイルが生成される (なにげC++コンパイル人生初体験)

コンパイルされたファイルを実行する ./ が必ず必要!

$ ./test.out Before sort 3 4 1 2 After sort 1 2 3

動いた!これでBootは大丈夫。

この時点でこのコマンドを試してみる。

$ kextstat | grep -i cuda 146 0 0xffffff7f82cce000 0x2000 0x2000 com.nvidia.CUDA (1.1.0) 5AFE550D-6361-3897-912D-897C13FF6983

CUDAの文字が出てるので大丈夫っぽい

ここまででCUDAとBootはインストールできてるっぽい

CUDA動作確認

NVIDIAの中のサンプルファイルを動かしてみる

$ g++ -I/usr/local/cuda/include -I/Developer/NVIDIA/CUDA-7.5/samples/common/inc /Developer/NVIDIA/CUDA-7.5/samples/1_Utilities/deviceQuery/deviceQuery.cpp

-IでCUDAのライブラリを指定する。ここは適時変更してください。 面倒なんだけどサンプル用のライブラリのパス samples/common/inc も指定しないといけない。

Undefined symbols for architecture x86_64: "_cudaDeviceCanAccessPeer", referenced from: _main in deviceQuery-52061f.o "_cudaDeviceReset", referenced from: _main in deviceQuery-52061f.o void check(cudaError, char const*, char const*, int) in deviceQuery-52061f.o "_cudaDriverGetVersion", referenced from: _main in deviceQuery-52061f.o "_cudaGetDeviceCount", referenced from: _main in deviceQuery-52061f.o "_cudaGetDeviceProperties", referenced from: _main in deviceQuery-52061f.o "_cudaGetErrorString", referenced from: _main in deviceQuery-52061f.o "_cudaRuntimeGetVersion", referenced from: _main in deviceQuery-52061f.o "_cudaSetDevice", referenced from: _main in deviceQuery-52061f.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

うーん、architecture x86_64 が見つからないとエラー Google先生にエラーメッセージでぐぐってみたけどよくわからなかった。 フォルダの中身を見るとMakefileがあるのでMakeを試してみる。

フォルダに移動

$ cd /Developer/NVIDIA/CUDA-7.5/samples/1_Utilities/deviceQuery $ sudo make /Developer/NVIDIA/CUDA-7.5/bin/nvcc -ccbin clang++ -I../../common/inc -m64 -Xcompiler -arch -Xcompiler x86_64 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 -o deviceQuery.o -c deviceQuery.cpp /Developer/NVIDIA/CUDA-7.5/bin/nvcc -ccbin clang++ -m64 -Xcompiler -arch -Xcompiler x86_64 -Xlinker -rpath -Xlinker /Developer/NVIDIA/CUDA-7.5/lib -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 -o deviceQuery deviceQuery.o mkdir -p ../../bin/x86_64/darwin/release cp deviceQuery ../../bin/x86_64/darwin/release

おお、何か動いた! 最後の行に ../../bin/x86_64/darwin/release にコピーしたとあるのでFinderで確認 /Developer/NVIDIA/CUDA-7.5/samples/bin/x86_64/darwin/release/deviceQuery

上記のフォルダにファイルができていたのでダブルクリックで実行

これでいいっぽい。

pycudaのインストール

下記参考サイトの通りに実行

参考サイト)Mac OSX 10.10 (Yosemite)にpycudaをインストール: すけひろ日記

$ cd ~/Downloads $ git clone http://git.tiker.net/trees/pycuda.git $ cd pycuda $ python configure.py

~/Downloads/pycuda/siteconf.py をテキストエディタで編集

BOOST_INC_DIR = ['/opt/local/include'] BOOST_LIB_DIR = ['/opt/local/lib'] BOOST_COMPILER = 'gcc43' USE_SHIPPED_BOOST = True BOOST_PYTHON_LIBNAME = ['boost_python-py27'] BOOST_THREAD_LIBNAME = ['boost_thread'] CUDA_TRACE = False CUDA_ROOT = '/usr/local/cuda' CUDA_ENABLE_GL = False CUDA_ENABLE_CURAND = True CUDADRV_LIB_DIR = ['${CUDA_ROOT}/lib', '${CUDA_ROOT}/lib64', '${CUDA_ROOT}/lib/stubs', '${CUDA_ROOT}/lib64/stubs'] CUDADRV_LIBNAME = ['cuda'] CUDART_LIB_DIR = ['${CUDA_ROOT}/lib', '${CUDA_ROOT}/lib64', '${CUDA_ROOT}/lib/stubs', '${CUDA_ROOT}/lib64/stubs'] CUDART_LIBNAME = ['cudart'] CURAND_LIB_DIR = ['${CUDA_ROOT}/lib', '${CUDA_ROOT}/lib64', '${CUDA_ROOT}/lib/stubs', '${CUDA_ROOT}/lib64/stubs'] CURAND_LIBNAME = ['curand'] CXXFLAGS = ["-arch", "x86_64", "-arch", "i386",'-mmacosx-version-min=10.11', '-isysroot', '/Applications/Xcode7.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk'] LDFLAGS = ["-F/Library/Frameworks", "-arch", "x86_64", "-arch", "i386",'-mmacosx-version-min=10.11', '-isysroot', '/Applications/Xcode7.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk']

参考サイトを見ながら適宜パスを変更しています。

$ cd ~/Downloads/pycuda $ git clone git://github.com/inducer/compyte.git $ cd ~/Downloads/pycuda $ sudo make Password: ctags -R src || true /Applications/Xcode7.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- R usage: ctags [-BFadtuwvx] [-f tagsfile] file ... /Users/kanauchitooru2/.pyenv/versions/2.7.11/bin/python setup.py build *************************************************************** *** WARNING: nvcc not in path. *** May need to set CUDA_INC_DIR for installation to succeed. *************************************************************** running build running build_py running egg_info writing requirements to pycuda.egg-info/requires.txt writing pycuda.egg-info/PKG-INFO writing top-level names to pycuda.egg-info/top_level.txt writing dependency_links to pycuda.egg-info/dependency_links.txt reading manifest file 'pycuda.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.cpp' under directory 'bpl-subset/bpl_subset/boost' warning: no files found matching '*.html' under directory 'bpl-subset/bpl_subset/boost' warning: no files found matching '*.inl' under directory 'bpl-subset/bpl_subset/boost' warning: no files found matching '*.txt' under directory 'bpl-subset/bpl_subset/boost' warning: no files found matching '*.h' under directory 'bpl-subset/bpl_subset/libs' warning: no files found matching '*.ipp' under directory 'bpl-subset/bpl_subset/libs' warning: no files found matching '*.pl' under directory 'bpl-subset/bpl_subset/libs' writing manifest file 'pycuda.egg-info/SOURCES.txt' running build_ext

すごいwarning出てたけどmake install実行

$ sudo make install … Finished processing dependencies for pycuda==2016.1

おお、成功した!

pycudaの動作確認

$ python Python 2.7.11 (default, Apr 17 2016, 02:28:36) [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pycuda.autoinit Traceback (most recent call last): File "", line 1, in File "pycuda/autoinit.py", line 2, in import pycuda.driver as cuda File "pycuda/driver.py", line 5, in from pycuda._driver import * # noqa ImportError: No module named _driver

あれーエラーが出る… 参考サイトをよく見ると、インストール直後はPATHが繋がってないらしい。 ターミナルを再起動してみる。(Mac本体は再起動してない)

$ python Python 2.7.11 (default, Apr 17 2016, 02:28:36) [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pycuda.autoinit Segmentation fault: 11

エラーが消えた! Segmentation fault: 11 はメモリ関係のエラーらしいから気にしない。

NVIDIA cuDNNのインストール

NIVIDAのデベロッパーに登録して申請する必要がある。

登録してログインしたらどこから探していいかわからなかったけど、cuDNNのページにアクセスすると普通に「DOWNLOAD」の項目あった。

cuDNN Download Surveyページは特に何もチェックしなくてもOK。 cuDNN v5 Library for OSX (80MB弱, cudnn-7.5-osx-x64-v5.0-rc.tgz )をダウンロード。

適当な所に保存して展開

$ tar -xzvf cudnn-7.5-osx-x64-v5.0-rc.tgz

以下のファイルが展開される

├ include └ cudnn.h └lib ├ libcudnn_static.a ├ libcudnn.5.dylib └ libcudnn.dylib

上記ファイルを /Developer/NVIDIA/CUDA-7.5/ の libフォルダとinlcludeフォルダにそれぞれコピー。

一度ターミナルを再起動。

puython上で以下の2行を実行して問題なければOKらしい

from chainer import cuda cuda.init()

ターミナル上でパスを指定して pythonを実行

$ LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH python Python 2.7.11 (default, Apr 17 2016, 02:28:36) [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from chainer import cuda >>> cuda.init() /Users/kanauchitooru2/.pyenv/versions/2.7.11/lib/python2.7/site-packages/chainer/cuda.py:85: UserWarning: cuDNN is not enabled. Please reinstall chainer after you install cudnn (see https://github.com/pfnet/chainer#installation). 'cuDNN is not enabled.\n' >>> exit()

うーん、パスが通ってない? Macを一度終了し試すも同じエラー。

http://qiita.com/sigmalogneko/items/2b6921c1068bb26582da を見ると、Chainerをインストールしなおせばいいらしい

$ pip uninstall chainer Proceed (y/n)? y Successfully uninstalled chainer-1.8.0 $ CUDA_PATH=/usr/local/cuda pip install chainer --no-cache-dir Running setup.py install for chainer ... done Successfully installed chainer-1.8.0

念のためMAC再起動。

cudaを再度試すも同じエラーメッセージ。

参考サイト Chainer 1.6 GPU 対応に関するメモ|毎日の向こうに を見ると、CuDNNのコピー後にシンボリックリンクを作らないといけなかった

$ cd /Developer/NVIDIA/CUDA-7.5/lib/ $ sudo ln -s libcudnn.4.dylib libcudnn.dylib ln: libcudnn.dylib: File exists

コピーした時に解凍ファイルにシンボリックリンクも混ざってた。 libcudnn.dylibを削除して作成しなおした。

$ sudo rm -r libcudnn.dylib $ sudo ln -s libcudnn.4.dylib libcudnn.dylib

もう一度 chainerを再インストール

$ sudo pip uninstall chainer $ sudo -H CUDA_PATH=/usr/local/cuda pip install chainer --no-cache-dir

セーフモード起動

Command + R 押しながら起動して、ターミナルを起動してコマンド実行

$ csrutil disable

これでGPUのグラフィックボードにアクセスできるようになる??

HDF5のインストール

$ sudo -H HDF5_DIR=/usr/local pip install h5py Command "/Users/kanauchitooru2/.pyenv/versions/2.7.11/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/private/tmp/pip-build-OeJYnd/h5py/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-bmSDuO-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/tmp/pip-build-OeJYnd/h5py/

でエラー。

参考  Chainerを1.5にアップグレードするのにやったこと – Qiita の通りに、ソースからインストールしたらほぼ大丈夫だった。

ダウンロードしたのはここから HDF5 Source Code → hdf5-1.8.16.tar.gzただ参考サイトのコマンド、コピペだとエラー出た(本当にによくわかってない)

$ sudo ./configure --prefix=/usr/local/hdf5 --enable-fortran --enable-cxx > onfigure: error: Fortran could not compile .f90 files

オプションを削ったらOKだった。 僕の環境では以下のコマンドでOKでした。

$ sudo ./configure --prefix=/usr/local/hdf5 $ sudo make $ sudo make check $ sudo make install

makeとmake checkはかなり時間かかった。

~/.bash_profile をメモ帳で開いて環境変数(パス)を1行追加

export HDF5_DIR=/usr/local/hdf5

そして chainer を再インストール (何回目だよ…)

$ sudo -H pip uninstall chainer $ sudo -H CUDA_PATH=/usr/local/cuda pip install chainer --no-cache-dir

特に問題なく終わった!

それでもCUDAは動かない

ここまでやってRuby上で cudaが動くかテスト

$ python Python 2.7.11 (default, Apr 17 2016, 02:28:36) [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from chainer import cuda >>> cuda.zeros(5) /Users/kanauchitooru2/.pyenv/versions/2.7.11/lib/python2.7/site-packages/chainer/cuda.py:85: UserWarning: cuDNN is not enabled. Please reinstall chainer after you install cudnn (see https://github.com/pfnet/chainer#installation). 'cuDNN is not enabled.\n'

うーん、エラー。 パスは通ってるはずだけど念のためパス指定してやってみる

$ LD_LIBRARY_PATH=/usr/local/cuda/lib python >>> from chainer import cuda >>> cuda.zeros(5) /Users/kanauchitooru2/.pyenv/versions/2.7.11/lib/python2.7/site-packages/chainer/cuda.py:85: UserWarning: cuDNN is not enabled. Please reinstall chainer after you install cudnn (see https://github.com/pfnet/chainer#installation). 'cuDNN is not enabled.\n'

同じエラー…

 

cudaとcuDNNのバージョンが合ってないかな… 組み合わせを試すことも考えましたが、もう心折れました。

ここまでで週末全部潰れた。 なれない作業にGoogle先生に聞いてばかりなのもあったけど、 ダウンロードとインストールでもかなり時間かかりました。 (古いMacBook Proだったのもある)

とりあえずここまで。 素直にAWSのGPUで試すことにしました。

このメモがいつか誰かの役に立ちますように。

docomoの音声合成APIの音声データ(Binary)をMacで再生する方法 (2つ)

作ろうスマートフォンコンテンツ : 音声合成API で遊んでみたんですが、この音声合成APIの結果が音声データがBinary (RAW) データなので、そのまま保存しても再生できない。

サンプルのAPIコンソールの結果には以下のメッセージが。

ダウンロードした音声データ(Binary)はメディアプレイヤーでは再生できません。 音声データ(Binary)を再生するには専用の音声再生ツールをご利用いただくか、 適切な音声フォーマットに変換する必要があります。音声データのフォーマットは下記の通りです。 【符号化方式】リニアPCM 【チャネル数】1(モノラル) 【サンプル周波数】16000 【ビット深度】16bit(ビッグエンディアン)

無圧縮だからと拡張子を .wav や .au, .aiff にしてもダメ。 おそらくファイルのヘッダーに音声フォーマットの情報(bitや周波数とか)が必要な模様。

Macでいろいろ試して2つの方法をメモしておく。 事前に音声合成APIの結果を sample.raw と保存しておく。

方法1:Audacity で Rawデータとして読み込む

こちらはソフト上で行えるのでお手軽で簡単。ただ毎回、値を設定するのがちょっと面倒。

使うソフトはフリーウェアのAudacity

「ファイル(F) > 取り込み(I) > ロウ(Raw)データの取り込み」

sample.rawを指定して開いたらダイアログが出ますので、サンプリング周波数を「16000」Hz と入力。 他は基本そのままでいいはずです。 余談ですが、この画面の「バイト順序:ビックエンディアン」の表記は後のSoxの時に大変助かりました助かりました。

こんな風に開ければ成功。 後は好きな音声形式に書き出しましょう。

注:mp3に書き出すには追加のライブラリのインストールが必要です。

参考:Audacity(音声ファイル編集)をMP3で書き出せるようにする

方法2:ターミナルのコマンドで変換(Sox)

ターミナルで叩くコマンドを先に書いておきます。

$ sox -t raw -r 16k -e signed -b 16 -B -c 1 &lt;入力RAWデータ&gt; &lt;出力音声データ&gt;

<入力RAWデータ> は音声合成の結果のバイナリデータのです。 sample.rawとかになります。 <出力音声データ> は sample.wav と書けばOKです。

前のオプションを軽く説明しておきます。

-t raw :RAW(バイナリ)データである宣言 -e signed:音声符号化方式の種類の指定 -c 1: モノラル -r 16k :サンプリングレート(周波数)の指定、16k=16000 -b 16:ビット数 16bit -B : 音声データの バイト順で”ビッグエンディアン”の指定

ビックエンディアンの指定を入れなかったら凄まじいノイズな音になってました。 AudacityのRawデータ読み込み時のパネルで「バイト順序:ビックエンディアン」に気づけなかったら、もう諦めてたと思います。

Raw形式をWav形式にする・Wav形式をRaw形式にする がとても参考になりました、とても助かりました。

参考サイト)