Giter Club home page Giter Club logo

java-lame's Introduction

Java LAME

This java port of LAME 3.98.4 was created by Ken Händel for his 'jump3r - Java Unofficial MP3 EncodeR' project: http://sourceforge.net/projects/jsidplay2/

Original sources by the authors of LAME: http://www.sourceforge.net/projects/lame

The code is - as the original - licensed under the LGPL (see LICENSE).

How to build

To create a JAR file, you may start the gradle build process with the included gradle wrapper:

$ ./gradlew jar

The resulting library is then to be found in the following directory:

./build/libs/

You can find an already built JAR file in the releases: https://github.com/nwaldispuehl/java-lame/releases

How to publish artifact to local Maven repository for the use in Maven projects

To store the artifact in the local Maven repository (e.g. ~/.m2/repository/) use this task:

$ ./gradlew publishToMavenLocal

It is then present at the expected location, e.g.:

$ ls ~/.m2/repository/net/sourceforge/lame/lame/3.98.4    
lame-3.98.4.jar  lame-3.98.4.module  lame-3.98.4.pom

and can be used in local Maven projects with this signature:

<dependency>
    <groupId>net.sourceforge.lame</groupId>
    <artifactId>lame</artifactId>
    <version>3.98.4</version>
</dependency>

How to publish artifact to Maven Central

If you intend to publish the artifact to Maven Central (https://search.maven.org/) please first adapt the groupId in the build.gradle file to your own domain / projectname. Consult https://docs.gradle.org/current/userguide/publishing_maven.html for how to publish to a Maven repository.

How to run

After having created a JAR file, you certainly can run it as a command line application:

$ cd /build/libs
$ java -jar net.sourceforge.lame-3.98.4.jar

How to run the test

To see the creation of a MP3 file in action one can run the test class LameEncoderTest.java:

$ ./gradlew check

It takes the src/test/resources/test.wav file as input and writes the converted data into build/test.mp3.

How to use Java LAME in a project?

WAV/PCM to MP3

To convert a WAV/PCM byte array to an MP3 byte array, you may use Ken Händels LameEncoder which offers the following convenience method for converting chunks of such byte buffer:

LameEncoder#encodeBuffer(final byte[] pcm, final int pcmOffset, final int pcmLength, final byte[] encoded)

A sample of its use can be found in the LameEncoderTest.java: https://github.com/nwaldispuehl/java-lame/blob/master/src/test/java/net/sourceforge/lame/lowlevel/LameEncoderTest.java

MP3 to WAV/PCM

Analog for decoding; the following method allows for easy conversion of a MP3 file into a PCM byte array:

LameDecoder#decode(final ByteBuffer sampleBuffer)

A sample of its use can be found in the LameDecoderTest.java: https://github.com/nwaldispuehl/java-lame/blob/master/src/test/java/net/sourceforge/lame/lowlevel/LameDecoderTest.java

Credits

Test sound 'Jingle004' (CC BY-NC 3.0) by 'cydon': https://freesound.org/people/cydon/sounds/133054/

java-lame's People

Contributors

nwaldispuehl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

java-lame's Issues

Only hear the noise, the other can not hear

I tried a demo example, want a pcm files into mp3 files, but to convert mp3 files only after the noise, the other could hear nothing, which is why? I think the main AudioFormat a problem here, but could not find the reason, we hope to help answer it.

package test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.sound.sampled.AudioFormat;

import net.sourceforge.lame.lowlevel.LameDecoder;
import net.sourceforge.lame.lowlevel.LameEncoder;
import net.sourceforge.lame.mp3.Lame;
import net.sourceforge.lame.mp3.MPEGMode;

public class main {

public static byte[] encodePcmToMp3(byte[] pcm) throws IOException {

    AudioFormat inputFormat = new AudioFormat(16000, 16, 2, true, true);
    LameEncoder encoder = new LameEncoder(inputFormat, 256,
            MPEGMode.STEREO, Lame.QUALITY_HIGHEST, false);

    ByteArrayOutputStream mp3 = new ByteArrayOutputStream();
    byte[] buffer = new byte[encoder.getPCMBufferSize()];

    int bytesToTransfer = Math.min(buffer.length, pcm.length);
    int bytesWritten;
    int currentPcmPosition = 0;
    while (0 < (bytesWritten = encoder.encodeBuffer(pcm,
            currentPcmPosition, bytesToTransfer, buffer))) {
        currentPcmPosition += bytesToTransfer;
        bytesToTransfer = Math.min(buffer.length, pcm.length
                - currentPcmPosition);
        mp3.write(buffer, 0, bytesWritten);
    }

    FileOutputStream outStream = new FileOutputStream(
            "/Users/vane/Documents/workspace/test/test.mp3");
    mp3.writeTo(outStream);

    encoder.close();
    return mp3.toByteArray();
}

public static void main(String[] args) throws IOException {
    String fileLocation = "/Users/vane/Documents/workspace/test/test.pcm";
    Path path = Paths.get(fileLocation);
    byte[] fileInBytes = java.nio.file.Files.readAllBytes(path);
    encodePcmToMp3(fileInBytes);
}

}

Decoded data = bad sound

Hi, I was able to extract the decoded buffer using the LameDecoder class. However, when I save it to wav the sound is pretty bad, it sounds like half speed and it is all chopped.

The function used to save the wav file works well with other short arrays from other sources, soI am narrowing it down to either a LameDecoder bug or the conversion from byte array to short array.

Can you please advise if I am missing something?

val decoder = LameDecoder(file.path)

val buffer = ByteBuffer.allocate(4608)
val byteArrayOutputStream = ByteArrayOutputStream()

while (decoder.decode(buffer)) {
     byteArrayOutputStream.write(buffer.array())
}

val pcmByteArray = byteArrayOutputStream.toByteArray()

// I think the issue could be in this conversion from byte array to short array
val shortArray = ShortArray(pcmByteArray.size / 2) {
     (pcmByteArray[it * 2] + (pcmByteArray[(it * 2) + 1].toInt() shl 8)).toShort()
}

// convert to wav - this works fine with other short arrays
val wav = Wave(shortArray, 0, shortArray.size)
wav.wroteToFile("teste123.wav")

Crashes on Android

Hi,

I gathered about 600 testers for my app and about 10% of them are experiencing some crashes coming from the java-lame library. They are mostly java.lang.ArrayIndexOutOfBoundsException as per below.
I don't think I can do much on my app side in order to overcome the issues.
Can you please help?

I can enter a separate issue to each crash if you want.

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
src.length=1024 srcPos=0 dst.length=3904 dstPos=3588 length=1024
java.lang.System.arraycopy (System.java)
net.sourceforge.lame.mpg.Interface.copy_mp (Interface.java:148)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:531)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1126)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:96)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=23; index=24
net.sourceforge.lame.mpg.Layer3.III_get_side_info_2 (Layer3.java:582)
net.sourceforge.lame.mpg.Layer3.do_layer3_sideinfo (Layer3.java:1889)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:434)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1101)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:97)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=576; index=576
net.sourceforge.lame.mpg.Layer3.III_i_stereo (Layer3.java:1259)
net.sourceforge.lame.mpg.Layer3.do_layer3 (Layer3.java:2001)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:492)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1126)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:97)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=576; index=576
net.sourceforge.lame.mpg.Layer3.III_dequantize_sample (Layer3.java:919)
net.sourceforge.lame.mpg.Layer3.do_layer3 (Layer3.java:1964)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:492)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1126)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:96)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=44; index=44
net.sourceforge.lame.mpg.Layer3.III_dequantize_sample (Layer3.java:984)
net.sourceforge.lame.mpg.Layer3.do_layer3 (Layer3.java:1985)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:492)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1126)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:97)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=576; index=576
net.sourceforge.lame.mpg.Layer3.III_dequantize_sample (Layer3.java:848)
net.sourceforge.lame.mpg.Layer3.do_layer3 (Layer3.java:1985)
net.sourceforge.lame.mpg.Interface.decodeMP3_clipchoice (Interface.java:492)
net.sourceforge.lame.mpg.Interface.decodeMP3 (Interface.java:577)
net.sourceforge.lame.mpg.MPGLib$2.decode (MPGLib.java:228)
net.sourceforge.lame.mpg.MPGLib.decode1_headersB_clipchoice (MPGLib.java:80)
net.sourceforge.lame.mpg.MPGLib.hip_decode1_headers (MPGLib.java:232)
net.sourceforge.lame.mp3.GetAudio.lame_decode_fromfile (GetAudio.java:1126)
net.sourceforge.lame.mp3.GetAudio.read_samples_mp3 (GetAudio.java:273)
net.sourceforge.lame.mp3.GetAudio.get_audio_common (GetAudio.java:199)
net.sourceforge.lame.mp3.GetAudio.get_audio16 (GetAudio.java:141)
net.sourceforge.lame.lowlevel.LameDecoder.decode (LameDecoder.java:71)
com.ribeirop.drumknee.AudioEngine.PRPlayerNative$loadMp3$1.run (PRPlayerNative.kt:96)

Audio is written twice

Hello,

I tried to follow the provided example, but for some reason mp3 that is created is written twice (i.e. the audio includes the same sound twice).

Would appreciate any advise.
gen

LameEncoder Variable Bitrate

Hey Olze,

I know you just took the port of the MP3 encoding code as is, but I just want to see if you have seen this behaviour. I'm setting the LameEncoder setting for VBR to true but when I play the audio back, it works up to some point and then the player goes bonkers.

Have you seen this behaviour? Or is my code wrong?

-jvt

Encoding failed

Thanks for contributing to the repository. I am also trying to implement it with c# and open source, but there is a problem that has not been solved.

I want to simulate real-time acquisition of pcm, but if the tmpSize is small, the encoded output will be silent. Unless it is set to inputStream.available(), the conversion can be completed successfully. Is there any problem?

this is code

public class Application {

    public static void main(String[] args) throws IOException {
        String pcmFile = "E:/童话镇-1-16-8000.pcm";
        String mp3File = "E:/童话镇-1-16-8000.mp3";
        FileInputStream inputStream = new FileInputStream(pcmFile);
        new File(mp3File).delete();
        int tmpSize=1024;
        byte[] b = new byte[tmpSize];
        FileOutputStream writer = new FileOutputStream(mp3File, true);
        while (inputStream.read(b) > -1) {
            writer.write(encodePcmToMp3(b));
        }
        writer.close();
        inputStream.close();
    }

    public static byte[] encodePcmToMp3(byte[] pcm) {
        LameEncoder encoder = new LameEncoder(new AudioFormat(8000, 16, 1, true, false), 256, MPEGMode.STEREO,
                Lame.QUALITY_HIGHEST, false);

        ByteArrayOutputStream mp3 = new ByteArrayOutputStream();
        byte[] buffer = new byte[encoder.getPCMBufferSize()];

        int bytesToTransfer = Math.min(buffer.length, pcm.length);
        int bytesWritten;
        int currentPcmPosition = 0;
        while (0 < (bytesWritten = encoder.encodeBuffer(pcm, currentPcmPosition, bytesToTransfer, buffer))) {
            currentPcmPosition += bytesToTransfer;
            bytesToTransfer = Math.min(buffer.length, pcm.length - currentPcmPosition);
            mp3.write(buffer, 0, bytesWritten);
        }

        encoder.close();
        return mp3.toByteArray();
    }
}

this is my pcm file:童话镇-1-16-8000.zip

It works!

I use issues to communicate because many developers don't read anything else... :)

Just saying the library works great. Integrated into my language JavaX.

I use it to make MP3s for wit.ai (speech recognition) in my OS.

BTW what's the default bit rate?

Cheers

Screenshot

new lame version?

Hi, is someone able to update to the latest lame version (3.99.5)? and maybe support 64 bit?

can't run in android system

I want to run this method on android system, but it does not support the current classes javax.sound.sampled, but is limited to android.media, so when you run LameEncoder method, whether modified to also be able to javax.soud.sampled support android.media it?

IllegalArgumentException for LameEncoder constructor - MPEGMode lookup case-sensitivity issue

LameEncoder throws an IllegalArgumentException when using the following constructor:

LameEncoder encoder = new LameEncoder(sourceFormat, bitRate, LameEncoder.CHANNEL_MODE_MONO, LameEncoder.QUALITY_LOW, false);

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant mp3.MPEGMode.mono
at java.lang.Enum.valueOf(Enum.java:238)
at lowlevel.LameEncoder.nInitParams(LameEncoder.java:306)
at lowlevel.LameEncoder.setFormat(LameEncoder.java:224)
at lowlevel.LameEncoder.(LameEncoder.java:186)

Decoding example missing

Hi, thank you very much for putting this library together!
I was able to use java-lame to encode the pcm data generated by my app.
Now I would like to decode it back to pcm. Would it be possible to provide some guidance on how to decode an mp3 file? I am struggling to understand how to use the decode(ByteBuffer sampleBuffer) function provided by the LameDecoder.
Not sure if I need to iterate through the samples like the encode one.

I tried the below but the ByteArray has only zeros. I guess I am missing a lot here.

  val file = File(Environment.getExternalStorageDirectory().toString() + "/" + File.separator + "dk_mp3_from_pcm.mp3")

  val decoder = LameDecoder(file.path)

  var byteBuf : ByteBuffer = ByteBuffer.allocate(1000000)
  decoder.decode(byteBuf)
  decoder.close()
  for (byte in byteBuf.array()) {
       Log.d("pwd DK", "pwd byte $byte")
  }

Add stopDecoder function

It would be nice to have a function to stop the decoding process somehow.
I am facing this issue right now.
Use case: User starts playing a song (which could take up to 15 seconds to finish decoding on Android), then chooses a different song a few seconds later.
decoder.close() does not seem to do much in this case.

java.lang.NegativeArraySizeException decoding Mp3

Hi, I'm trying to get the byte array from an Mp3 in order to obtain the amplitudes, to plot the waveform of the audio. To do so I'm using java-lame in the way that is described in the README.md:

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = audioInputStream.getFormat();
byte[] PCMArray = new byte[audioInputStream.available()];
int numReadBytes = audioInputStream.read(PCMArray);
byte[] decodedBytes = encodePcmToMp3(baseFormat, PCMArray);

private byte[] encodePcmToMp3(AudioFormat inputFormat, byte[] pcm) {
          LameEncoder encoder = new LameEncoder(inputFormat, 320, MPEGMode.STEREO, Lame.QUALITY_HIGHEST, false);
          ByteArrayOutputStream mp3 = new ByteArrayOutputStream();
          byte[] buffer = new byte[encoder.getPCMBufferSize()];

          int bytesToTransfer = Math.min(buffer.length, pcm.length);
          int bytesWritten;
          int currentPcmPosition = 0;
          while (0 < (bytesWritten = encoder.encodeBuffer(pcm, currentPcmPosition, bytesToTransfer, buffer))) {
            currentPcmPosition += bytesToTransfer;
            bytesToTransfer = Math.min(buffer.length, pcm.length - currentPcmPosition);

            mp3.write(buffer, 0, bytesWritten);
          }

          encoder.close();
          return mp3.toByteArray();
        }

but It throws me an java.lang.NegativeArraySizeException:

at net.sourceforge.lame.lowlevel.LameEncoder.doEncodeBuffer(LameEncoder.java:228)
at net.sourceforge.lame.lowlevel.LameEncoder.encodeBuffer(LameEncoder.java:304)

can anyone help me with this? Thanks in advance

Example code creates silent MP3 file

Using the example encodePcmToMp3() method documented in the readme, I encode a PCM byte[] and write the returned byte[] to disk.
This ends up creating a mp3 file that is completely silent when played - for instance- with VLC.

BTW, I tried the encoder from the command line with java -jar java-lame-3.98.4.jar and the output mp3 file is perfectly readable so at least the encoder internals seem to be sane. I also noticed that the encoding is much longer when run from the command line.

ArrayIndexOutOfBoundException

hi, thank you for creating this project .
I'm using it to decode mp3 file ,but I don't kown how to use it.

this is my code but there is error,code is below:

FileChannel channel = f.getChannel();
                    int frameSize = decoder.getFrameSize();
                    int channels = decoder.getChannels();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(frameSize );
                    try {
                        while(decoder.decode(byteBuffer)){
                            channel.write(byteBuffer);
                            byteBuffer.flip();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    byteBuffer.clear();
                    try {
                        f.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }`

The erro is

:FATAL EXCEPTION: Thread-1177
java.lang.ArrayIndexOutOfBoundsException: length=1152; index=1152
at net.sourceforge.lame.lowlevel.LameDecoder.decode(LameDecoder.java:82)
at com.missevan.android.mdiamerge.MainActivity$1$1.run(MainActivity.java:74)`

please help me, how should I allocate the ByteBuffer .

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.