前提・実現したいこと
マイク(まずはwaveファイル)の音声データから
基本周波数・スペクトル包絡をいじってリアルタイムで再生したい
発生している問題・エラーメッセージ
エラーメッセージは出ずにガガガガというノイズがなって途中で処理が止まります。(Ctrl+Cでも中止できません)
メモリ不足?
該当のソースコード
python
1import pyworld as pw 2import numpy as np 3import pyaudio 4import wave 5import struct 6 7 8class World: 9 CHANNELS = 1 10 RATE = 44100 11 CHUNK = 1024 12 SIZE = 0 13 def __init__(self): 14 try: 15 wf = wave.open("../a.wav", "r") 16 # ストリーム開始 17 self.p = pyaudio.PyAudio() 18 19 self.SIZE = wf.getsampwidth() 20 self.format = self.p.get_format_from_width(wf.getsampwidth()) # => pyaudio.paALSA 21 self.CHANNELS = wf.getnchannels() 22 self.RATE = wf.getframerate() 23 self.wf = wf 24 print(self.format) 25 26 self.stream = self.getStream() 27 28 self.start() 29 except Exception as e: 30 print(e) 31 def getStream(self): 32 stream = self.p.open(format=self.format, 33 channels=self.CHANNELS, 34 rate=self.RATE, 35 output=True) 36 return stream 37 38 def start(self): 39 data = self.wf.readframes(self.CHUNK) 40 while(data != b''): 41 data = self.changeVoice(data) 42 self.stream.write(data) 43 data = self.wf.readframes(self.CHUNK) 44 self.stream.close() # ストリーム終了 45 self.p.terminate() 46 47 def changeVoice(self,data): 48 # data = data.astype(np.float) 49 data = np.frombuffer(data, np.uint16) 50 data = data.astype(np.float64) # WORLDはfloat前提のコードになっているのでfloat型にしておく 51 _f0, t = pw.dio(data, self.RATE) # 基本周波数の抽出 52 f0 = pw.stonemask(data, _f0, t, self.RATE) # 基本周波数の修正 53 sp = pw.cheaptrick(data, f0, t, self.RATE) # スペクトル包絡の抽出 54 ap = pw.d4c(data, f0, t, self.RATE) # 非周期性指標の抽出 55 56 data = pw.synthesize(f0, sp, ap, self.RATE).astype(np.uint16).tobytes() 57 return data 58 59 def binary(self,num): 60 return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num)) 61if __name__ == "__main__": 62 spec = World()
試したこと
changeVoice関数を通さなければ再生できるので、このあたり、特にバイナリデータからndarrayや型変換するところがおかしいと思うのですが、どう直せばいいか分かりません。
waveファイルのバイナリデータ -> 解析のためにndarrayに変換 -> 解析・編集 -> 再生するためにもとのバイナリに戻すということがしたいです。
frombufferの第二引数を色々変えてみたり等したのですが、うまく行きませんでした。
補足情報(FW/ツールのバージョンなど)
Python3.6.5
Docker version 18.03.1-ce
docker-compose version 1.22.0-rc2
ホストOS:ubuntu:18.04
コンテナOS:ubuntu:18.04
Bash
1 2CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3839e827ec187 voichan_python_1 0.22% 24.75MiB / 31.35GiB 0.08% 12.4kB / 0B 0B / 0B 14
回答1件
あなたの回答
tips
プレビュー