- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我根本没有线程的经验。
我要做的就是使用GUI播放声音并同时更改音调(频率)。
这段代码连续播放,没有任何峰值或失真:
class Stream:
def __init__(self, sample_rate):
self.p = pyaudio.PyAudio()
self.sample_rate = sample_rate
# for paFloat32 sample values must be in range [-1.0, 1.0]
self.stream = self.p.open(format=pyaudio.paFloat32,
channels=1,
rate=sample_rate,
output=True)
self.samples = 0.
def create_sine_tone(self, frequency, duration):
# generate samples, note conversion to float32 array
self.samples = (np.sin(2 * np.pi * np.arange(self.sample_rate * duration) * frequency
/ self.sample_rate)).astype(np.float32)
def play_sine_tone(self, volume=1.):
"""
:param frequency:
:param duration:
:param volume:
:param sample_rate:
:return:
"""
# play. May repeat with different volume values (if done interactively)
while 1:
self.stream.write(volume * self.samples)
def terminate(self):
self.p.terminate()
def finish(self):
self.stream.stop_stream()
self.stream.close()
left_click
和
right_click
中,
create_sine_tone()
创建一个新的频率波。但是,据我了解,它会修改
threading
中
play_sine_tone
使用的内存,并且程序崩溃。
def main():
window = Tk()
window.title("Piano reference")
window.geometry('350x200')
s = Stream(44100)
lbl = Label(window, text="A4")
lbl.grid(column=2, row=1)
def left_click(frequency):
s.create_sine_tone(frequency, 1.)
t = threading.Thread(target=s.play_sine_tone, args=(1,))
t.start()
lbl.configure(text=frequency)
def right_click(frequency):
s.create_sine_tone(frequency, 1.)
t = threading.Thread(target=s.play_sine_tone, args=(1,))
t.start()
lbl.configure(text=frequency)
btn1 = Button(window, text="<<", command=lambda: left_click(100))
btn2 = Button(window, text=">>", command=lambda: right_click(200))
btn1.grid(column=0, row=0)
btn2.grid(column=1, row=0)
window.mainloop()
最佳答案
如果您尝试做的只是播放可以使用GUI控制的不同音调,则可能不需要线程。
PySimpleGUI提供了一个基于Tkinter(和其他工具)的 super 易于使用的GUI构建器。最重要的是,它提供了基于由GUI组件驱动的事件的操作。
另一方面,pydub的使用使我们可以轻松地创建不同的音调并进行播放。
pydub _play_with_simpleaudio
方法允许我们以非阻塞方式使用simpleAudio播放音调。
GUI控件:
import PySimpleGUI as sg
from pydub.generators import Sine
from pydub import AudioSegment
from pydub.playback import _play_with_simpleaudio
import time
sr = 44100 # sample rate
bd = 16 # bit depth
l = 10000.0 # duration in millisec
sg.ChangeLookAndFeel('BluePurple')
silent = AudioSegment.silent(duration=10000)
FREQ = 200
def get_sine(freq):
#create sine wave of given freq
sine_wave = Sine(freq, sample_rate=sr, bit_depth=bd)
#Convert waveform to audio_segment for playback and export
sine_segment = sine_wave.to_audio_segment(duration=l)
return sine_segment
# Very basic window. Return values as a list
layout = [
[sg.Button('<<'), sg.Button('>>')],
[sg.Text('Processing Freq [Hz]:'), sg.Text(size=(15,1), justification='center', key='-OUTPUT-')]
]
window = sg.Window('Piano reference', layout)
count = 0
play_obj = _play_with_simpleaudio(silent)
while 100 <= FREQ <= 20000 : # Event Loop
count += 1
event, values = window.Read()
if event in (None, 'Exit'):
break
if event == '<<':
if not FREQ < 100:
FREQ -= 100
window['-OUTPUT-'].update(FREQ)
if event == '>>':
if not FREQ > 20000:
FREQ += 200
window['-OUTPUT-'].update(FREQ)
print(event, FREQ)
sound = get_sine(FREQ)
try:
play_obj.stop()
time.sleep(0.1)
sound = sound.fade_in(100).fade_out(100)
play_obj = _play_with_simpleaudio(sound)
time.sleep(0.1)
except KeyboardInterrupt:
play_obj.stop_all()
window.close()
$ python3 pygui3.py
Playing >> 400 Hz
Playing >> 600 Hz
Playing >> 800 Hz
Playing << 700 Hz
Playing << 600 Hz
关于python - PyAudio在线程中播放连续流,并让其更改频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137542/
我正在尝试运行以下 python 程序,但出现了一些错误。该程序旨在将实时语音转换为文本,它使用的是我使用 CMUSphinx 训练的声学模型。 编码: #!/usr/bin/env python i
我一直无法找到在我的机器上安装 PyAudio 的修复程序。我尝试了几种不同的解决方案,并且确实使用自制软件安装了必备库“portaudio”。我还寻找了出现在输出底部的 gcc 错误的解决方案,而这
我在学校项目中使用 pyaudio,我试图让声音一次只在一个扬声器上播放。我的代码是这样的: import pyaudio p = pyaudio.PyAduio() def play_wave(st
我有一个播放 wav 文件的非常基本的 pyaudio 代码。 open_wave = wave.open("tone_silence/l0r1d0_500.wavc",'rb') p
我使用 pyaudio 库从声卡中读取声音。我使用以下代码 stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels=2,
我正在尝试使用 pyaudio 构建一个应用程序来记录扬声器和麦克风的声音,但我只是不知道如何同时记录它们。我尝试启用立体声混音器,但它没有成功,因为我只能听扬声器发出声音。我使用的这段代码使用 py
我正在尝试使用麦克风从盖革计数器收集数据并使用 Python 对其进行处理。但是,我使用的是大学计算机,因此不允许我安装此工作似乎必需的 PyAudio 模块 ( Python read microp
是否可以使用 pyaudio 演奏和弦? 最佳答案 当然可以! 只需生成结果并将其传递给播放器即可。 This article covers a method to do it. 以下是示例代码,以防
我在 PyAudio 网站上看到了录制固定长度录音的录音教程,但我想知道如何对非固定长度的录音做同样的事情?基本上,我想创建按钮来开始和结束录音,但我还没有找到任何关于此事的信息。有什么想法,我不是在
我正在尝试创建一个 python 程序来使用 PyAudio 和 Ubuntu 16.04 录制和循环音轨。我收到一条错误消息,提示“未找到默认输入设备”。当我查询默认设备并尝试列出所有设备时,我得到
为了录制一个 2 秒的 wav 文件,我使用了 PyAudio(带有 Pyzo)和以下经典代码来录制声音并保存它: import pyaudio import wave chunk = 1024 FO
我目前面临一个难题。我需要在法语 Windows 环境中使用 Pyaudio,并且音频设备的名称默认包含 é 或 è。 这是出现特殊字符时出现的错误: u=self.p.get_device_i
我目前正在使用PyAudio来开发轻型录音实用程序,该实用程序可以满足我计划中的应用程序的特定需求。我正在使用ASIO音频接口(interface)。我正在编写程序要做的是通过界面播放wav文件,同时
尝试使用 pip 安装 PyAudio 包显示错误,而其他包安装正常。我正在使用 python 3.7。为什么会出现此错误? C:\Users\Himanshu>pip install PyAudio
我正在 Intel Edison 开发板上试用 pyaudio,但内置测试失败了。单独录制和播放在我的设置下工作正常,但如果我尝试将输入连接到输出,则会出现错误。 File "wire_full.py
我正在使用 python 和 pyaudio 使用回调方法流式传输纯正弦音,以便稍后通过用户输入调制声音。一切都很好,除了当我运行代码时,我收到 1-2 秒的与警告消息相关的爆裂声ALSA lib p
我已经使用这个压缩包构建并安装了 PortAudio:'pa_stable_v19_20071207.tar.gz' 完成此步骤后,当我尝试通过此 URL 中的压缩包安装 PyAudio 时: htt
我一直在尝试为语音识别项目安装 PyAudio,但我尝试过的所有方法都没有奏效。我尝试安装最新版本的 python (3.7) 只是为了 noobishly 发现 pyaudio 与它不兼容,现在我正
我正在尝试创建一个简单的应用程序,该应用程序加载 wav 文件(键盘的每个音符一个)并在按下(或播放)MIDI 音符时播放特定的文件。到目前为止,我已经在两个单独的线程中使用 mido 创建了一个 m
我正在尝试使用 pyaudio 播放流音频 我正在获取一些数据,对其进行处理,然后将它们放入音频流中。 数据速率相当恒定,但有一些抖动。 我可以在日志中看到数据速率是恒定的并且处理是实时的。 Demo
我是一名优秀的程序员,十分优秀!