Python: Wydaje dźwięk


102

Próbuję sprawić, by program wydawał mi sygnał dźwiękowy. Jestem na komputerze z systemem Windows. Przejrzałem http://docs.python.org/library/winsound.html

Ale nie jestem pewien, jak mogę to zaprogramować za pomocą skanera kodów kreskowych.

Oto mój kod do seryjnego skanera kodów kreskowych.

ser = serial.Serial()
ser.baudrate = 9600

#for windows
ser.port = 2 #for COM3

ser.open()
ser.write('hello')
ser.close()

AKTUALIZACJA: Ponieważ denerwuję moich współpracowników sygnałem dźwiękowym. Czy mogę go podłączyć przez gniazdo audio do słuchawek?


4
Chcesz, aby skaner kodów kreskowych hałasował lub komputer z systemem Windows, do którego jest podłączony?
Setheron

maszyna z systemem Windows. Myślę, że skaner kodów kreskowych zrobi to sam
Marc Brigham

11
Re „Aktualizacja”: Tak, to dobrze znany fakt, że sygnały dźwiękowe są denerwujące :)
jforberg

2
@CharlieParker, ponieważ dźwięk wygranej jest przeznaczony dla systemu Windows. Zamiast tego wydrukuj „\ a”.
noɥʇʎԀʎzɐɹƆ

Odpowiedzi:


155

W systemie Windows, jeśli chcesz, aby komputer wydawał dźwięk:

import winsound
frequency = 2500  # Set Frequency To 2500 Hertz
duration = 1000  # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)

winsound.Beep()Może być stosowany wszędzie tam, gdzie chcesz, aby sygnał występuje.


13
Ten jest fajny:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel

9
Lub def sos(): for i in range(0, 3): winsound.Beep(2000, 100) for i in range(0, 3): winsound.Beep(2000, 400) for i in range(0, 3): winsound.Beep(2000, 100). Powinienem chyba wrócić do pracy teraz: D
Skurmedel

1
W oknach wygrywa. Dźwięki przenoszone są przez okna.
Jakob Bowyer

Jestem na Macu, nie mogę znaleźć tego w pip repo?
Volatil3

ciekawe, nie istnieje w moim środowisku anakondy ... czy to dziwne?
Charlie Parker

131

Aby to zrobić, można to zrobić na różnych platformach print('\a'). Spowoduje to wysłanie znaku dzwonka ASCII na standardowe wyjście i, miejmy nadzieję, wygeneruje sygnał dźwiękowy („alert”). Zwróć uwagę, że wiele nowoczesnych emulatorów terminali zapewnia opcję ignorowania znaków dzwonka.

Ponieważ korzystasz z systemu Windows, z przyjemnością usłyszysz, że system Windows ma własne (przygotuj się) API sygnału dźwiękowego , które umożliwia wysyłanie sygnałów dźwiękowych o dowolnej długości i wysokości. Zauważ, że jest to rozwiązanie tylko dla systemu Windows, więc prawdopodobnie powinieneś preferować, print('\a')chyba że naprawdę zależy ci na hercach i milisekundach.

Dostęp do Beep API można uzyskać za pośrednictwem modułu winsound : http://docs.python.org/library/winsound.html


1
Chociaż zwrócił się specjalnie do systemu Windows, myślę, że jest to ogólnie lepsze rozwiązanie, chyba że interfejs API WinSound zmieni się na \ a dla niezależnego systemu operacyjnego. Istnieje również wiele interfejsów API audio
Setheron

2
Szczerze mówiąc, unikałbym całkowicie odtwarzania sygnałów dźwiękowych z głośników komputera podczas poważnego wysiłku programistycznego. Jeśli rzeczywiście korzysta z systemu Windows, powinien prawdopodobnie spróbować odtworzyć domyślny sygnał „ostrzeżenia” motywu systemowego. Przy odrobinie szczęścia sygnał ten jest dostępny za pośrednictwem dowolnego pakietu GUI, którego używa.
jforberg

1
Jeśli używasz print w aplikacji konsoli, rozważ dodanie end = "", aby zapobiec pojawianiu się nowej linii za każdym razem, gdy usłyszysz sygnał.
Tony

2
@jforberg Winsound to api.MessageBeep, który może zająć MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION i MB_OK.
Peter Wood

2
Jeśli używasz Pythona 3, nie zapomnij użyć nawiasów, w przeciwnym razie pojawi się błąd składni. Użyj print ('\ a')
ZorroDeLaArena

28

Linux.

$ apt-get install beep

$ python
>>> os.system("beep -f 555 -l 460")

LUB

$ beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n -f 784 -l 230 -n -f 659 -l 230 -n -f 988 -l 230 -n -f 1318 -l 230 -n -f 659 -l 110 -n -f 587 -l 230 -n -f 587 -l 110 -n -f 494 -l 230 -n -f 740 -l 230 -n -f 659 -l 460

12
Negocjowane z dwóch powodów: po pierwsze, GNU / Linux! = Debian i apt-get nie są uniwersalne; po drugie, nie powinieneś używać os.system, zamiast tego użyj modułu subprocess.
Ben

1
Jako użytkownik Linuksa próbujący uzyskać prosty i tani sygnał dźwiękowy po zakończeniu długiego kodu, było to zdecydowanie najłatwiejsze rozwiązanie. Szczególnie podobał mi się mały jingle! Zauważ, że może być konieczne wywołanie „sudo modprobe pcspkr” i zainstalowanie sygnału dźwiękowego, zanim ta opcja zadziała, zgodnie z askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh

6
os.systemjest w porządku, zwłaszcza z wartością zakodowaną na stałe, nie każdy pisze serwer WWW.
cz

literówka -f 1047-l, powinno być -f 1047 -l, brak miejsca
bartekbrak

@Ben Stare pytanie, ale fwiw, przegłosowanie tego wydaje się dość trudne. Pytanie dotyczy obszaru bez rozwiązania wieloplatformowego, jak rozumiem. Zaakceptowana odpowiedź z 140 polubieniami dotyczy systemu Windows. I nie wyjaśniasz, dlaczego legalny moduł jest „złą” praktyką.
geoteoria

17

Szukałem tego samego, ale powłoki Linux.

Temat przyniósł mi odpowiedź, -dzięki-

Może bardziej pytoniczny sposób:

import os
beep = lambda x: os.system("echo -n '\a';sleep 0.2;" * x)
beep(3)

Uwagi:

  • wartość uśpienia (tutaj 0,2) zależy od długości (w sekundach) domyślnego sygnału dźwiękowego
  • Zdecydowałem się użyć os.systemraczej niż subprocess.Popendla prostoty (może być źle)
  • „-n” echooznacza, że ​​nie ma więcej wyświetlania
  • ostatni ';' po sleepjest konieczne dla wynikowej sekwencji tekstu (* x)
  • również testowane przez ssh na członie X.

3
Python ma odpowiednik zarówno echo( print), jak i sleep, więc przechodzenie przez zewnętrzne wywołania nie jest w rzeczywistości Pythonem , zwłaszcza gdy są to (nieprzenośne) wywołania systemu Unix.
Eric O Lebigot

co oznacza (3)?
bumbumpaw

11

Jest odpowiedź Windows i odpowiedź Debiana, więc oto odpowiedź na Maca :

Zakłada się, że szukasz szybkiego sposobu na utworzenie dostosowywalnego dźwięku ostrzegawczego, a nie konkretnie sygnału piezeoelektrycznego, który otrzymujesz w systemie Windows:

os.system( "say beep" )

Zastrzeżenie: możesz zastąpić os.systemwezwanie do subprocessmodułu, jeśli martwisz się, że ktoś włamie się do Twojego kodu dźwiękowego.

Zobacz: Jak włączyć dźwięk sprzętowy w systemie Mac OS X 10.6


7

Sposób międzyplatformowy:

import time
import sys
for i in range(1,6):
    sys.stdout.write('\r\a{i}'.format(i=i))
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write('\n')

5
Jedyną ważną częścią tego jestsys.stdout.write('\a')
jstrieb

2
@jstrieb - to mały samodzielny program. Jego znaczenie w samej kompletności.
FooBar167

To nie działa w notebooku
jupyter

1
To powinna być najlepsza odpowiedź
Dwa

3

W tym celu przygotowałem paczkę .

Możesz go używać w ten sposób:

from pybeep.pybeep import PyVibrate, PyBeep
PyVibrate().beep()
PyVibrate().beepn(3)
PyBeep().beep()
PyBeep().beepn(3)

To zależy od sox i obsługuje tylko Python3.


1
Spróbuj zainstalować pip3 pybeep.
okazania

1
Po prostu wiedz, że musisz zainstalować sox. bieg: brew install sox
Jam M. Hernandez Q.

nie działa w systemie Windows Py 3.8
Jamie Isadaddy Rudd

3

Korzystanie pygamena dowolnej platformie

Zaletą używania pygamejest to, że można go uruchomić na dowolnej platformie systemu operacyjnego. Poniższy przykładowy kod dotyczy jednak systemu GNU / Linux .

Najpierw zainstaluj pygamemoduł python3zgodnie z opisem szczegółowo opisanym tutaj .

$ sudo pip3 install pygame

pygameModuł może grać .wavi .oggpliki z dowolnego miejsca pliku. Oto przykład:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()

0

W print('\007') systemie Linux: spowoduje, że dźwięk dzwonka systemowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.