質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Q&A

1回答

4092閲覧

struct.error: argument for 's' must be a bytes object

TsuhaYuya

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

0グッド

0クリップ

投稿2019/01/28 06:10

人工知能に関する断創録を参考にボイスチェンジャーを作ろうとしているのですが、エラーが発生してしまい、動いてくれません。。

実装環境
python 3.6.5

Python

1# coding: utf-8 2import pyaudio 3import struct 4import subprocess 5 6# SPTKを使った簡単なボイスチェンジャー 7 8CHANNELS = 1 9RATE = 16000 10CHUNK = 1024 11 12 13def record(raw_file, record_seconds=5): 14 """音声ファイルを録音する 15 録音時間は固定。キーボードを押すとループ終わりができなかった・・・""" 16 fp = open(raw_file, "wb") 17 for _ in range(0, int(RATE / CHUNK * record_seconds)): 18 data = stream.read(CHUNK) # ストリームへの書き込み(バイナリ) 19 fp.write(struct.pack('s' * CHUNK * 2, *data)) 20 fp.close() 21 stream.stop_stream() 22 stream.close() 23 p.terminate() 24 25 26def extract_pitch(raw_file, pitch_file): 27 """ピッチパラメータの抽出""" 28 cmd = "x2x +sf %s | pitch -a 1 -s 16 -p 80 > %s" % (raw_file, pitch_file) 29 subprocess.call(cmd, shell=True) 30 31 32def extract_mcep(raw_file, mcep_file): 33 """メルケプストラムパラメータの抽出""" 34 cmd = "x2x +sf %s | frame -p 80 | window | mcep -m 25 -a 0.42 > %s" % (raw_file, mcep_file) 35 subprocess.call(cmd, shell=True) 36 37 38def modify_pitch(m, pitch_file, mcep_file, raw_file): 39 """ピッチを変形して再合成 40 mが1より大きい => 低い声 41 mが1より小さい => 高い声""" 42 cmd = "sopr -m %f %s | excite -p 80 | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % ( 43 m, pitch_file, mcep_file, raw_file) 44 subprocess.call(cmd, shell=True) 45 46 47def modify_speed(frame_shift, pitch_file, mcep_file, raw_file): 48 """話速を変形して再合成 49 frame_shiftが小さい => 早口 50 frame_shiftが大きい => ゆっくり""" 51 cmd = "excite -p %f %s | mlsadf -m 25 -a 0.42 -p %f %s | clip -y -32000 32000 | x2x +fs > %s" % ( 52 frame_shift, pitch_file, frame_shift, mcep_file, raw_file) 53 subprocess.call(cmd, shell=True) 54 55 56def hoarse_voice(pitch_file, mcep_file, raw_file): 57 """ささやき声""" 58 modify_pitch(0, pitch_file, mcep_file, raw_file) 59 60 61def robot_voice(frame_period, record_seconds, mcep_file, raw_file): 62 """ロボット声 63 frame_periodが小さい => 低い 64 frame_periodが大きい => 高い""" 65 sequence_length = record_seconds * RATE * frame_period 66 cmd = "train -p %d -l %d | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % ( 67 frame_period, sequence_length, mcep_file, raw_file) 68 subprocess.call(cmd, shell=True) 69 70 71def child_voice(pitch_file, mcep_file, raw_file): 72 """子供声""" 73 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" % ( 74 pitch_file, mcep_file, raw_file) 75 subprocess.call(cmd, shell=True) 76 77 78def deep_voice(pitch_file, mcep_file, raw_file): 79 """太い声""" 80 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" % ( 81 pitch_file, mcep_file, raw_file) 82 subprocess.call(cmd, shell=True) 83 84 85def raw2wav(raw_file, wav_file): 86 cmd = "sox -e signed-integer -c %d -b 16 -r %d %s %s" % (CHANNELS, RATE, raw_file, wav_file) 87 subprocess.call(cmd, shell=True) 88 89 90def play(raw_file): 91 """rawファイルを再生""" 92 p = pyaudio.PyAudio() 93 stream = p.open(format=p.get_format_from_width(2), channels=CHANNELS, rate=RATE, output=True) 94 f = open(raw_file, "rb") 95 data = f.read(CHUNK) 96 while data != '': 97 stream.write(data) 98 data = f.read(CHUNK) 99 stream.stop_stream() 100 stream.close() 101 p.terminate() 102 103 104if __name__ == "__main__": 105 # 録音時間(固定) 106 record_seconds = 10 107 108 p = pyaudio.PyAudio() 109 stream = p.open(format=pyaudio.paInt16, 110 channels=CHANNELS, 111 rate=RATE, 112 input=True, 113 frames_per_buffer=CHUNK) 114 115 pitch_file = "temp.pitch" 116 mcep_file = "temp.mcep" 117 raw_file = "temp.raw" 118 output_file = "output.raw" 119 120 # オリジナルの音声を録音してrawファイルとして書き出し 121 print("*** Now recording ... (%d sec)" % record_seconds) 122 record(raw_file, record_seconds) 123 124 # パラメータ抽出 125 print("*** extract pitch ...") 126 extract_pitch(raw_file, pitch_file) 127 128 print("*** extract mel cepstrum") 129 extract_mcep(raw_file, mcep_file) 130 131 # パラメータ変形いろいろ 132 print("*** modify parameters ...") 133 134 # どれか一つしか有効にできない 135 # modify_pitch(0.3, pitch_file, mcep_file, output_file) 136 # modify_speed(300, pitch_file, mcep_file, output_file) 137 # hoarse_voice(pitch_file, mcep_file, output_file) 138 # robot_voice(100, record_seconds, mcep_file, output_file) 139 # child_voice(pitch_file, mcep_file, output_file) 140 deep_voice(pitch_file, mcep_file, output_file) 141 142 # 変換した音声を再生 143 print("*** play!") 144 play("output.raw") 145

エラー内容

bash

1Traceback (most recent call last): 2 File "voice_changer.py", line 19, in record 3 fp.write(struct.pack('s' * CHUNK * 2, *data)) 4struct.error: argument for 's' must be a bytes object

といった具合です。おそらく、変換する型がよくないのだと思いますが、変換の方法がわかっておりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

元のコードがpython2系のものなので、その絡みでエラーになっているのだと思います。文字列・バイト列周りは仕様が大きく変わっているので、そのままでは動かないのではないでしょうか。

dataの要素が何型になっているのかちょっとわかりませんが、最終的にはpython3のbytesに変換する必要があります。

投稿2019/01/28 06:20

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsuhaYuya

2019/01/28 06:35

python2系では動きました。 3系でも動かしたいのですが、変換の方法がよくわかっていません。 print(type(data))でdataをプリントすると <class 'bytes'>という風に出力されました。 どこを修正して行く必要がありますでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問