Python - Bagaimana saya bisa memutar suara yang sama beberapa kali tanpa mengganggu satu sama lain?

Saya perlu membuat program di mana file audio akan diputar dan di tengah durasi file audio, file tersebut akan diputar lagi tetapi tidak akan memotong file yang belum selesai sehingga file yang sama akan diputar dua kali sekaligus hanya dengan waktu mulai yang berbeda

Saya sudah mencoba menggunakan beberapa perpustakaan seperti pygame, winound, dan pyglet tetapi sejauh yang saya tahu tidak ada satupun yang mengizinkan ini.

Sunting: Saya sudah mencoba menggunakan pygame lagi tetapi kedengarannya tidak benar. Saya pikir ini karena penundaan dengan pygame

import pygame
import time
import threading

pygame.mixer.pre_init(frequency=44100)
pygame.mixer.init()

sound1 = pygame.mixer.Sound("Assets\\Blip.wav")
sound2 = pygame.mixer.Sound("Assets\\Blip.wav")
print(sound1.get_length())
half = 0.141/2

def play(ch,sound):
    pygame.mixer.Channel(ch).play(sound,loops=-1)

time.sleep(5)
t1 = threading.Thread(target=play,args=(0,sound1,))
t1.start()
time.sleep(half)
play(1,sound2,)

person Twingemios    schedule 06.12.2019    source sumber
comment
karena suara pygame menggunakan thread jadi saya bisa mendengar dua suara meski tanpa menggunakan Thread. Mungkin akan terdengar lebih bagus jika tidak menggunakan Thread. ATAU mungkin kedengarannya tidak bagus karena Anda mengharapkan sesuatu yang tidak bisa dilakukan dengan cara ini. BTW: diuji pada Linux Mint 19.2, Python 3.7.5, PyGame 1.9.6   -  person furas    schedule 07.12.2019


Jawaban (1)


simpleaudio mendukung pemutaran audio secara bersamaan. Kami menggunakan pydub untuk memudahkan akses ke panjang segmen Audio (walaupun Anda bisa mendapatkan yang sama dari audio sederhana dengan sedikit usaha ). Dan pydub juga dapat memutar audio sederhana (yang memberi kita pemutaran bersamaan) menggunakan pydub.playback._play_with_simpleaudio() yang membuat kode lebih mudah.

Berikut ini contoh yang berfungsi. Saya mengambil dua file audio berbeda untuk memeriksa/mengilustrasikan bahwa segmen audio kedua dimulai setelah segmen audio pertama selesai di tengah jalan.

#!/usr/local/bin/python3

from pydub import AudioSegment
from pydub.playback import _play_with_simpleaudio

import threading
import time

def play(sound):
    play_obj = _play_with_simpleaudio(sound)

sound1 = AudioSegment.from_wav("Audio_1.wav")
sound2 = AudioSegment.from_wav("Audio_2.wav")

half = sound1.duration_seconds /2
t1 = threading.Thread(target=play,args=(sound1,))
t1.start()
time.sleep(half)
play(sound2)
time.sleep(1)
person Anil_M    schedule 08.12.2019
comment
Saya mencoba ini tetapi kedua suara tersebut tidak tumpang tindih, sepertinya saling menimpa. - person Twingemios; 09.12.2019
comment
Dalam kasus saya, dua suara saling tumpang tindih. Saya dapat mendengar dua suara berbeda diputar setelah yang pertama setengah jalan. Bahkan dengan file wav yang sama, saya dapat mendengar file wav kedua diputar sementara file wav pertama diputar. time.sleep akan mengontrol berapa lama file kedua diputar. yang dapat diubah menjadi sound2.duration_seconds agar file ke-2 dapat diputar sepenuhnya. Jika tidak, bisakah Anda menjelaskan lebih lanjut tentang kebutuhan Anda? - person Anil_M; 09.12.2019