BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > Python Programlama > Python örnek kodlar > python_ornek00003

Python örnek kodlar

Ses kaydetme programı (sounddevice ve soundfile kütüphaneleri ile)

Sounddevice kütüphanesi ile, mikrofonumuzdan sesi alarak bir NumPy dizisi olarak kaydedebilir ve bu ses verisini WAV formatına dönüştürülebiliriz. Daha sonra, soundfile kütüphanesi ile ses verilerini dosyaya kaydedebiliriz.

Program için aşağıda bilgileri ve sanal ortamda kurulum komutları verilen kütüphaneleri kullanacağız:

1. Sounddevice kütüphanesi

PortAudio kütüphanesi bağlantıları ve fonksiyonlarla ses sinyalleri içeren NumPy dizilerini oynatır ve kaydeder.

SoundFile kütüphanesi ile, mikrofonumuzdan sesi alarak bir NumPy dizisi olarak kaydedebilir ve bu ses verisini WAV formatına dönüştürülebiliriz.


pip install sounddevice

2. SoundFile kütüphanesi

PortAudio kütüphanesi bağlantıları ve fonksiyonlarla ses sinyalleri içeren NumPy dizilerini oynatır ve kaydeder.


pip install SoundFile

Bu kütüphane ile birlikte, cffi ve pycparser kütüphaneleri otomatik olarak yüklenir.

3. NumPy kütüphanesi

NumPy, Python ile dizi hesaplamada kullanılan temel kütüphanedir.


pip install numpy

Aşağıdaki program komut satırından isteğe bağlı olarak tanımlayabileceğimiz 7 farklı argüman alabilir. Hiç argüman tanımlamasak bile, program bu değerlerin bazılarını kendisi tanımlayarak kullanır. Programın komut satırı kullanımı ve tanımlanabilecek argümanlar aşağıda gösterilmektedir


projeadi.py [-h] [-l] [-d DEVICE] [-r SAMPLERATE] [-c CHANNELS] [-t SUBTYPE] [FILENAME]

-h: Program kullanım şekline gösterir.

--list-devices: Ses aygıtlarını listeler ve program sona erer.

--device: Ses aygıtının sayısal ID değeri veya ad.

--samplerate: Örnekleme oranı.

--channels: Giriş kanallarının sayısı.

--subtype: Ses dosyası alt türü.

dosyaadi: Sesin kaydedileceği dosyanın adı.


import argparse
import tempfile
import queue
import sys

import sounddevice as sd
import soundfile as sf
import numpy # NumPy kütüphanesi callback fonksiyonu içinde kullanılmadan yüklemek için
assert numpy # "imported but unused" mesajını  (W0611) engellemek için

def int_or_str(text):
    try:
        return int(text)
    except ValueError:
        return text

parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-l', '--list-devices', action='store_true', help='Ses aygıtlarını listeler ve sona erer')
args, remaining = parser.parse_known_args()

if args.list_devices:
   print(sd.query_devices())
   parser.exit(0)
	
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, parents=[parser])
parser.add_argument('filename', nargs='?', metavar='FILENAME', help='Sesin kaydedileceği dosyanın adı')
parser.add_argument('-d', '--device', type=int_or_str, help='input device(Ses aygıtının sayısal ID değeri veya adı)')
parser.add_argument('-r', '--samplerate', type=int, help='Örnekleme oranı')
parser.add_argument('-c', '--channels', type=int, default=1, help='Giriş kanallarının sayısı')
parser.add_argument('-t', '--subtype', type=str, help='Ses dosyası alt türü(örneğin "PCM_24")')

args = parser.parse_args(remaining)

q = queue.Queue()

def callback(indata, frames, time, status):
    if status:
       print(status, file=sys.stderr)
    q.put(indata.copy())

try:
    if args.samplerate is None: # Örnekleme oranı komut satırından girilmemiş ise
       device_info = sd.query_devices(args.device, 'input')
       args.samplerate = int(device_info['default_samplerate'])
    if args.filename is None: # Dosya adı komut satırından  girilmemiş ise
       args.filename = 'kayit.wav' # Kayıt dosyası adı
	   # args.filename = tempfile.mktemp(prefix='kayit_', suffix='.wav', dir='') # Her defasında farklı dosya adı belirlemek için

    # Kayıttan önce dosya açma
    with sf.SoundFile(args.filename, mode='w', samplerate=args.samplerate, channels=args.channels, subtype=args.subtype) as file:
         with sd.InputStream(samplerate=args.samplerate, device=args.device, channels=args.channels, callback=callback):
              print('Ctrl+C ile kaydı durdurabilirsiniz!')
              while True:
                    file.write(q.get())
except KeyboardInterrupt:
       parser.exit(0)
except Exception as e:
       parser.exit(type(e).__name__ + ': ' + str(e))

Programı çalıştırdığımızda, ses kaydetmeye başlar. Ctrl-C tuş bileşimine bastığımızda, ses kaydı sona erer ve kaydedilen ses verileri bir dosyaya kaydedilir.