Giter Site home page Giter Site logo

timeside's Introduction

TimeSide : open web audio processing framework

https://secure.travis-ci.org/yomguy/TimeSide.png?branch=master

TimeSide is a set of python components enabling audio analysis, imaging, transcoding and streaming. Its high-level API is designed to enable complex processing on big media data corpus. Its simple plugin architecture can be adapted to various usecases.

It also includes a smart HTML5 interactive user interface embeddable in any web application to provide various media format playback, on the fly transcoding and streaming, fancy waveforms and spectrograms, various low and high level audio analyzers, semantic labelling and segmentation.

Goals

We just need a python library to:

  • Do asynchronous and fast audio processing with Python,
  • Decode audio frames from ANY format into numpy arrays,
  • Analyze audio content with some state-of-the-art audio feature extraction libraries,
  • Organize, serialize and save analysis metadata through various formats,
  • Draw various fancy waveforms, spectrograms and other cool graphers,
  • Transcode audio data in various media formats and stream them through web apps,
  • Playback and interact on demand through a smart high-level HTML5 extensible player,
  • Index, tag and organize semantic metadata (see Telemeta which embed TimeSide).

Architecture

The streaming architecture of TimeSide relies on 2 main parts: a process engine including various plugin processors written in pure Python and a user interface providing some web based visualization and playback tools in pure HTML5.

https://raw.github.com/yomguy/TimeSide/master/doc/slides/img/timeside_schema.png

Processors

IEncoder

  • VorbisEncoder [gst_vorbis_enc]
  • WavEncoder [gst_wav_enc]
  • Mp3Encoder [gst_mp3_enc]
  • FlacEncoder [gst_flac_enc]
  • AacEncoder [gst_aac_enc]
  • WebMEncoder [gst_webm_enc]

IDecoder

  • FileDecoder [gst_dec]
  • ArrayDecoder [array_dec]

IGrapher

  • Waveform [waveform_simple]
  • WaveformCentroid [waveform_centroid]
  • WaveformTransparent [waveform_transparent]
  • WaveformContourBlack [waveform_contour_black]
  • WaveformContourWhite [waveform_contour_white]
  • SpectrogramLog [spectrogram_log]
  • SpectrogramLinear [spectrogram_lin]

IAnalyzer

  • Level [level]
  • MeanDCShift [mean_dc_shift]
  • AubioTemporal [aubio_temporal]
  • AubioPitch [aubio_pitch]
  • AubioMfcc [aubio_mfcc]
  • AubioMelEnergy [aubio_melenergy]
  • AubioSpecdesc [aubio_specdesc]
  • Yaafe [yaafe]
  • Spectrogram [spectrogram_analyzer]
  • Waveform [waveform_analyzer]
  • VampSimpleHost [vamp_simple_host]
  • IRITSpeechEntropy [irit_speech_entropy]
  • IRITSpeech4Hz [irit_speech_4hz]
  • OnsetDetectionFunction [odf]

News

0.5.2

  • Add a general launch script "timeside-launch" (see "Shell interface")
  • Add some decorators to filter the inputs of processes (see analyzer.waveform for ex)
  • Add a "stack" option to the FileDecoder to accumulate audio data allowing multipass processes
  • Add beat confidence to aubio_temporal
  • Add AAC encoder (gstreamer voaacenc plugin needed)
  • Add UUIDs to the file URI and to all processors
  • Add a Debian repository with all dependencies for i386 and amd64 architectures
  • Fix buggy WebM encoder
  • Fix buggy MP3 muxing
  • Fix various minor bugs

0.5.1

  • Add parent processor list to Processor
  • Simplify and optimize the grapher system
  • Add Grapher abstract generic class
  • Add a UUID property to Processor
  • Add a SpectrogramLinear grapher
  • Add WaveformTransparent grapher
  • Fix some assignment issues regarding immutable type in for Analyzer Result
  • Simplify analyzer results implementation by introducing a Factory and multiple classes and subclasses to handle the 8 different kinds of results
  • Add doctests and improve the unit tests
  • Add a OnsetDetectionFunction analyzer
  • Update documentation
  • Various cleanups
  • Various bugfixes

0.5.0

  • Deep refactoring of the analyzer API to handle various new usecases, specifically audio feature extraction
  • Add serializable global result container (NEW dependency to h5py, json, yaml)
  • Add new audio feature extraction analyzers thanks to the Aubio library providing beat & BPM detection, pitch dectection and other cool stuff (NEW dependency on aubio)
  • Add new audio feature extraction analyzers thanks to the Yaafe library (NEW dependency on yaafe)
  • Add new IRIT speech detection analyzers (NEW dependency on scipy)
  • EXPERIMENTAL : add new audio feature extraction thanks to the VAMP plugin library (NEW dependency on some vamp toold)
  • Add new documentation : http://files.parisson.com/timeside/doc/
  • New Debian repository for instant install
  • Various bugfixes
  • Comptatible with Python >=2.7
  • WARNING : no longer compatible with Telemeta 1.4.5

0.4.5

  • (re)fix Pillow support (#12)
  • fix some Python package rules
  • add a Debian package directory (thanks to piem, in git repo only)

0.4.4

  • Only setup bugfixes
  • Last compatible version with Python 2.6
  • Next version 0.5 will integrate serious new analyzer features (aubio, yaafe and more)

0.4.3

  • finally fix decoder leaks and de-synchronizations (thanks to piem)
  • this also fixes bad variable encoder file lengths
  • fix OGG and FLAC encoders (closes: #8)
  • fix multi-channels streaming (closes: #13)
  • add support for Pillow (closes: #12)
  • temporally desactivate AAC and WebM encoders (need to add some limits for them)
  • WARNING : we now need to add overwrite=True to encoder kwargs instances in order to overwrite the destination file, i.e. e=Mp3Encoder(path, overwrite=True)

0.4.2

  • many releases these days, but there are some patches which are really worth to be HOT released : we just need them in production..
  • finally fix FFT window border leaks in the streaming spectrum process for really better spectrograms and smoother spectral centroid waveforms
  • mv gstutils to timeside.gstutils
  • cleanup various processes
  • Ogg, Aac and Flac encoders not really working now (some frames missing) :( Will be fixed in next release.

0.4.1

  • move UI static files from ui/ to static/timeside/ (for better django compatibility)
  • upgrade js scripts from telemeta 1.4.4
  • upgrade SoundManager2 to v297a-20120916

0.4.0

  • finally fixed an old decoder bug to prevent memory leaks during hard process (thanks to piem)
  • add blocksize property to the processor API
  • add many unit tests (check tests/alltests.py)
  • re-add UI files (sorry, was missing in the last packages)
  • various bugfixes
  • encoders not all much tested on big files, please test!
  • piem is now preparing some aubio analyzers :P

0.3.3

  • mostly a transitional developer and mantainer version, no new cool features
  • but add "ts-waveforms" script for waveform batching
  • fix some tests
  • removed but download audio samples
  • fix setup
  • update README

0.3.2

  • move mainloop to its own thread to avoid memory hogging on large files
  • add condition values to prepare running gst mainloop in a thread
  • add experimental WebM encoder
  • duration analysis goes to decoder.duration property
  • bugfixes

Dive in

Define some processors:

>>> import timeside
>>> decoder  =  timeside.decoder.FileDecoder('sweep.wav')
>>> grapher  =  timeside.grapher.Waveform()
>>> analyzer =  timeside.analyzer.Level()
>>> encoder  =  timeside.encoder.VorbisEncoder('sweep.ogg')

then, the magic pipeline:

>>> (decoder | grapher | analyzer | encoder).run()

get the results:

>>> grapher.render(output='waveform.png')
>>> print 'Level:', analyzer.results

API / Documentation

Install

TimeSide needs some other python modules to run. The following methods explain how to install all dependencies on various Linux based systems.

On Debian, Ubuntu, etc:

$ echo "deb http://debian.parisson.com/debian/ stable main" | sudo tee -a /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install python-timeside

On Fedora and Red-Hat:

$ sudo yum install gcc python python-devel gstreamer pygobject2 \
                  gstreamer-python gstreamer gstreamer-plugins-bad-free \
                  gstreamer-plugins-bad-free-extras \
                  gstreamer-plugins-base gstreamer-plugins-good

$ sudo pip install timeside

Otherwise, you can also install all dependencies and then use pip:

$ sudo pip install timeside

Dependencies

python (>=2.7), python-setuptools, python-gst0.10, gstreamer0.10-plugins-good, gstreamer0.10-gnonlin, gstreamer0.10-plugins-ugly, python-aubio, python-yaafe, python-simplejson, python-yaml, python-h5py, python-scipy, python-matplotlib

Platforms

The TimeSide engine is intended to work on all Unix / Linux platforms. MacOS X and Windows versions will soon be explorated. The player should work on any modern HTML5 enabled browser. Flash is needed for MP3 if the browser doesn't support it.

Shell Interface

Of course, TimeSide can be used in any python environment. But, a shell script is also provided to enable preset based and recursive processing through your command line interface:

$ timeside-launch -h
Usage: scripts/timeside-launch [options] -c file.conf file1.wav [file2.wav ...]
 help: scripts/timeside-launch -h

Options:
 -h, --help            show this help message and exit
 -v, --verbose         be verbose
 -q, --quiet           be quiet
 -C <config_file>, --conf=<config_file>
                       configuration file
 -s <samplerate>, --samplerate=<samplerate>
                       samplerate at which to run the pipeline
 -c <channels>, --channels=<channels>
                       number of channels to run the pipeline with
 -b <blocksize>, --blocksize=<blocksize>
                       blocksize at which to run the pipeline
 -a <analyzers>, --analyzers=<analyzers>
                       analyzers in the pipeline
 -g <graphers>, --graphers=<graphers>
                       graphers in the pipeline
 -e <encoders>, --encoders=<encoders>
                       encoders in the pipeline
 -R <formats>, --results-formats=<formats>
                       list of results output formats for the analyzers
                       results
 -I <formats>, --images-formats=<formats>
                       list of graph output formats for the analyzers results
 -o <outputdir>, --ouput-directory=<outputdir>
                       output directory

Web Interface

TimeSide comes with a smart and pure HTML5 audio player.

Features:
  • embed it in any audio web application
  • stream, playback and download various audio formats on the fly
  • synchronize sound with text, bitmap and vectorial events
  • seek through various semantic, analytic and time synced data
  • fully skinnable with CSS style
Screenshot:
https://raw.github.com/yomguy/TimeSide/master/doc/slides/img/timeside_player_01.png
Examples of the player embeded in the Telemeta open web audio CMS:
Development documentation:
TODO list:
  • embed a light http server to get commands through something like JSON RPC
  • zoom
  • layers

Development

For versions >=0.5 on Debian Stable 7.0 Wheezy:

$ echo "deb http://debian.parisson.com/debian/ stable main" | sudo tee -a /etc/apt/sources.list
$ echo "deb-src http://debian.parisson.com/debian/ stable main" | sudo tee -a /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get build-dep python-timeside

$ git clone https://github.com/yomguy/TimeSide.git
$ cd TimeSide
$ git checkout dev
$ export PYTHONPATH=$PYTHONPATH:`pwd`
$ python tests/run_all_tests

Sponsors and Patners

  • Parisson
  • CNRS (National Center of Science Research, France)
  • Huma-Num (big data equipment for digital humanities, ex TGE Adonis)
  • CREM (french National Center of Ethomusicology Research, France)
  • Université Pierre et Marie Curie (UPMC Paris, France)
  • ANR (CONTINT 2012 project : DIADEMS)
  • MNHN : Museum National d'Histoire Naturelle (Paris, France)

Related projects

Copyrights

  • Copyright (c) 2006, 2013 Parisson SARL
  • Copyright (c) 2006, 2013 Guillaume Pellerin
  • Copyright (c) 2010, 2013 Paul Brossier
  • Copyright (c) 2013 Thomas Fillon
  • Copyright (c) 2006, 2010 Samalyse SARL

License

TimeSide is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.

TimeSide is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

See LICENSE for more details.

timeside's People

Contributors

yomguy avatar piem avatar thomasfillon avatar rizac avatar lecoz avatar

Watchers

James Cloos avatar

timeside's Issues

AttributeError: 'module' object has no attribute 'WaveformJoyDiv'

I apologize in advance if this is not the proper place to report issues or seek 
help. 

What steps will reproduce the problem?
1. Trying to run waveform_batch from latest svn 

What is the expected output? What do you see instead?
Hoping to see png images start to appear in output dir. Instead I see the error 
traceback.

What version of the product are you using? On what operating system?
Latest svn export on ubuntu 10.04

Please provide any additional information below.
ghoffman@ghoffman-ubuntu:~$ python /usr/local/bin/waveform_batch.py 
/home/%USER%/Downloads /home/%USER%/Documents 
Processing  /home/%USER%/Downloads/blind.wav
Traceback (most recent call last):
  File "/usr/local/bin/waveform_batch.py", line 5, in <module>
    pkg_resources.run_script('timeside==0.2', 'waveform_batch.py')
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 461, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 1194, in run_script
    execfile(script_filename, namespace, namespace)
  File "/usr/local/lib/python2.6/dist-packages/timeside-0.2-py2.6.egg/EGG-INFO/scripts/waveform_batch.py", line 120, in <module>
    m.process()
  File "/usr/local/lib/python2.6/dist-packages/timeside-0.2-py2.6.egg/EGG-INFO/scripts/waveform_batch.py", line 95, in process
    waveform = timeside.grapher.WaveformJoyDiv(width=self.width, height=self.height,
AttributeError: 'module' object has no attribute 'WaveformJoyDiv'

I am not sure if I have everything installed correctly or if this is just the 
current state of svn repository. I will try the zip from Jun 18... any 
suggestions?

Original issue reported on code.google.com by [email protected] on 7 Oct 2010 at 8:57

The OGG and FLAC encoders don't work

What steps will reproduce the problem?
1. encode any media to OGG
2. encode any media to FLAC

What is the expected output? What do you see instead?

We should get a transcoded media, but the process hangs.

Please use labels and text to provide additional information.


Original issue reported on code.google.com by yomguyparisson on 8 Jun 2011 at 11:44

Sprectrogram leaks

What steps will reproduce the problem?
1. graph a spectrogram on any sound

What is the expected output? What do you see instead?
Some energy leaks around buffer borders..

Original issue reported on code.google.com by yomguyparisson on 5 Oct 2012 at 7:40

stereo-files end up mono

What steps will reproduce the problem?
1. upload a stereo-file in .wav- or .m4a-format into timeside-using telemeta 
(http://telemeta.org)
2. play resulting audio in telemeta's player
3. sound is mono...
:-(

4. upload a stereo-file in .mp3-format into timeside-using telemeta 
(http://telemeta.org)
5. play resulting audio in telemeta's player
6. sound is in stereo
:-)

7. download a file as .wav, uploaded originally as mp3 in stereo
8. resulting .wav-file is mono
:-(

9. downloading a file as .wav, uploaded originally as .wav in stereo
10. resulting .wav-file is in stereo
:-)

Looks like whenever there is a transcoding going on, stereo is lost.

What is the expected output? What do you see instead?
I want a stereo-audio to remain stereo during playback and download, no matter 
what the original stereo-fileformat... but it doesn't. 

What version of the product are you using? On what operating system?
telemeta 1.4.5, using most recent timeside on a 64bit debian squeeze Linux

Please provide any additional information below.

dummy non-productive testinstallation of telemeta where I came upon these 
issues, with no guarantee of running right now:
http://campusradio.ch/archives/items/

Original issue reported on code.google.com by [email protected] on 8 Jan 2013 at 11:23

Update SoundManager2

TimeSide UI should be upgraded to get last SoundManager2 stable release (2.91) 

Original issue reported on code.google.com by yomguyparisson on 14 Mar 2011 at 2:22

"no audio found!" when trying to decode sweep.mp3

Hi, I'm pretty new to timeside so please excuse me if I overlooked something.

I'm trying to get a visualisation from a list of audio files but I'm failing to 
do so, even using the sweep.mp3 file I go from the tests section on master.

What steps will reproduce the problem?
1. I'm running with Python 2.6 and TimeSide 0.3.1 on a Debian Squeeze
2. My code [0] is pretty straight forward to process a list of audio files
3. The output messages [1] mentions some NoneType value during the waveform 
creation but I think the problem is caused by the first "no audio found" 
message.

[0] http://dpaste.com/hold/783268/
[1] http://dpaste.com/hold/783269/

Am I doing something wrong ? 

Thanks,

Tkm

Original issue reported on code.google.com by [email protected] on 8 Aug 2012 at 2:49

Attachments:

invalid literal for float() when trying to render PNG from audio file

What steps will reproduce the problem?
1. Checkout from trunk -r 215
2. Change WaveformJoyDiv to Waveform on line 95 of 
timeside/tools/waveform_batch.py
3. sudo python setup.py install
4. Follow the "Fast and Short Example"

What is the expected output? What do you see instead?
Hopefully a PNG file is generated

What version of the product are you using? On what operating system?
Timeside trunk @ -r 215 on Ubuntu 10.04

Please provide any additional information below.

Note, I found that you no longer need output='file.png' to grapher.Waveform ... 
here is the output I get now when trying to make a PNG and a MP3

root@ghoffman-ubuntu:/var/www/timeside-trunk# waveform_batch 
/home/ghoffman/Downloads/wav /home/ghoffman/Documents/images/wav
root@ghoffman-ubuntu:/var/www/timeside-trunk# python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeside
>>> decoder = 
timeside.decoder.FileDecoder('/home/ghoffman/Downloads/wav/goodmorningvietnam.wa
v')
>>> grapher = 
timeside.grapher.Waveform('/home/ghoffman/Downloads/wav/goodmorningvietnam.png')

>>> encoder = 
timeside.encoder.Mp3Encoder('/home/ghoffman/Downloads/wav/goodmorningvietnam.mp3
') 
>>> analyzer = timeside.analyzer.MaxLevel()
>>> (decoder | grapher | analyzer | encoder).run()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "timeside/core.py", line 210, in run
    item.setup(last.channels(), last.samplerate(), last.nframes())
  File "timeside/grapher/waveform.py", line 61, in setup
    bg_color=self.bg_color, color_scheme=self.color_scheme)
  File "timeside/grapher/core.py", line 150, in __init__
    self.samples_per_pixel = self.nframes / float(self.image_width)
ValueError: invalid literal for float(): 
/home/ghoffman/Downloads/wav/goodmorningvietnam.png

Original issue reported on code.google.com by [email protected] on 8 Oct 2010 at 11:50

[Support] Web audio project

Hi I want to know if this framework would be fitable for a web-radio station 
builted from scratch or if there more web-friendly audio streaming solutions?

How compliant is this other protocols like shoutcast, videolan, gstreamer, 
phonon, pyaudio and others. 

Regards.

Original issue reported on code.google.com by [email protected] on 2 Aug 2013 at 6:04

If /path/to/audiofile cannot be found, decoder fails silently

What steps will reproduce the problem?
1. decoder  =  timeside.decoder.FileDecoder('/non/existent/file')

What is the expected output? What do you see instead?
The program should fail with an error if the audio file path is invalid

What version of the product are you using? On what operating system?
timeslide/trunk on ubuntu 10.04

Please provide any additional information below.

# changed line 104:121 @ core.py like so

        # is this a file?
        import os.path
    try:
            h_uri = open(uri,"r")
            # get the absolute path
            uri = os.path.abspath(uri)
            # first run the file/uri through the discover pipeline
            self.discover(uri)
            # and make a uri of it
            from urllib import quote
            self.uri = 'file://'+quote(uri)
    except:
            print "unable to open ",uri
            exit(1)
            # if os.path.exists(uri):
            # else:
            # self.uri = uri


Original issue reported on code.google.com by [email protected] on 11 Oct 2010 at 9:13

Update JQuery

TimeSide UI should be upgraded to get last JQuery stable release (0.5.1) 

Original issue reported on code.google.com by yomguyparisson on 14 Mar 2011 at 2:20

Add support for Pillow

Sometimes building PIL does not work so I install Pillow. However with Pillow 
you cannot do

import Image

and have to always do imports like

from PIL import Image

So in timeside/grapher/core.py at line 27 you do the import which breaks when 
PIL is installed via Pillow 
(http://code.google.com/p/timeside/source/browse/timeside/grapher/core.py#27). 
If you can change that to something like the following it might be useful to 
some users:

try:
    import ImageFilter, ImageChops, Image, ImageDraw, ImageColor, ImageEnhance
except ImportError:
    from PIL import ImageFilter, ImageChops, Image, ImageDraw, ImageColor, ImageEnhance

Original issue reported on code.google.com by [email protected] on 12 Dec 2012 at 5:51

attempts to Loop an audio between two markers does not work for some reason.

What steps will reproduce the problem?

this.Timeside.player.addMarker(5)
this.Timeside.player.addMarker(8)
this.Timeside.player.bind("markerCrossed", function(i){
  if(i.index === 1){
    offset = this.Timeside.player.getMarker(1).offset; 
    this.Timeside.player.setSoundPosition(offset);
  };
})

What is the expected output? What do you see instead?
I would expect the audio to loop back to the offset of the first Marker.

What version of the product are you using? On what operating system?
I'm trying out the example in a debugger on 
"http://parisson.telemeta.org/archives/items/PRS_07_04/"



Please provide any additional information below.

Original issue reported on code.google.com by [email protected] on 7 Sep 2012 at 1:08

List of requirements

I believe that there is a great need for a list of requirements, I mean :
software deps, libraries and so on.

The most natural place to do so is an INSTALL file, which should be
modified by any developer who adds a new dependency.

For instance, while testing the new gstreamer encoder and decoder, I have
to figure out by myself which Debian package to install.

Original issue reported on code.google.com by olivier.guilyardi on 24 Feb 2010 at 11:27

The HTML5 player doesn't load if a server has ngx_pagespeed module installed

The HTML5 player doesn't load if a server has ngx_pagespeed module installed.

The following is printed to javascript console:
"Failed to load resource: the server responded with a status of 403 (FORBIDDEN) 
http://mysite.com/admin/player/ruler.js/?_=136870103"

That is because timeside/js/timeside.js incorrectly determines its own location 
in this code:
//is this script ? consider the case here we are loading timeside.js?....
                    if(srcName.replace(/\.js(?:\?[^\?]*)*$/,'.js') == 'timeside.js'){

With ngx_pagespeed, timeside.js is loaded as 
timeside.js.pagespeed.jm.SloTR4PBYw.js, and the regex above is not smart enough 
to recognize that change. Actually, the code in that function is far from 
perfect, it may also fail on URLs like timeside.js?ver=5/15/2013.

The proposed patch improves the recognition of the script path and simplifies 
the code.

Original issue reported on code.google.com by [email protected] on 16 May 2013 at 12:39

Attachments:

background of png file : transparent

What steps will reproduce the problem?
1.On the png image I  would like to see a transparent
background behind the waveform instead of a white color ( RGB = 255,255,255)

What is the expected output? What do you see instead?
I see a white background

What version of the product are you using? On what operating system?
I am using the latest release on TimeSide and on virtualBox

Please provide any additional information below.

Original issue reported on code.google.com by [email protected] on 29 Jun 2010 at 3:40

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.