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

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

ただいまの
回答率

87.35%

pyaudioでのリアルタイムフィルタリングのエラーメッセージ

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,424

score 18

前提・実現したいこと

pyaudioを用いてリアルタイムで録音音声にフィルター加工をして出力をするものを作ろうとしています.
現在作ったコードのエラー内容がわからず質問させていただきました
下記のエラーはどのようなことを言ってるのでしょうか、、、

発生している問題・エラーメッセージ

/Users/matsumura/PycharmProjects/wave/realtime_outuput.py:60: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  self.buf = np.fromstring(in_data, np.int16)
Traceback (most recent call last):
  File "/Users/matsumura/PycharmProjects/wave/realtime_outuput.py", line 63, in callback
Traceback (most recent call last):
  File "/Users/matsumura/PycharmProjects/wave/realtime_outuput.py", line 89, in <module>
    self.buf = np.reshape(self.buf, (round(frame_count*self.channels/2), 1))
  File "/Users/matsumura/.virtualenvs/wave/lib/python3.7/site-packages/numpy/core/fromnumeric.py", line 292, in reshape
    while af.stream.is_active():
  File "/Users/matsumura/.virtualenvs/wave/lib/python3.7/site-packages/pyaudio.py", line 534, in is_active
    return _wrapfunc(a, 'reshape', newshape, order=order)
  File "/Users/matsumura/.virtualenvs/wave/lib/python3.7/site-packages/numpy/core/fromnumeric.py", line 56, in _wrapfunc
    return pa.is_stream_active(self._stream)
ValueError

該当のソースコード

# グラフ更新し続ける

import pyaudio
import time
import sys
import numpy as np
import matplotlib.pyplot as plt
from collections import deque
from scipy import signal

input_device = 0  # 入力デバイス
output_device = 1  # 出力デバイス
sampling_rate = 44100  # サンプリングレート マイクの特性に合わせる
CHUNK = 2 ** 10  # データ長になる
record_seconds = 0.2  # サンプリングする時間


class Plot():
    def __init__(self):
        self.fig, self.ax = plt.subplots(1, 1)
        self.lines, = self.ax.plot(0, 0)  # 第一プロット

    def set(self, x_data, y_data):
        self.lines.set_data(x_data, y_data)  # 第一プロット
        self.ax.set_xlim(0, x_data.max())
        self.ax.set_ylim(0, y_data.max())
        plt.pause(.01)

    def close(self):
        plt.close()


class AudioFilter():
    def __init__(self):
        # オーディオに関する設定
        self.p = pyaudio.PyAudio()
        self.channels = 2  # モノラル
        self.format = pyaudio.paInt16
        self.data = deque([], maxlen=int(sampling_rate * record_seconds))
        self.rate = sampling_rate
        self.chunk = CHUNK
        # self.time = {}
        self.stock_sec = record_seconds
        self.buf = np.array([])
        self.filter1 = signal.firwin(numtaps=4000, cutoff=1500, fs=self.rate)
        self.stream = self.p.open(
            format=self.format,
            channels=self.channels,
            rate=self.rate,
            output=True,
            input=True,
            frames_per_buffer=self.chunk,  # バッファごとのフレーム長を指定
            input_device_index=input_device,
            output_device_index=output_device,
            stream_callback=self.callback  # コールバック関数の指定
        )

    # コールバック関数(chunk貯まるたびに呼び出される。長い処理を書くと再帰が深くなる)
    def callback(self, in_data, frame_count, time_info, status):
        self.buf = np.fromstring(in_data, np.int16)
        self.buf[::2] = np.array(signal.lfilter(self.filter1, 1, self.buf[::2]))
        self.buf[1::2] = np.array(signal.lfilter(self.filter1, 1, self.buf[1::2]))
        self.buf = np.reshape(self.buf, (round(frame_count*self.channels/2), 1))
        out_data = self.buf.astype(np.int16).tostring()
        return (out_data, pyaudio.paContinue)

        # amp = np.fromstring(in_data, np.int16)
        # amp[::2] = np.array(signal.lfilter(self.filter1, 1, amp[::2]))
        # amp[1::2] = np.array(signal.lfilter(self.filter1, 1, amp[1::2]))
        # amp = np.reshape(amp, (frame_count * self.channels, 1))
        # out_data = amp.astype(np.int16).tostring()
        # return (out_data, pyaudio.paContinue)

    def filtering(self):
        return 0

    def close(self):
        self.p.terminate()


if __name__ == '__main__':
    freqList = np.fft.fftfreq(int(sampling_rate * record_seconds), d=1.0 / sampling_rate)
    pt = Plot()  # プロット用

    af = AudioFilter()  # AudioFilterのインスタンス
    af.stream.start_stream()  # ストリーミングを始める

    #  ノンブロッキングなので好きなことをしていていい場所
    while af.stream.is_active():
        if(len(af.data) >= int(sampling_rate * record_seconds)):
            data = np.array(af.data)
            af.data.clear()
            x = np.fft.fft(data)
            amplitude = np.array([np.sqrt(c.real ** 2 + c.imag ** 2) for c in x])  # 振幅スペクトル
            pt.set(freqList, amplitude)

    pt.close()

    # ストリーミングを止める場所
    af.stream.stop_stream()
    af.stream.close()
    af.close()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • siruku6

    2019/09/22 18:32

    ValueError以外に何かその付近に書かれてはいませんか?
    正直言って、ValueErrorだけではエラーの内容がはっきりしませんね。

    キャンセル

  • sibazyun

    2019/09/22 23:28

    自分もそう思ったのですが上に張ったエラーのようにValueErrorしか出てこなかったです、、、

    キャンセル

回答 1

checkベストアンサー

0

error内容がわからないため、解決策もわからないのですが、ひとまずわかる範囲で説明してみます。

1 DeprecationWarning

DeprecationWarningは、「この処理古いから新しいのに置き換えてよ」というような意味に近いメッセージです。
詳しい意味はネットで調べてみましょう。

DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  self.buf = np.fromstring(in_data, np.int16)


この具体的な内容は、英語で書かれている通りですが、、
「fromstringは古い」
「unicodeの入力に対して驚くべき挙動をする。」
「代わりに frombuffer使って」
みたいな意味です。

英語を勉強したくない場合はgoogle翻訳などを活用しましょう。

2 Error

肝心のerror原因は不明ですが、次の行でエラーが発生しているようですね。

self.buf = np.reshape(self.buf, (round(frame_count*self.channels/2), 1))


エラーメッセージに自分が作ったファイル名が書かれていれば、そのメッセージに書いてある行番号をたどることで、エラーが起きる元になった箇所を特定することができるので参考にしてみてください。

肝心の対処方法は、今のままではお伝え出来ないので情報追加や他の方に期待したいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/23 13:50

    詳しくありがとうございます…!
    なんとなくわかってきたのでネットで細かく調べてみたいと思います!

    キャンセル

  • 2019/09/23 13:57

    上手く解決されるのを期待しています。
    頑張ってみてください!

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る