Я пытаюсь создать приложение для ручной коррекции высоты тона.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Я пытаюсь создать приложение для ручной коррекции высоты тона.

Сообщение Anonymous »

Обнаружение высоты звука, вероятно, обнаруживает либо слишком мелкие детали, либо вообще не обнаруживает правильно, поскольку код должен отображать случайную цветную форму сигнала всякий раз, когда в звуке происходит резкое изменение высоты звука. Но это должна быть проблема в коде, потому что я видел библиотеку crepe в действии, которая работает феноменально хорошо, когда дело доходит до определения высоты тона.

Код: Выделить всё

import sys
import numpy as np
import soundfile as sf
from PyQt6.QtWidgets import (
QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QLabel
)
from PyQt6.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from crepe import predict
from io import BytesIO
from pydub import AudioSegment
from matplotlib.widgets import Slider

# Function to calculate the closest musical note frequency
def closest_note_frequency(freq):
A4 = 440.0
semitone_ratio = 2 ** (1 / 12)
if freq  0 and confidence[i] > 0.8:
current_note = closest_note_frequency(frequency[i])
prev_note = closest_note_frequency(frequency[i - 1])
if abs(current_note - prev_note) > abs(current_note * (2 ** (1 / 12) - 1)):
pitch_changes.append(i)

# Chop audio into segments based on pitch changes
self.segments = []
self.segment_colors = []
start = 0

for change in pitch_changes:
end = change
self.store_segment(start, end)
start = end

# Add the last segment
self.store_segment(start, len(self.audio_data))

# Display waveform
self.display_waveform()

def store_segment(self, start, end):
# Convert segment to bytes and store in memory
segment = self.audio_data[start:end]
self.segments.append(segment)
# Generate a random color for this segment
color = (np.random.rand(), np.random.rand(), np.random.rand())  # RGB tuple
self.segment_colors.append(color)

def display_waveform(self):
viewer = WaveformViewer(self.segments, self.segment_colors, self.sample_rate)
self.layout.addWidget(viewer)

if __name__ == "__main__":
app = QApplication(sys.argv)
window = PitchChangeDetector()
window.show()
sys.exit(app.exec())
Я попробовал изменить порог следующим образом:

Код: Выделить всё

if abs(current_note - prev_note) > abs(current_note * (2 ** (1 / 12) - 1)):
на это:

Код: Выделить всё

if abs(current_note - prev_note) > 10:
Но результаты те же...
Я не использовал отладчик. Я использовал этот аудиофайл:drive.google.com/file/d/1Eb5OiWgl6RVFM7Jqv-AF--vDdRjPuH8T/… (Этот аудиофайл был создан мной, я использовал 17 нот разной высоты, поэтому аудиовизуализация должна иметь 17 случайных цветов. ) Результат оказался почти идеальным, как и предполагалось, приложение показывало форму сигнала, но цвета не были назначены нужным позициям формы сигнала.

Подробнее здесь: https://stackoverflow.com/questions/793 ... pplication
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»