前提・実現したいこと
######PythonとSPTKを使いボイスチェンジャを作りたい。
以下のサイトを参考にさせていただきました。
ソースコードにつきましては、基本的に書き換えておらずそのまま使用しています。
発生している問題・エラーメッセージ
C:\Python27\python.exe C:/Users/joho-2/PycharmProjects/Rsound11/Rsound11.py *** Now recording ... (10 sec) *** extract pitch ... 'x2x' �́A�����R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B 'x2x' �́A�����R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B *** extract mel cepstrum *** modify parameters ... 'sopr' �́A�����R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B 'sopr' �́A�����R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B *** play! Traceback (most recent call last): File "C:/Users/joho-2/PycharmProjects/Rsound11/Rsound11.py", line 127, in <module> play("output.raw") File "C:/Users/joho-2/PycharmProjects/Rsound11/Rsound11.py", line 78, in play f = open(raw_file, "rb") IOError: [Errno 2] No such file or directory: 'output.raw' Process finished with exit code 1
該当のソースコード
Python
1#coding: utf-8 2import pyaudio 3import struct 4import subprocess 5 6# SPTKを使った簡単なボイスチェンジャー 7 8CHANNELS = 1 9RATE = 16000 10CHUNK = 1024 11 12def record(raw_file, record_seconds=5): 13 """音声ファイルを録音する 14 録音時間は固定。キーボードを押すとループ終わりができなかった・・・""" 15 fp = open(raw_file, "wb") 16 for _ in range(0, int(RATE / CHUNK * record_seconds)): 17 data = stream.read(CHUNK) 18 fp.write(struct.pack('s' * CHUNK * 2, *data)) 19 fp.close() 20 stream.stop_stream() 21 stream.close() 22 p.terminate() 23 24def extract_pitch(raw_file, pitch_file): 25 """ピッチパラメータの抽出""" 26 cmd = "x2x +sf %s | pitch -a 1 -s 16 -p 80 > %s" % (raw_file, pitch_file) 27 subprocess.call(cmd, shell=True) 28 29def extract_mcep(raw_file, mcep_file): 30 """メルケプストラムパラメータの抽出""" 31 cmd = "x2x +sf %s | frame -p 80 | window | mcep -m 25 -a 0.42 > %s" % (raw_file, mcep_file) 32 subprocess.call(cmd, shell=True) 33 34def modify_pitch(m, pitch_file, mcep_file, raw_file): 35 """ピッチを変形して再合成 36 mが1より大きい => 低い声 37 mが1より小さい => 高い声""" 38 cmd = "sopr -m %f %s | excite -p 80 | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (m, pitch_file, mcep_file, raw_file) 39 subprocess.call(cmd, shell=True) 40 41def modify_speed(frame_shift, pitch_file, mcep_file, raw_file): 42 """話速を変形して再合成 43 frame_shiftが小さい => 早口 44 frame_shiftが大きい => ゆっくり""" 45 cmd = "excite -p %f %s | mlsadf -m 25 -a 0.42 -p %f %s | clip -y -32000 32000 | x2x +fs > %s" % (frame_shift, pitch_file, frame_shift, mcep_file, raw_file) 46 subprocess.call(cmd, shell=True) 47 48def hoarse_voice(pitch_file, mcep_file, raw_file): 49 """ささやき声""" 50 modify_pitch(0, pitch_file, mcep_file, raw_file) 51 52def robot_voice(frame_period, record_seconds, mcep_file, raw_file): 53 """ロボット声 54 frame_periodが小さい => 低い 55 frame_periodが大きい => 高い""" 56 sequence_length = record_seconds * RATE * frame_period 57 cmd = "train -p %d -l %d | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (frame_period, sequence_length, mcep_file, raw_file) 58 subprocess.call(cmd, shell=True) 59 60def child_voice(pitch_file, mcep_file, raw_file): 61 """子供声""" 62 cmd = "sopr -m 0.4 %s | excite -p 80 | mlsadf -m 25 -a 0.1 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (pitch_file, mcep_file, raw_file) 63 subprocess.call(cmd, shell=True) 64 65def deep_voice(pitch_file, mcep_file, raw_file): 66 """太い声""" 67 cmd = "sopr -m 2.0 %s | excite -p 80 | mlsadf -m 25 -a 0.6 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (pitch_file, mcep_file, raw_file) 68 subprocess.call(cmd, shell=True) 69 70def raw2wav(raw_file, wav_file): 71 cmd = "sox -e signed-integer -c %d -b 16 -r %d %s %s" % (CHANNELS, RATE, raw_file, wav_file) 72 subprocess.call(cmd, shell=True) 73 74def play(raw_file): 75 """rawファイルを再生""" 76 p = pyaudio.PyAudio() 77 stream = p.open(format=p.get_format_from_width(2), channels=CHANNELS, rate=RATE, output=True) 78 f = open(raw_file, "rb") 79 data = f.read(CHUNK) 80 while data != '': 81 stream.write(data) 82 data = f.read(CHUNK) 83 stream.stop_stream() 84 stream.close() 85 p.terminate() 86 87if __name__ == "__main__": 88 # 録音時間(固定) 89 record_seconds = 10 90 91 p = pyaudio.PyAudio() 92 stream = p.open(format=pyaudio.paInt16, 93 channels=CHANNELS, 94 rate=RATE, 95 input=True, 96 frames_per_buffer=CHUNK) 97 98 pitch_file = "temp.pitch" 99 mcep_file = "temp.mcep" 100 raw_file = "temp.raw" 101 output_file = "output.raw" 102 103 # オリジナルの音声を録音してrawファイルとして書き出し 104 print "*** Now recording ... (%d sec)" % record_seconds 105 record(raw_file, record_seconds) 106 107 # パラメータ抽出 108 print "*** extract pitch ..." 109 extract_pitch(raw_file, pitch_file) 110 111 print "*** extract mel cepstrum" 112 extract_mcep(raw_file, mcep_file) 113 114 # パラメータ変形いろいろ 115 print "*** modify parameters ..." 116 117 # どれか一つしか有効にできない 118 modify_pitch(0.3, pitch_file, mcep_file, output_file) 119# modify_speed(300, pitch_file, mcep_file, output_file) 120# hoarse_voice(pitch_file, mcep_file, output_file) 121# robot_voice(100, record_seconds, mcep_file, output_file) 122# child_voice(pitch_file, mcep_file, output_file) 123 deep_voice(pitch_file, mcep_file, output_file) 124 125 # 変換した音声を再生 126 print "*** play!" 127 play("output.raw")
試したこと
Pythonのバージョンの問題かと考え、3系から2系に変えたのですがうまくいかず・・・
そもそも録音ができていないのではと思い、何度もサイトを見直したりして勉強したのですが、
ここからエラーがなくならず、どうしてもうまくいきませんでした;;
補足情報(FW/ツールのバージョンなど)
- Python 2.7.17
- SPTK 3.5 (ヘルプメッセージまで出力できています)
- エディタ PyCharm (pyaudio インストール済み)
- Windows 7
最近Pythonを勉強したばかりの初心者です。助言いただけると本当にうれしいです。 どうぞ宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/12 07:10