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?

Marc Brigham
źródło
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.

CyanRook
źródło
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

jforberg
źródło
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

źródło
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.
s4mdf0o1
źródło
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

cz
źródło
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')
FooBar167
źródło
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.

co było do okazania
źródło
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()
Serge Stroobandt
źródło
0

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

Rodrigo
źródło