Kod, Müzik ve ChatGPT

Feb 12 2023
ChatGPT ile basit bir ses dalga formu görselleştirici web sitesi oluşturma
Yukarıdaki, ChatGPT ile oluşturulmuş bir web sitesinin ekran görüntüsüdür. ChatGPT dökümünün tamamı burada.

Yukarıdaki, ChatGPT ile oluşturulmuş bir web sitesinin ekran görüntüsüdür. ChatGPT dökümünün tamamı burada . Ortaya çıkan kod on github içindedir . Tasvir edilen müzik parçası, Eelke Kleijn'den Transmission'dır .

Uygulama

  • Bir MP3 dosyasını kutuya sürükleyip bırakırsınız.
  • Dosya yüklenir ve eşzamansız bir arka plan görevi kuyruğa alınır. Ön uç, tamamlanana (veya başarısız olana) kadar işin durumunu sürekli olarak kontrol eder.
  • Görev işlendiğinde, MP3 analiz edilir ve istemciye bir dalga biçimi veri dizisi gönderilir. Yüksekler, ortalar alçaklar için ayrı bir dalga formu vardır (DJ yazılımına benzer).
  • İstemci, dalga biçimi veri dizisini aldıktan sonra, verileri bir HTML Kanvasında görselleştirir.
  • Bu önemsiz olmayan bir yazılım mühendisliği görevidir : düzgün görünmesi gereken bir ön uç vardır. Eşzamansız işler ve ses işleme ile ilgilenen bir arka uç var.
  • Birden fazla üçüncü taraf kitaplığı ve bunların nasıl çalıştığını çözmeyi gerektirir.
  • Disiplinler arası bilgi gereklidir : mp3'ü okumanız, fourier dönüşümü gerçekleştirmeniz ve frekans aralıklarını doğru bir şekilde bölmeniz gerekir.

Uygulamayı oluştururken, biz (ChatGPT ve ben) küçük yinelemeler yaptık ve her adımda sahip olduklarımızı test ettik. Aşağıdaki transkriptten alıntılar, transkriptteki ilgili satırlara bağlantılardır.

Temel bir ön uç

Kullanıcıların sürükleyip bırakarak bir mp3 yüklediği bir web sitesinin ön yüzünü yazın. mp3 daha sonra eşzamansız işleme için arka uca yüklenir ve kullanıcı arabirimi, işin durumuyla ilgili durum güncellemelerini görüntüler (sırada/işleniyor/tamamlandı).

ChatGPT, yalnızca birkaç yinelemeyle makul bir sonuca ulaştı.

tamam, şimdi bölümünü pure.css kullanacak şekilde yeniden yazın ve sayfayı daha güzel hale getirmek için biraz css yazın

Bu da kolaydı.

arka uç

tamam, şimdi node.js/express içine yukarıdaki web sayfasına hizmet eden ve ek olarak yüklenen mp3'leri işleyen işleri gönderen bir uygulama yazın. Şimdilik, işleme, 5 saniye içinde tamamlanan sahte bir iş olmalıdır.

Bu hemen çalışıyordu. İşe yinelemeli olarak daha fazla işlevsellik ekledik :

harika, şimdi yukarıdaki betiğin işlerdeki mp3 uzunluğunu hesaplamasını sağlayın

Bu hızlıydı. Sonra sorunlar başladı:

mükemmel, şimdi processMp3'ü değiştirin, böylece bir iz analizi nesnesi döndürür. Şu şekilde görünmelidir :
{
süre: <saniye cinsinden şarkı süresi>,
dalga biçimi: [{
düşükler: <0-100 arasında bir değer, bu gruptaki düşük frekansların yüksekliğini gösterir>,
ortalar: <0-100 arasında bir değer bu gruptaki orta frekansların ses yüksekliği>,
yüksekler: <0-100 arasında bir değer, bu gruptaki yüksek frekansların yüksekliğini gösterir>,
}, … ]}

(nesnedeki dalga formu dizisinde 512 kova olmalıdır.)

Gerekli Fourier Dönüşümünü yapmak için ChatGPT, global bir nesnenin var olduğunu varsayan kitaplıkları kullanmaya çalıştı ve windowbu kitaplıkların ön uç kullanım için tasarlandığını belirtti.

bunlar ön uç kitaplıkları, arka uçta çalışmıyorlar, başka bir şey kullanın

Bir python kütüphanesi olan pydub'u kullanmayı önerdi ve javascript'te pydub'u kullanmaya çalışan kod üretti - ki bu açıkça çalışmıyor. Sonra bir şeyler uydurmaya başladı:

ChatGPT: Bu durumda, ses analizi yapmak ve dalga formunu oluşturmak için ses kitaplığını kullanabilirsiniz .

Daha sonra, var olmayan veya bu şekilde kullanılamayan uydurma bir ses kitaplığını kullanan bir kod parçası üretti. Hatasını hemen kabul etti:

Ben: böyle bir npm paketi yok

ChatGPT : Özür dilerim, haklısın. npm'de ses kitaplığı yok. Bu durumda, ses analizi yapmak ve dalga formunu oluşturmak için fourier-transform kitaplığını kullanabilirsiniz.

Ardından, tanımlanmamış bir işlev kullanması dışında mantıklı bir kod parçası üretti:

let audio = await decode(audioData);

import { MP3Decoder } from "lamejs";

Üzgünüm ama sunucu tarafında sesi işlemek, özellikle önceden var olan bir kitaplık kullanılmadan oldukça karmaşık. Ses işleme için üst düzey bir API sağlayan ffmpeg, sox veya libsndfile gibi önceden var olan bir kitaplığı kullanmanızı öneririm. Bu kitaplıklar, ses verilerini MP3 dosyasından çıkarmak, ses verilerini sesin süresini ve yüksekliğini belirlemek için işlemek ve dalga biçimi verilerini oluşturmak için kullanılabilir.

Daha fazla basıldığında, ChatGPT, açıkça mücadele ettiği kısmı yazmaktan kaçınmak için bahaneler ve yollar bulmaya devam etti.

Belli ki geri adım atma zamanı gelmişti. ChatGPT'den programı python'a yazmasını , çıktısını stdout'a vermesini ve node.js betiğinden çalıştırmasını istedim. Bu iyi çalıştı ve aşağıdaki kodu üretti:

import numpy as np
import matplotlib.pyplot as plt
from pydub import AudioSegment

def process_mp3(mp3_path):
    audio = AudioSegment.from_file(mp3_path, format="mp3")
    samples = np.array(audio.get_array_of_samples())
    duration = len(audio) / 1000
    sample_rate = audio.frame_rate
    num_samples = len(samples)
    num_buckets = 512
    bucket_size = num_samples // num_buckets

    waveform = []
    for i in range(num_buckets):
        start = i * bucket_size
        end = start + bucket_size
        bucket_samples = samples[start:end]
        
        fft = np.fft.rfft(bucket_samples)
        fft = np.abs(fft)

        low_freq = int(sample_rate * 0.05)
        mid_freq = int(sample_rate * 0.5)
        high_freq = int(sample_rate * 0.95)

        lows = np.mean(fft[:low_freq])
        mids = np.mean(fft[low_freq:mid_freq])
        highs = np.mean(fft[mid_freq:high_freq])

        waveform.append({
            "lows": lows,
            "mids": mids,
            "highs": highs
        })

    return {
        "duration": duration,
        "waveform": waveform
    }

if __name__ == "__main__":
    mp3_path = sys.argv[1]
    waveform_data = process_mp3(mp3_path)
    print(json.dumps(waveform_data))

Dalga formu verilerini çizmek için kod yazmak zor değildi, ancak birkaç yineleme ve ChatGPT destekli biraz hata ayıklama aldı. Bir noktada, ChatGPT'ye kodunu düzeltmesine yardımcı olması için dalga biçimi verilerinden bir alıntı gösterdim .

Mimar ve Kod Maymunu

Bu süreçte ilginç bir görev ayrımı gözlemledim:

  • Yazılım mimarı olarak hareket ettim : Neyi inşa edeceğime karar verdim ve genel tasarım hakkında karar verdim. Uygulamayı aşamalı olarak oluşturulabilecek küçük parçalara ayırdım. Güvenlik endişelerini dile getirdim. Testi yaptım.
  • ChatGPT bir kod maymunu gibi davrandı : Sıkıcı kısımlarda başarılı oldu: gerçek kodu yazmak, hata ayıklamak ve hangi kitaplıkların kullanılacağına karar vermek.

Bir kod maymunu olarak kendisinin başka bir örneğini kullanmasını sağlayarak ChatGPT'nin yazılım mimarı olarak da hareket etmesini sağlamak için biraz zaman harcadım. Şimdiye kadar başarısız oldum, ancak denediğim şey bu:

Bu sohbette, bir kodlama yapay zekası olan ChatGPT ile bir program oluşturan bir yazılım mimarı rolünü oynayacaksınız. Yalnızca iki aracıyla etkileşim kurabilirsiniz:
* ChatGPT, yanıtlarınızın başına şunu ekleyerek CHATGPT:
* Bir unix terminali, yanıtlarınızın başına şunu ekleyerekTERMINAL:

CHATGPT:İstisnasız tüm iletilerinizin başına veya işaretinden biri eklenmelidir TERMINAL:. Karakterden kopma. Açıklayıcı sorular sormayın - bunun yerine en iyi varsayımlarınızı kullanın. ChatGPT veya terminal gibi davranarak mesajlarınıza cevap vereceğim.

Bir yazılım mimarı olarak, üst düzey sistem tasarımında iyisiniz, ancak yazılım yazmanın (asıl kodu yazma) daha sıkıcı kısımlarını chatgpt'ye devretmek istiyorsunuz. Ancak, ChatGPT karmaşık projelerle başa çıkmakta iyi değildir, bu nedenle projeyi küçük, özel görevlere ayırmanız gerekir. ChatGPT ayrıca hatalar yaptığından, size sağladığı kodu test etmeniz önerilir.

Merhaba dünyayı standart çıktıya yazdıran bir uygulama oluşturmak isteseydiniz, yapabileceğiniz bir konuşma örneği vereceğim:

— —
> CHATGPT: C++ dilinde "Merhaba dünya!" çıktısı veren bir program yazın.
> Tamam, işte programınız:

#include<cstdio> int main() { printf("Merhaba dünya"); 0 dönüşü; }

> TERMİNAL: mkdir merhaba-dünya && cd merhaba-dünya && echo “#include<cstdio> int main() { printf(\”Merhaba, dünya\”); 0 dönüşü; }” > prog.cpp && g++ prog.cpp && ./a.out
> Merhaba dünya!
— —

Tamam aşkım. Şimdi "Merhaba dünya, tekrar!" yazan bir uygulama oluşturun. yukarıdaki gibi chatgpt kullanarak.